From: Robert Griesemer Date: Tue, 9 Jan 2018 18:28:29 +0000 (-0800) Subject: go/internal/gccgoimporter: parse optional escape info in export data X-Git-Tag: go1.10beta2~13 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=6697aa58aef7f15c143f9af6878f1f4e406a6576;p=gostls13.git 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 --- 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 0000000000..1db81562c1 Binary files /dev/null and b/src/go/internal/gccgoimporter/testdata/escapeinfo.gox differ