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:
parent
31c2077fe3
commit
b419465131
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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, "")
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user