diff options
author | Robert Griesemer <gri@golang.org> | 2018-01-09 10:28:29 -0800 |
---|---|---|
committer | Robert Griesemer <gri@golang.org> | 2018-01-10 19:41:25 +0000 |
commit | 6697aa58aef7f15c143f9af6878f1f4e406a6576 (patch) | |
tree | 8307f55d0200743116b55e94d167c49a2a20dce7 | |
parent | 5e1dcb7a04ba989483761fc4e14da8e75efa2847 (diff) | |
download | go-6697aa58aef7f15c143f9af6878f1f4e406a6576.tar.gz go-6697aa58aef7f15c143f9af6878f1f4e406a6576.zip |
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 <iant@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
-rw-r--r-- | src/go/internal/gccgoimporter/importer_test.go | 1 | ||||
-rw-r--r-- | src/go/internal/gccgoimporter/parser.go | 8 | ||||
-rw-r--r-- | src/go/internal/gccgoimporter/testdata/escapeinfo.go | 13 | ||||
-rw-r--r-- | src/go/internal/gccgoimporter/testdata/escapeinfo.gox | bin | 0 -> 824 bytes |
4 files changed, 22 insertions, 0 deletions
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 = "<esc:" int ">" . (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 Binary files differnew file mode 100644 index 0000000000..1db81562c1 --- /dev/null +++ b/src/go/internal/gccgoimporter/testdata/escapeinfo.gox |