Commit be5deb93 authored by Alan Donovan's avatar Alan Donovan

exp/ssa: omit Function's package name when printing intra-package references.

R=iant
CC=golang-dev
https://golang.org/cl/7307105
parent 83da2014
...@@ -344,6 +344,11 @@ func (f *Function) emit(instr Instruction) Value { ...@@ -344,6 +344,11 @@ func (f *Function) emit(instr Instruction) Value {
// "func@5.32" // an anonymous function // "func@5.32" // an anonymous function
// //
func (f *Function) FullName() string { func (f *Function) FullName() string {
return f.fullName(nil)
}
// Like FullName, but if from==f.Pkg, suppress package qualification.
func (f *Function) fullName(from *Package) string {
// Anonymous? // Anonymous?
if f.Enclosing != nil { if f.Enclosing != nil {
return f.Name_ return f.Name_
...@@ -353,11 +358,20 @@ func (f *Function) FullName() string { ...@@ -353,11 +358,20 @@ func (f *Function) FullName() string {
// Synthetic? // Synthetic?
if f.Pkg == nil { if f.Pkg == nil {
var recvType types.Type
if recv != nil { if recv != nil {
recvType = recv.Type // bridge method
} else {
recvType = f.Params[0].Type() // interface method thunk
}
// TODO(adonovan): print type package-qualified, if NamedType. // TODO(adonovan): print type package-qualified, if NamedType.
return fmt.Sprintf("(%s).%s", recv.Type, f.Name_) // bridge method return fmt.Sprintf("(%s).%s", recvType, f.Name_)
} }
return fmt.Sprintf("(%s).%s", f.Params[0].Type(), f.Name_) // interface method thunk
// "pkg." prefix for cross-package references only.
var pkgQual string
if from != f.Pkg {
pkgQual = f.Pkg.ImportPath + "."
} }
// Declared method? // Declared method?
...@@ -366,11 +380,11 @@ func (f *Function) FullName() string { ...@@ -366,11 +380,11 @@ func (f *Function) FullName() string {
if isPointer(recv.Type) { if isPointer(recv.Type) {
star = "*" star = "*"
} }
return fmt.Sprintf("(%s%s.%s).%s", star, f.Pkg.ImportPath, deref(recv.Type), f.Name_) return fmt.Sprintf("(%s%s%s).%s", star, pkgQual, deref(recv.Type), f.Name_)
} }
// Package-level function. // Package-level function.
return fmt.Sprintf("%s.%s", f.Pkg.ImportPath, f.Name_) return pkgQual + f.Name_
} }
// DumpTo prints to w a human readable "disassembly" of the SSA code of // DumpTo prints to w a human readable "disassembly" of the SSA code of
......
...@@ -20,9 +20,9 @@ func (id Id) String() string { ...@@ -20,9 +20,9 @@ func (id Id) String() string {
} }
// relName returns the name of v relative to i. // relName returns the name of v relative to i.
// In most cases, this is identical to v.Name(), but for cross-package // In most cases, this is identical to v.Name(), but for references to
// references to Functions (including methods) and Globals, the // Functions (including methods) and Globals, the FullName is used
// package-qualified FullName is used instead. // instead, explicitly package-qualified for cross-package references.
// //
func relName(v Value, i Instruction) string { func relName(v Value, i Instruction) string {
switch v := v.(type) { switch v := v.(type) {
...@@ -32,10 +32,7 @@ func relName(v Value, i Instruction) string { ...@@ -32,10 +32,7 @@ func relName(v Value, i Instruction) string {
} }
return v.FullName() return v.FullName()
case *Function: case *Function:
if v.Pkg == nil || v.Pkg == i.Block().Func.Pkg { return v.fullName(i.Block().Func.Pkg)
return v.Name()
}
return v.FullName()
} }
return v.Name() return v.Name()
} }
......
...@@ -204,7 +204,7 @@ type Function struct { ...@@ -204,7 +204,7 @@ type Function struct {
Pos token.Pos // location of the definition Pos token.Pos // location of the definition
Enclosing *Function // enclosing function if anon; nil if global Enclosing *Function // enclosing function if anon; nil if global
Pkg *Package // enclosing package; nil for some synthetic methods Pkg *Package // enclosing package for Go source functions; otherwise nil
Prog *Program // enclosing program Prog *Program // enclosing program
Params []*Parameter Params []*Parameter
FreeVars []*Capture // free variables whose values must be supplied by closure FreeVars []*Capture // free variables whose values must be supplied by closure
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment