1
0
mirror of https://github.com/golang/go synced 2024-11-18 16:34:51 -07:00

go.tools/go/ssa: print types package-relative in all instructions.

It was missing from the four conversions and the Make* instructions.

(Experiments with pure bytes.Buffer-based printing were not faster; various TODOs removed.)

LGTM=crawshaw
R=gri, crawshaw
CC=golang-codereviews
https://golang.org/cl/58040043
This commit is contained in:
Alan Donovan 2014-07-31 16:29:47 -04:00
parent 31c2077fe3
commit b419465131
3 changed files with 43 additions and 44 deletions

View File

@ -313,7 +313,7 @@ func init():
} }
if initbuf.String() != test.want { if initbuf.String() != test.want {
t.Errorf("test 'package %s': got %q, want %q", f.Name.Name, initbuf.String(), test.want) t.Errorf("test 'package %s': got %s, want %s", f.Name.Name, initbuf.String(), test.want)
} }
} }
} }

View File

@ -500,7 +500,7 @@ func (f *Function) relMethod(from *types.Package, recv types.Type) string {
} }
// writeSignature writes to buf the signature sig in declaration syntax. // writeSignature writes to buf the signature sig in declaration syntax.
func writeSignature(buf *bytes.Buffer, pkg *types.Package, name string, sig *types.Signature, params []*Parameter) { func writeSignature(buf *bytes.Buffer, from *types.Package, name string, sig *types.Signature, params []*Parameter) {
buf.WriteString("func ") buf.WriteString("func ")
if recv := sig.Recv(); recv != nil { if recv := sig.Recv(); recv != nil {
buf.WriteString("(") buf.WriteString("(")
@ -508,11 +508,11 @@ func writeSignature(buf *bytes.Buffer, pkg *types.Package, name string, sig *typ
buf.WriteString(n) buf.WriteString(n)
buf.WriteString(" ") buf.WriteString(" ")
} }
buf.WriteString(relType(params[0].Type(), pkg)) types.WriteType(buf, from, params[0].Type())
buf.WriteString(") ") buf.WriteString(") ")
} }
buf.WriteString(name) buf.WriteString(name)
types.WriteSignature(buf, pkg, sig) types.WriteSignature(buf, from, sig)
} }
func (f *Function) pkgobj() *types.Package { func (f *Function) pkgobj() *types.Package {
@ -552,22 +552,22 @@ func WriteFunction(buf *bytes.Buffer, f *Function) {
fmt.Fprintf(buf, "# Recover: %s\n", f.Recover) fmt.Fprintf(buf, "# Recover: %s\n", f.Recover)
} }
pkgobj := f.pkgobj() from := f.pkgobj()
if f.FreeVars != nil { if f.FreeVars != nil {
buf.WriteString("# Free variables:\n") buf.WriteString("# Free variables:\n")
for i, fv := range f.FreeVars { for i, fv := range f.FreeVars {
fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, fv.Name(), relType(fv.Type(), pkgobj)) fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, fv.Name(), relType(fv.Type(), from))
} }
} }
if len(f.Locals) > 0 { if len(f.Locals) > 0 {
buf.WriteString("# Locals:\n") buf.WriteString("# Locals:\n")
for i, l := range f.Locals { for i, l := range f.Locals {
fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, l.Name(), relType(deref(l.Type()), pkgobj)) fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, l.Name(), relType(deref(l.Type()), from))
} }
} }
writeSignature(buf, pkgobj, f.Name(), f.Signature, f.Params) writeSignature(buf, from, f.Name(), f.Signature, f.Params)
buf.WriteString(":\n") buf.WriteString(":\n")
if f.Blocks == nil { if f.Blocks == nil {
@ -606,7 +606,7 @@ func WriteFunction(buf *bytes.Buffer, f *Function) {
// Right-align the type if there's space. // Right-align the type if there's space.
if t := v.Type(); t != nil { if t := v.Type(); t != nil {
buf.WriteByte(' ') buf.WriteByte(' ')
ts := relType(t, pkgobj) ts := relType(t, from)
l -= len(ts) + len(" ") // (spaces before and after type) l -= len(ts) + len(" ") // (spaces before and after type)
if l > 0 { if l > 0 {
fmt.Fprintf(buf, "%*s", l, "") fmt.Fprintf(buf, "%*s", l, "")

View File

@ -7,9 +7,6 @@ package ssa
// This file implements the String() methods for all Value and // This file implements the String() methods for all Value and
// Instruction types. // Instruction types.
// TODO(adonovan): define WriteValue(*bytes.Buffer) and avoid creation
// of garbage.
import ( import (
"bytes" "bytes"
"fmt" "fmt"
@ -60,11 +57,13 @@ func relString(m Member, from *types.Package) string {
// It never appears in disassembly, which uses Value.Name(). // It never appears in disassembly, which uses Value.Name().
func (v *Parameter) String() string { func (v *Parameter) String() string {
return fmt.Sprintf("parameter %s : %s", v.Name(), v.Type()) from := v.Parent().pkgobj()
return fmt.Sprintf("parameter %s : %s", v.Name(), relType(v.Type(), from))
} }
func (v *FreeVar) String() string { func (v *FreeVar) String() string {
return fmt.Sprintf("freevar %s : %s", v.Name(), v.Type()) from := v.Parent().pkgobj()
return fmt.Sprintf("freevar %s : %s", v.Name(), relType(v.Type(), from))
} }
func (v *Builtin) String() string { func (v *Builtin) String() string {
@ -78,7 +77,8 @@ func (v *Alloc) String() string {
if v.Heap { if v.Heap {
op = "new" op = "new"
} }
return fmt.Sprintf("%s %s (%s)", op, relType(deref(v.Type()), v.Parent().pkgobj()), v.Comment) from := v.Parent().pkgobj()
return fmt.Sprintf("%s %s (%s)", op, relType(deref(v.Type()), from), v.Comment)
} }
func (v *Phi) String() string { func (v *Phi) String() string {
@ -138,10 +138,6 @@ func (v *Call) String() string {
return printCall(&v.Call, "", v) return printCall(&v.Call, "", v)
} }
func (v *ChangeType) String() string {
return fmt.Sprintf("changetype %s <- %s (%s)", relType(v.Type(), v.Parent().pkgobj()), v.X.Type(), relName(v.X, v))
}
func (v *BinOp) String() string { func (v *BinOp) String() string {
return fmt.Sprintf("%s %s %s", relName(v.X, v), v.Op.String(), relName(v.Y, v)) return fmt.Sprintf("%s %s %s", relName(v.X, v), v.Op.String(), relName(v.Y, v))
} }
@ -150,17 +146,19 @@ func (v *UnOp) String() string {
return fmt.Sprintf("%s%s%s", v.Op, relName(v.X, v), commaOk(v.CommaOk)) return fmt.Sprintf("%s%s%s", v.Op, relName(v.X, v), commaOk(v.CommaOk))
} }
func (v *Convert) String() string { func printConv(prefix string, v, x Value) string {
return fmt.Sprintf("convert %s <- %s (%s)", relType(v.Type(), v.Parent().pkgobj()), v.X.Type(), relName(v.X, v)) from := v.Parent().pkgobj()
return fmt.Sprintf("%s %s <- %s (%s)",
prefix,
relType(v.Type(), from),
relType(x.Type(), from),
relName(x, v.(Instruction)))
} }
func (v *ChangeInterface) String() string { func (v *ChangeType) String() string { return printConv("changetype", v, v.X) }
return fmt.Sprintf("change interface %s <- %s (%s)", v.Type(), v.X.Type(), relName(v.X, v)) func (v *Convert) String() string { return printConv("convert", v, v.X) }
} func (v *ChangeInterface) String() string { return printConv("change interface", v, v.X) }
func (v *MakeInterface) String() string { return printConv("make", v, v.X) }
func (v *MakeInterface) String() string {
return fmt.Sprintf("make %s <- %s (%s)", relType(v.Type(), v.Parent().pkgobj()), relType(v.X.Type(), v.Parent().pkgobj()), relName(v.X, v))
}
func (v *MakeClosure) String() string { func (v *MakeClosure) String() string {
var b bytes.Buffer var b bytes.Buffer
@ -179,14 +177,11 @@ func (v *MakeClosure) String() string {
} }
func (v *MakeSlice) String() string { func (v *MakeSlice) String() string {
var b bytes.Buffer from := v.Parent().pkgobj()
b.WriteString("make ") return fmt.Sprintf("make %s %s %s",
b.WriteString(v.Type().String()) relType(v.Type(), from),
b.WriteString(" ") relName(v.Len, v),
b.WriteString(relName(v.Len, v)) relName(v.Cap, v))
b.WriteString(" ")
b.WriteString(relName(v.Cap, v))
return b.String()
} }
func (v *Slice) String() string { func (v *Slice) String() string {
@ -214,11 +209,13 @@ func (v *MakeMap) String() string {
if v.Reserve != nil { if v.Reserve != nil {
res = relName(v.Reserve, v) res = relName(v.Reserve, v)
} }
return fmt.Sprintf("make %s %s", v.Type(), res) from := v.Parent().pkgobj()
return fmt.Sprintf("make %s %s", relType(v.Type(), from), res)
} }
func (v *MakeChan) String() string { func (v *MakeChan) String() string {
return fmt.Sprintf("make %s %s", v.Type(), relName(v.Size, v)) from := v.Parent().pkgobj()
return fmt.Sprintf("make %s %s", relType(v.Type(), from), relName(v.Size, v))
} }
func (v *FieldAddr) String() string { func (v *FieldAddr) String() string {
@ -262,7 +259,8 @@ func (v *Next) String() string {
} }
func (v *TypeAssert) String() string { func (v *TypeAssert) String() string {
return fmt.Sprintf("typeassert%s %s.(%s)", commaOk(v.CommaOk), relName(v.X, v), relType(v.AssertedType, v.Parent().pkgobj())) from := v.Parent().pkgobj()
return fmt.Sprintf("typeassert%s %s.(%s)", commaOk(v.CommaOk), relName(v.X, v), relType(v.AssertedType, from))
} }
func (v *Extract) String() string { func (v *Extract) String() string {
@ -393,27 +391,28 @@ func WritePackage(buf *bytes.Buffer, p *Package) {
names = append(names, name) names = append(names, name)
} }
from := p.Object
sort.Strings(names) sort.Strings(names)
for _, name := range names { for _, name := range names {
switch mem := p.Members[name].(type) { switch mem := p.Members[name].(type) {
case *NamedConst: case *NamedConst:
fmt.Fprintf(buf, " const %-*s %s = %s\n", fmt.Fprintf(buf, " const %-*s %s = %s\n",
maxname, name, mem.Name(), mem.Value.RelString(p.Object)) maxname, name, mem.Name(), mem.Value.RelString(from))
case *Function: case *Function:
fmt.Fprintf(buf, " func %-*s %s\n", fmt.Fprintf(buf, " func %-*s %s\n",
maxname, name, types.TypeString(p.Object, mem.Type())) maxname, name, relType(mem.Type(), from))
case *Type: case *Type:
fmt.Fprintf(buf, " type %-*s %s\n", fmt.Fprintf(buf, " type %-*s %s\n",
maxname, name, types.TypeString(p.Object, mem.Type().Underlying())) maxname, name, relType(mem.Type().Underlying(), from))
for _, meth := range typeutil.IntuitiveMethodSet(mem.Type(), &p.Prog.MethodSets) { for _, meth := range typeutil.IntuitiveMethodSet(mem.Type(), &p.Prog.MethodSets) {
fmt.Fprintf(buf, " %s\n", types.SelectionString(p.Object, meth)) fmt.Fprintf(buf, " %s\n", types.SelectionString(from, meth))
} }
case *Global: case *Global:
fmt.Fprintf(buf, " var %-*s %s\n", fmt.Fprintf(buf, " var %-*s %s\n",
maxname, name, types.TypeString(p.Object, mem.Type().(*types.Pointer).Elem())) maxname, name, relType(mem.Type().(*types.Pointer).Elem(), from))
} }
} }