From 6697aa58aef7f15c143f9af6878f1f4e406a6576 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Tue, 9 Jan 2018 10:28:29 -0800 Subject: [PATCH] go/internal/gccgoimporter: parse optional escape info in export data Fixes #23324. Change-Id: Ie2383bad35f0bcc1344a8a1683be08d5fd0eea96 Reviewed-on: https://go-review.googlesource.com/86977 Reviewed-by: Ian Lance Taylor Reviewed-by: Cherry Zhang --- src/go/internal/gccgoimporter/importer_test.go | 1 + src/go/internal/gccgoimporter/parser.go | 8 ++++++++ .../internal/gccgoimporter/testdata/escapeinfo.go | 13 +++++++++++++ .../gccgoimporter/testdata/escapeinfo.gox | Bin 0 -> 824 bytes 4 files changed, 22 insertions(+) create mode 100644 src/go/internal/gccgoimporter/testdata/escapeinfo.go create mode 100644 src/go/internal/gccgoimporter/testdata/escapeinfo.gox diff --git a/src/go/internal/gccgoimporter/importer_test.go b/src/go/internal/gccgoimporter/importer_test.go index 26f5d9f5b7..01ab47a445 100644 --- a/src/go/internal/gccgoimporter/importer_test.go +++ b/src/go/internal/gccgoimporter/importer_test.go @@ -102,6 +102,7 @@ var importerTests = [...]importerTest{ {pkgpath: "unicode", name: "MaxRune", want: "const MaxRune untyped rune", wantval: "1114111"}, {pkgpath: "imports", wantinits: []string{"imports..import", "fmt..import", "math..import"}}, {pkgpath: "alias", name: "IntAlias2", want: "type IntAlias2 = Int"}, + {pkgpath: "escapeinfo", name: "NewT", want: "func NewT(data []byte) *T"}, } func TestGoxImporter(t *testing.T) { diff --git a/src/go/internal/gccgoimporter/parser.go b/src/go/internal/gccgoimporter/parser.go index 8a1ad5ff07..4b3d899efd 100644 --- a/src/go/internal/gccgoimporter/parser.go +++ b/src/go/internal/gccgoimporter/parser.go @@ -226,6 +226,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('.') diff --git a/src/go/internal/gccgoimporter/testdata/escapeinfo.go b/src/go/internal/gccgoimporter/testdata/escapeinfo.go new file mode 100644 index 0000000000..103ad95494 --- /dev/null +++ b/src/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/src/go/internal/gccgoimporter/testdata/escapeinfo.gox b/src/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