Commit 57331b79 authored by Matthew Dempsky's avatar Matthew Dempsky

Revert "cmd/compile: use printer in typefmt, Tconv"

This reverts commit 8fb08933.

Broke go/ast tests.

Change-Id: I5c314cb29731d4bc3a0873af8ebfe376f5faba8a
Reviewed-on: https://go-review.googlesource.com/27923Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
parent 8fb08933
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
package gc package gc
import ( import (
"bytes"
"cmd/internal/obj" "cmd/internal/obj"
"fmt" "fmt"
"strconv" "strconv"
...@@ -529,21 +530,21 @@ var basicnames = []string{ ...@@ -529,21 +530,21 @@ var basicnames = []string{
TBLANK: "blank", TBLANK: "blank",
} }
func (p *printer) typefmt(t *Type, flag FmtFlag) *printer { func typefmt(t *Type, flag FmtFlag) string {
if t == nil { if t == nil {
return p.s("<T>") return "<T>"
} }
if t == bytetype || t == runetype { if t == bytetype || t == runetype {
// in %-T mode collapse rune and byte with their originals. // in %-T mode collapse rune and byte with their originals.
if fmtmode != FTypeId { if fmtmode != FTypeId {
return p.s(sconv(t.Sym, FmtShort)) return sconv(t.Sym, FmtShort)
} }
t = Types[t.Etype] t = Types[t.Etype]
} }
if t == errortype { if t == errortype {
return p.s("error") return "error"
} }
// Unless the 'l' flag was specified, if the type has a name, just print that name. // Unless the 'l' flag was specified, if the type has a name, just print that name.
...@@ -552,21 +553,21 @@ func (p *printer) typefmt(t *Type, flag FmtFlag) *printer { ...@@ -552,21 +553,21 @@ func (p *printer) typefmt(t *Type, flag FmtFlag) *printer {
case FTypeId: case FTypeId:
if flag&FmtShort != 0 { if flag&FmtShort != 0 {
if t.Vargen != 0 { if t.Vargen != 0 {
p.f("%v·%d", sconv(t.Sym, FmtShort), t.Vargen) return fmt.Sprintf("%v·%d", sconv(t.Sym, FmtShort), t.Vargen)
} }
return p.s(sconv(t.Sym, FmtShort)) return sconv(t.Sym, FmtShort)
} }
if flag&FmtUnsigned != 0 { if flag&FmtUnsigned != 0 {
return p.s(sconv(t.Sym, FmtUnsigned)) return sconv(t.Sym, FmtUnsigned)
} }
if t.Sym.Pkg == localpkg && t.Vargen != 0 { if t.Sym.Pkg == localpkg && t.Vargen != 0 {
p.f("%v·%d", t.Sym, t.Vargen) return fmt.Sprintf("%v·%d", t.Sym, t.Vargen)
} }
} }
return p.s(sconv(t.Sym, 0)) return sconv(t.Sym, 0)
} }
if int(t.Etype) < len(basicnames) && basicnames[t.Etype] != "" { if int(t.Etype) < len(basicnames) && basicnames[t.Etype] != "" {
...@@ -574,100 +575,102 @@ func (p *printer) typefmt(t *Type, flag FmtFlag) *printer { ...@@ -574,100 +575,102 @@ func (p *printer) typefmt(t *Type, flag FmtFlag) *printer {
if fmtmode == FErr && (t == idealbool || t == idealstring) { if fmtmode == FErr && (t == idealbool || t == idealstring) {
prefix = "untyped " prefix = "untyped "
} }
return p.s(prefix + basicnames[t.Etype]) return prefix + basicnames[t.Etype]
} }
if fmtmode == FDbg { if fmtmode == FDbg {
fmtmode = 0 fmtmode = 0
p.s(t.Etype.String()).s("-").typefmt(t, flag) str := t.Etype.String() + "-" + typefmt(t, flag)
fmtmode = FDbg fmtmode = FDbg
return p return str
} }
switch t.Etype { switch t.Etype {
case TPTR32, TPTR64: case TPTR32, TPTR64:
if fmtmode == FTypeId && (flag&FmtShort != 0) { if fmtmode == FTypeId && (flag&FmtShort != 0) {
return p.s("*" + Tconv(t.Elem(), FmtShort)) return "*" + Tconv(t.Elem(), FmtShort)
} }
return p.s("*" + t.Elem().String()) return "*" + t.Elem().String()
case TARRAY: case TARRAY:
if t.isDDDArray() { if t.isDDDArray() {
return p.s("[...]" + t.Elem().String()) return "[...]" + t.Elem().String()
} }
p.f("[%d]%v", t.NumElem(), t.Elem()) return fmt.Sprintf("[%d]%v", t.NumElem(), t.Elem())
case TSLICE: case TSLICE:
return p.s("[]" + t.Elem().String()) return "[]" + t.Elem().String()
case TCHAN: case TCHAN:
switch t.ChanDir() { switch t.ChanDir() {
case Crecv: case Crecv:
return p.s("<-chan " + t.Elem().String()) return "<-chan " + t.Elem().String()
case Csend: case Csend:
return p.s("chan<- " + t.Elem().String()) return "chan<- " + t.Elem().String()
} }
if t.Elem() != nil && t.Elem().IsChan() && t.Elem().Sym == nil && t.Elem().ChanDir() == Crecv { if t.Elem() != nil && t.Elem().IsChan() && t.Elem().Sym == nil && t.Elem().ChanDir() == Crecv {
return p.s("chan (" + t.Elem().String() + ")") return "chan (" + t.Elem().String() + ")"
} }
return p.s("chan " + t.Elem().String()) return "chan " + t.Elem().String()
case TMAP: case TMAP:
return p.s("map[" + t.Key().String() + "]" + t.Val().String()) return "map[" + t.Key().String() + "]" + t.Val().String()
case TINTER: case TINTER:
p.s("interface {") var buf bytes.Buffer
buf.WriteString("interface {")
for i, f := range t.Fields().Slice() { for i, f := range t.Fields().Slice() {
if i != 0 { if i != 0 {
p.s(";") buf.WriteString(";")
} }
p.s(" ") buf.WriteString(" ")
switch { switch {
case f.Sym == nil: case f.Sym == nil:
// Check first that a symbol is defined for this type. // Check first that a symbol is defined for this type.
// Wrong interface definitions may have types lacking a symbol. // Wrong interface definitions may have types lacking a symbol.
break break
case exportname(f.Sym.Name): case exportname(f.Sym.Name):
p.s(sconv(f.Sym, FmtShort)) buf.WriteString(sconv(f.Sym, FmtShort))
default: default:
p.s(sconv(f.Sym, FmtUnsigned)) buf.WriteString(sconv(f.Sym, FmtUnsigned))
} }
p.s(Tconv(f.Type, FmtShort)) buf.WriteString(Tconv(f.Type, FmtShort))
} }
if t.NumFields() != 0 { if t.NumFields() != 0 {
p.s(" ") buf.WriteString(" ")
} }
p.s("}") buf.WriteString("}")
return p return buf.String()
case TFUNC: case TFUNC:
var buf bytes.Buffer
if flag&FmtShort != 0 { if flag&FmtShort != 0 {
// no leading func // no leading func
} else { } else {
if t.Recv() != nil { if t.Recv() != nil {
p.s("method") buf.WriteString("method")
p.s(Tconv(t.Recvs(), 0)) buf.WriteString(Tconv(t.Recvs(), 0))
p.s(" ") buf.WriteString(" ")
} }
p.s("func") buf.WriteString("func")
} }
p.s(Tconv(t.Params(), 0)) buf.WriteString(Tconv(t.Params(), 0))
switch t.Results().NumFields() { switch t.Results().NumFields() {
case 0: case 0:
// nothing to do // nothing to do
case 1: case 1:
p.s(" ") buf.WriteString(" ")
p.s(Tconv(t.Results().Field(0).Type, 0)) // struct->field->field's type buf.WriteString(Tconv(t.Results().Field(0).Type, 0)) // struct->field->field's type
default: default:
p.s(" ") buf.WriteString(" ")
p.s(Tconv(t.Results(), 0)) buf.WriteString(Tconv(t.Results(), 0))
} }
return p return buf.String()
case TSTRUCT: case TSTRUCT:
if m := t.StructType().Map; m != nil { if m := t.StructType().Map; m != nil {
...@@ -675,67 +678,68 @@ func (p *printer) typefmt(t *Type, flag FmtFlag) *printer { ...@@ -675,67 +678,68 @@ func (p *printer) typefmt(t *Type, flag FmtFlag) *printer {
// Format the bucket struct for map[x]y as map.bucket[x]y. // Format the bucket struct for map[x]y as map.bucket[x]y.
// This avoids a recursive print that generates very long names. // This avoids a recursive print that generates very long names.
if mt.Bucket == t { if mt.Bucket == t {
return p.s("map.bucket[" + m.Key().String() + "]" + m.Val().String()) return "map.bucket[" + m.Key().String() + "]" + m.Val().String()
} }
if mt.Hmap == t { if mt.Hmap == t {
return p.s("map.hdr[" + m.Key().String() + "]" + m.Val().String()) return "map.hdr[" + m.Key().String() + "]" + m.Val().String()
} }
if mt.Hiter == t { if mt.Hiter == t {
return p.s("map.iter[" + m.Key().String() + "]" + m.Val().String()) return "map.iter[" + m.Key().String() + "]" + m.Val().String()
} }
Yyerror("unknown internal map type") Yyerror("unknown internal map type")
} }
var buf bytes.Buffer
if t.IsFuncArgStruct() { if t.IsFuncArgStruct() {
p.s("(") buf.WriteString("(")
var flag1 FmtFlag var flag1 FmtFlag
if fmtmode == FTypeId || fmtmode == FErr { // no argument names on function signature, and no "noescape"/"nosplit" tags if fmtmode == FTypeId || fmtmode == FErr { // no argument names on function signature, and no "noescape"/"nosplit" tags
flag1 = FmtShort flag1 = FmtShort
} }
for i, f := range t.Fields().Slice() { for i, f := range t.Fields().Slice() {
if i != 0 { if i != 0 {
p.s(", ") buf.WriteString(", ")
} }
p.s(Fldconv(f, flag1)) buf.WriteString(Fldconv(f, flag1))
} }
p.s(")") buf.WriteString(")")
} else { } else {
p.s("struct {") buf.WriteString("struct {")
for i, f := range t.Fields().Slice() { for i, f := range t.Fields().Slice() {
if i != 0 { if i != 0 {
p.s(";") buf.WriteString(";")
} }
p.s(" ") buf.WriteString(" ")
p.s(Fldconv(f, FmtLong)) buf.WriteString(Fldconv(f, FmtLong))
} }
if t.NumFields() != 0 { if t.NumFields() != 0 {
p.s(" ") buf.WriteString(" ")
} }
p.s("}") buf.WriteString("}")
} }
return p return buf.String()
case TFORW: case TFORW:
if t.Sym != nil { if t.Sym != nil {
return p.s("undefined " + t.Sym.String()) return "undefined " + t.Sym.String()
} }
return p.s("undefined") return "undefined"
case TUNSAFEPTR: case TUNSAFEPTR:
return p.s("unsafe.Pointer") return "unsafe.Pointer"
case TDDDFIELD: case TDDDFIELD:
p.f("%v <%v> %v", t.Etype, t.Sym, t.DDDField()) return fmt.Sprintf("%v <%v> %v", t.Etype, t.Sym, t.DDDField())
case Txxx: case Txxx:
return p.s("Txxx") return "Txxx"
} }
// Don't know how to handle - fall back to detailed prints. // Don't know how to handle - fall back to detailed prints.
return p.f("%v <%v> %v", t.Etype, t.Sym, t.Elem()) return fmt.Sprintf("%v <%v> %v", t.Etype, t.Sym, t.Elem())
} }
// Statements which may be rendered with a simplestmt as init. // Statements which may be rendered with a simplestmt as init.
...@@ -1597,8 +1601,6 @@ func Fldconv(f *Field, flag FmtFlag) string { ...@@ -1597,8 +1601,6 @@ func Fldconv(f *Field, flag FmtFlag) string {
// 'h' omit 'func' and receiver from function types, short type names // 'h' omit 'func' and receiver from function types, short type names
// 'u' package name, not prefix (FTypeId mode, sticky) // 'u' package name, not prefix (FTypeId mode, sticky)
func Tconv(t *Type, flag FmtFlag) string { func Tconv(t *Type, flag FmtFlag) string {
var p printer
if t == nil { if t == nil {
return "<T>" return "<T>"
} }
...@@ -1618,7 +1620,7 @@ func Tconv(t *Type, flag FmtFlag) string { ...@@ -1618,7 +1620,7 @@ func Tconv(t *Type, flag FmtFlag) string {
flag |= FmtUnsigned flag |= FmtUnsigned
} }
p.typefmt(t, flag) str := typefmt(t, flag)
if fmtmode == FTypeId && (sf&FmtUnsigned != 0) { if fmtmode == FTypeId && (sf&FmtUnsigned != 0) {
fmtpkgpfx-- fmtpkgpfx--
...@@ -1628,8 +1630,7 @@ func Tconv(t *Type, flag FmtFlag) string { ...@@ -1628,8 +1630,7 @@ func Tconv(t *Type, flag FmtFlag) string {
fmtbody = sb fmtbody = sb
fmtmode = sm fmtmode = sm
t.Trecur-- t.Trecur--
return str
return p.String()
} }
func (n *Node) String() string { func (n *Node) String() string {
......
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