From fbec762f837dc349b73d1eaa820552e2ad177942 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Wed, 10 Jan 2018 12:46:33 -0800 Subject: [PATCH] go/internal/gccgoimporter: parse optional escape info in export data This is a copy of https://go-review.googlesource.com/c/go/+/86977 and brings those changes into the x/tools repo. It also includes a minor change to parser.go that was done via https://go-review.googlesource.com/37839 but that wasn't brought over. For golang/go#23324. Change-Id: I84b7cf134fec250ac340e404802158860cb3c630 Reviewed-on: https://go-review.googlesource.com/87295 Reviewed-by: Cherry Zhang --- go/internal/gccgoimporter/importer_test.go | 1 + go/internal/gccgoimporter/parser.go | 10 +++++++++- go/internal/gccgoimporter/testdata/escapeinfo.go | 13 +++++++++++++ go/internal/gccgoimporter/testdata/escapeinfo.gox | Bin 0 -> 824 bytes 4 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 go/internal/gccgoimporter/testdata/escapeinfo.go create mode 100644 go/internal/gccgoimporter/testdata/escapeinfo.gox diff --git a/go/internal/gccgoimporter/importer_test.go b/go/internal/gccgoimporter/importer_test.go index 87b5ff2a..2c6f1cb4 100644 --- a/go/internal/gccgoimporter/importer_test.go +++ b/go/internal/gccgoimporter/importer_test.go @@ -104,6 +104,7 @@ var importerTests = []importerTest{ {pkgpath: "unicode", name: "IsUpper", want: "func IsUpper(r rune) bool"}, {pkgpath: "unicode", name: "MaxRune", want: "const MaxRune untyped rune", wantval: "1114111"}, {pkgpath: "imports", wantinits: []string{"imports..import", "fmt..import", "math..import"}}, + {pkgpath: "escapeinfo", name: "NewT", want: "func NewT(data []byte) *T"}, } func TestGoxImporter(t *testing.T) { diff --git a/go/internal/gccgoimporter/parser.go b/go/internal/gccgoimporter/parser.go index 08e3bb99..9e20df0e 100644 --- a/go/internal/gccgoimporter/parser.go +++ b/go/internal/gccgoimporter/parser.go @@ -228,6 +228,14 @@ func (p *parser) parseField(pkg *types.Package) (field *types.Var, tag string) { // Param = Name ["..."] Type . func (p *parser) parseParam(pkg *types.Package) (param *types.Var, isVariadic bool) { name := p.parseName() + if p.tok == '<' && p.scanner.Peek() == 'e' { + // EscInfo = "" . (optional and ignored) + p.next() + p.expectKeyword("esc") + p.expect(':') + p.expect(scanner.Int) + p.expect('>') + } if p.tok == '.' { p.next() p.expect('.') @@ -741,7 +749,7 @@ func (p *parser) discardDirectiveWhileParsingTypes(pkg *types.Package) { case ';': return case '<': - p.parseType(p.pkg) + p.parseType(pkg) case scanner.EOF: p.error("unexpected EOF") default: diff --git a/go/internal/gccgoimporter/testdata/escapeinfo.go b/go/internal/gccgoimporter/testdata/escapeinfo.go new file mode 100644 index 00000000..103ad954 --- /dev/null +++ b/go/internal/gccgoimporter/testdata/escapeinfo.go @@ -0,0 +1,13 @@ +// Test case for escape info in export data. To compile and extract .gox file: +// gccgo -fgo-optimize-allocs -c escapeinfo.go +// objcopy -j .go_export escapeinfo.o escapeinfo.gox + +package escapeinfo + +type T struct{ data []byte } + +func NewT(data []byte) *T { + return &T{data} +} + +func (*T) Read(p []byte) {} diff --git a/go/internal/gccgoimporter/testdata/escapeinfo.gox b/go/internal/gccgoimporter/testdata/escapeinfo.gox new file mode 100644 index 0000000000000000000000000000000000000000..1db81562c1d74a34f1739fd1bf1ac5dd269502d8 GIT binary patch literal 824 zcmb7CO;5r=6kI?P?aiBsmlqBOOl-DYON%8drk0cOV7M7IYgs-*fTk@7F~+~*Ptt$m z(QR31slB+DH#0kL-pjTh?ro=BDxu9OA&OGAQ4#vdi0wpfqkXi87P_tY%p0=-2OfIN z=c8$VCbWR}M@tyQ@Xxi7)zrMpY^6V+dT_^IyHM+~h(Rk_`5ZKOc$Dy5$CTD3(cx@u zAW-dArFa2h6wJK{-ay@%rDhV1T%rx{RDooA?MenUw(0T2d(L`L^Pwe{zr;(8N|%{S zs@n>swvy~EmlM<*a&H{YCqN90En;Z|n-*~}Hk!^2b}Y@%%}xWmO_NwIxprJzN#DN+ zRSLh98m=Z0dqJvrf^{8k&|vn=m;Nk>iqih4od|p8m)JJ9C3?zT=4jGe-gc$nQyQ_9 mDx$`|1IdqNJrp&*%bzdVUo