1
0
mirror of https://github.com/golang/go synced 2024-11-23 05:20:11 -07:00

cmd/internal/gc, cmd/go: fix value of importpath symbol

In https://golang.org/cl/7797 I attempted to use myimportpath to set the value
of the go.importpath.$foo. symbol for the module being compiled, but I messed
it up and only set the name (which the linker rewrites anyway). This lead to
the importpath for the module being compiled being "". This was hard to notice,
because all modules that import another define the importpath for their
imported modules correctly -- but main is not imported, and this meant that the
reflect module saw all fields of all types defined in the main module as
exported.

The fix is to do what I meant to do the first time, add a test and change the
go tool to compile main packages with -p main and not -p
command-line-arguments.

Fixes #10332

Change-Id: I5fc6e9b1dc2b26f058641e382f9a56a526eca291
Reviewed-on: https://go-review.googlesource.com/8481
Reviewed-by: Russ Cox <rsc@golang.org>
This commit is contained in:
Michael Hudson-Doyle 2015-04-05 14:48:42 +12:00 committed by Russ Cox
parent 757f21fd6f
commit b92a0a8969
3 changed files with 35 additions and 8 deletions

View File

@ -1851,6 +1851,9 @@ func (gcToolchain) gc(b *builder, p *Package, archive, obj string, asmhdr bool,
}
gcargs := []string{"-p", p.ImportPath}
if p.Name == "main" {
gcargs[1] = "main"
}
if p.Standard && p.ImportPath == "runtime" {
// runtime compiles with a special 6g flag to emit
// additional reflect type data.

View File

@ -484,13 +484,7 @@ func dimportpath(p *Pkg) {
dimportpath_gopkg.Name = "go"
}
var nam string
if p == localpkg {
// Note: myimportpath != "", or else dgopkgpath won't call dimportpath.
nam = "importpath." + pathtoprefix(myimportpath) + "."
} else {
nam = "importpath." + p.Prefix + "."
}
nam := "importpath." + p.Prefix + "."
n := Nod(ONAME, nil, nil)
n.Sym = Pkglookup(nam, dimportpath_gopkg)
@ -499,7 +493,12 @@ func dimportpath(p *Pkg) {
n.Xoffset = 0
p.Pathsym = n.Sym
if p == localpkg {
// Note: myimportpath != "", or else dgopkgpath won't call dimportpath.
gdatastring(n, myimportpath)
} else {
gdatastring(n, p.Path)
}
ggloblsym(n.Sym, int32(Types[TSTRING].Width), obj.DUPOK|obj.RODATA)
}

View File

@ -0,0 +1,25 @@
// run
// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// The PkgPath of unexported fields of types defined in package main was incorrectly ""
package main
import (
"fmt"
"reflect"
)
type foo struct {
bar int
}
func main() {
pkgpath := reflect.ValueOf(foo{}).Type().Field(0).PkgPath
if pkgpath != "main" {
fmt.Printf("BUG: incorrect PkgPath: %v", pkgpath)
}
}