Skip to content

Commit 57331b7

Browse files
committed
Revert "cmd/compile: use printer in typefmt, Tconv"
This reverts commit 8fb0893. Broke go/ast tests. Change-Id: I5c314cb29731d4bc3a0873af8ebfe376f5faba8a Reviewed-on: https://go-review.googlesource.com/27923 Reviewed-by: Matthew Dempsky <[email protected]>
1 parent 8fb0893 commit 57331b7

File tree

1 file changed

+67
-66
lines changed
  • src/cmd/compile/internal/gc

1 file changed

+67
-66
lines changed

src/cmd/compile/internal/gc/fmt.go

Lines changed: 67 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package gc
66

77
import (
8+
"bytes"
89
"cmd/internal/obj"
910
"fmt"
1011
"strconv"
@@ -529,21 +530,21 @@ var basicnames = []string{
529530
TBLANK: "blank",
530531
}
531532

532-
func (p *printer) typefmt(t *Type, flag FmtFlag) *printer {
533+
func typefmt(t *Type, flag FmtFlag) string {
533534
if t == nil {
534-
return p.s("<T>")
535+
return "<T>"
535536
}
536537

537538
if t == bytetype || t == runetype {
538539
// in %-T mode collapse rune and byte with their originals.
539540
if fmtmode != FTypeId {
540-
return p.s(sconv(t.Sym, FmtShort))
541+
return sconv(t.Sym, FmtShort)
541542
}
542543
t = Types[t.Etype]
543544
}
544545

545546
if t == errortype {
546-
return p.s("error")
547+
return "error"
547548
}
548549

549550
// Unless the 'l' flag was specified, if the type has a name, just print that name.
@@ -552,190 +553,193 @@ func (p *printer) typefmt(t *Type, flag FmtFlag) *printer {
552553
case FTypeId:
553554
if flag&FmtShort != 0 {
554555
if t.Vargen != 0 {
555-
p.f("%v·%d", sconv(t.Sym, FmtShort), t.Vargen)
556+
return fmt.Sprintf("%v·%d", sconv(t.Sym, FmtShort), t.Vargen)
556557
}
557-
return p.s(sconv(t.Sym, FmtShort))
558+
return sconv(t.Sym, FmtShort)
558559
}
559560

560561
if flag&FmtUnsigned != 0 {
561-
return p.s(sconv(t.Sym, FmtUnsigned))
562+
return sconv(t.Sym, FmtUnsigned)
562563
}
563564

564565
if t.Sym.Pkg == localpkg && t.Vargen != 0 {
565-
p.f("%v·%d", t.Sym, t.Vargen)
566+
return fmt.Sprintf("%v·%d", t.Sym, t.Vargen)
566567
}
567568
}
568569

569-
return p.s(sconv(t.Sym, 0))
570+
return sconv(t.Sym, 0)
570571
}
571572

572573
if int(t.Etype) < len(basicnames) && basicnames[t.Etype] != "" {
573574
prefix := ""
574575
if fmtmode == FErr && (t == idealbool || t == idealstring) {
575576
prefix = "untyped "
576577
}
577-
return p.s(prefix + basicnames[t.Etype])
578+
return prefix + basicnames[t.Etype]
578579
}
579580

580581
if fmtmode == FDbg {
581582
fmtmode = 0
582-
p.s(t.Etype.String()).s("-").typefmt(t, flag)
583+
str := t.Etype.String() + "-" + typefmt(t, flag)
583584
fmtmode = FDbg
584-
return p
585+
return str
585586
}
586587

587588
switch t.Etype {
588589
case TPTR32, TPTR64:
589590
if fmtmode == FTypeId && (flag&FmtShort != 0) {
590-
return p.s("*" + Tconv(t.Elem(), FmtShort))
591+
return "*" + Tconv(t.Elem(), FmtShort)
591592
}
592-
return p.s("*" + t.Elem().String())
593+
return "*" + t.Elem().String()
593594

594595
case TARRAY:
595596
if t.isDDDArray() {
596-
return p.s("[...]" + t.Elem().String())
597+
return "[...]" + t.Elem().String()
597598
}
598-
p.f("[%d]%v", t.NumElem(), t.Elem())
599+
return fmt.Sprintf("[%d]%v", t.NumElem(), t.Elem())
599600

600601
case TSLICE:
601-
return p.s("[]" + t.Elem().String())
602+
return "[]" + t.Elem().String()
602603

603604
case TCHAN:
604605
switch t.ChanDir() {
605606
case Crecv:
606-
return p.s("<-chan " + t.Elem().String())
607+
return "<-chan " + t.Elem().String()
607608

608609
case Csend:
609-
return p.s("chan<- " + t.Elem().String())
610+
return "chan<- " + t.Elem().String()
610611
}
611612

612613
if t.Elem() != nil && t.Elem().IsChan() && t.Elem().Sym == nil && t.Elem().ChanDir() == Crecv {
613-
return p.s("chan (" + t.Elem().String() + ")")
614+
return "chan (" + t.Elem().String() + ")"
614615
}
615-
return p.s("chan " + t.Elem().String())
616+
return "chan " + t.Elem().String()
616617

617618
case TMAP:
618-
return p.s("map[" + t.Key().String() + "]" + t.Val().String())
619+
return "map[" + t.Key().String() + "]" + t.Val().String()
619620

620621
case TINTER:
621-
p.s("interface {")
622+
var buf bytes.Buffer
623+
buf.WriteString("interface {")
622624
for i, f := range t.Fields().Slice() {
623625
if i != 0 {
624-
p.s(";")
626+
buf.WriteString(";")
625627
}
626-
p.s(" ")
628+
buf.WriteString(" ")
627629
switch {
628630
case f.Sym == nil:
629631
// Check first that a symbol is defined for this type.
630632
// Wrong interface definitions may have types lacking a symbol.
631633
break
632634
case exportname(f.Sym.Name):
633-
p.s(sconv(f.Sym, FmtShort))
635+
buf.WriteString(sconv(f.Sym, FmtShort))
634636
default:
635-
p.s(sconv(f.Sym, FmtUnsigned))
637+
buf.WriteString(sconv(f.Sym, FmtUnsigned))
636638
}
637-
p.s(Tconv(f.Type, FmtShort))
639+
buf.WriteString(Tconv(f.Type, FmtShort))
638640
}
639641
if t.NumFields() != 0 {
640-
p.s(" ")
642+
buf.WriteString(" ")
641643
}
642-
p.s("}")
643-
return p
644+
buf.WriteString("}")
645+
return buf.String()
644646

645647
case TFUNC:
648+
var buf bytes.Buffer
646649
if flag&FmtShort != 0 {
647650
// no leading func
648651
} else {
649652
if t.Recv() != nil {
650-
p.s("method")
651-
p.s(Tconv(t.Recvs(), 0))
652-
p.s(" ")
653+
buf.WriteString("method")
654+
buf.WriteString(Tconv(t.Recvs(), 0))
655+
buf.WriteString(" ")
653656
}
654-
p.s("func")
657+
buf.WriteString("func")
655658
}
656-
p.s(Tconv(t.Params(), 0))
659+
buf.WriteString(Tconv(t.Params(), 0))
657660

658661
switch t.Results().NumFields() {
659662
case 0:
660663
// nothing to do
661664

662665
case 1:
663-
p.s(" ")
664-
p.s(Tconv(t.Results().Field(0).Type, 0)) // struct->field->field's type
666+
buf.WriteString(" ")
667+
buf.WriteString(Tconv(t.Results().Field(0).Type, 0)) // struct->field->field's type
665668

666669
default:
667-
p.s(" ")
668-
p.s(Tconv(t.Results(), 0))
670+
buf.WriteString(" ")
671+
buf.WriteString(Tconv(t.Results(), 0))
669672
}
670-
return p
673+
return buf.String()
671674

672675
case TSTRUCT:
673676
if m := t.StructType().Map; m != nil {
674677
mt := m.MapType()
675678
// Format the bucket struct for map[x]y as map.bucket[x]y.
676679
// This avoids a recursive print that generates very long names.
677680
if mt.Bucket == t {
678-
return p.s("map.bucket[" + m.Key().String() + "]" + m.Val().String())
681+
return "map.bucket[" + m.Key().String() + "]" + m.Val().String()
679682
}
680683

681684
if mt.Hmap == t {
682-
return p.s("map.hdr[" + m.Key().String() + "]" + m.Val().String())
685+
return "map.hdr[" + m.Key().String() + "]" + m.Val().String()
683686
}
684687

685688
if mt.Hiter == t {
686-
return p.s("map.iter[" + m.Key().String() + "]" + m.Val().String())
689+
return "map.iter[" + m.Key().String() + "]" + m.Val().String()
687690
}
688691

689692
Yyerror("unknown internal map type")
690693
}
691694

695+
var buf bytes.Buffer
692696
if t.IsFuncArgStruct() {
693-
p.s("(")
697+
buf.WriteString("(")
694698
var flag1 FmtFlag
695699
if fmtmode == FTypeId || fmtmode == FErr { // no argument names on function signature, and no "noescape"/"nosplit" tags
696700
flag1 = FmtShort
697701
}
698702
for i, f := range t.Fields().Slice() {
699703
if i != 0 {
700-
p.s(", ")
704+
buf.WriteString(", ")
701705
}
702-
p.s(Fldconv(f, flag1))
706+
buf.WriteString(Fldconv(f, flag1))
703707
}
704-
p.s(")")
708+
buf.WriteString(")")
705709
} else {
706-
p.s("struct {")
710+
buf.WriteString("struct {")
707711
for i, f := range t.Fields().Slice() {
708712
if i != 0 {
709-
p.s(";")
713+
buf.WriteString(";")
710714
}
711-
p.s(" ")
712-
p.s(Fldconv(f, FmtLong))
715+
buf.WriteString(" ")
716+
buf.WriteString(Fldconv(f, FmtLong))
713717
}
714718
if t.NumFields() != 0 {
715-
p.s(" ")
719+
buf.WriteString(" ")
716720
}
717-
p.s("}")
721+
buf.WriteString("}")
718722
}
719-
return p
723+
return buf.String()
720724

721725
case TFORW:
722726
if t.Sym != nil {
723-
return p.s("undefined " + t.Sym.String())
727+
return "undefined " + t.Sym.String()
724728
}
725-
return p.s("undefined")
729+
return "undefined"
726730

727731
case TUNSAFEPTR:
728-
return p.s("unsafe.Pointer")
732+
return "unsafe.Pointer"
729733

730734
case TDDDFIELD:
731-
p.f("%v <%v> %v", t.Etype, t.Sym, t.DDDField())
735+
return fmt.Sprintf("%v <%v> %v", t.Etype, t.Sym, t.DDDField())
732736

733737
case Txxx:
734-
return p.s("Txxx")
738+
return "Txxx"
735739
}
736740

737741
// Don't know how to handle - fall back to detailed prints.
738-
return p.f("%v <%v> %v", t.Etype, t.Sym, t.Elem())
742+
return fmt.Sprintf("%v <%v> %v", t.Etype, t.Sym, t.Elem())
739743
}
740744

741745
// Statements which may be rendered with a simplestmt as init.
@@ -1597,8 +1601,6 @@ func Fldconv(f *Field, flag FmtFlag) string {
15971601
// 'h' omit 'func' and receiver from function types, short type names
15981602
// 'u' package name, not prefix (FTypeId mode, sticky)
15991603
func Tconv(t *Type, flag FmtFlag) string {
1600-
var p printer
1601-
16021604
if t == nil {
16031605
return "<T>"
16041606
}
@@ -1618,7 +1620,7 @@ func Tconv(t *Type, flag FmtFlag) string {
16181620
flag |= FmtUnsigned
16191621
}
16201622

1621-
p.typefmt(t, flag)
1623+
str := typefmt(t, flag)
16221624

16231625
if fmtmode == FTypeId && (sf&FmtUnsigned != 0) {
16241626
fmtpkgpfx--
@@ -1628,8 +1630,7 @@ func Tconv(t *Type, flag FmtFlag) string {
16281630
fmtbody = sb
16291631
fmtmode = sm
16301632
t.Trecur--
1631-
1632-
return p.String()
1633+
return str
16331634
}
16341635

16351636
func (n *Node) String() string {

0 commit comments

Comments
 (0)