diff options
Diffstat (limited to 'libgo/go/go/internal/gccgoimporter/parser.go')
-rw-r--r-- | libgo/go/go/internal/gccgoimporter/parser.go | 54 |
1 files changed, 46 insertions, 8 deletions
diff --git a/libgo/go/go/internal/gccgoimporter/parser.go b/libgo/go/go/internal/gccgoimporter/parser.go index c06cce435b..3b97c96d43 100644 --- a/libgo/go/go/internal/gccgoimporter/parser.go +++ b/libgo/go/go/internal/gccgoimporter/parser.go @@ -19,6 +19,7 @@ import ( type parser struct { scanner scanner.Scanner + version string // format version tok rune // current token lit string // literal string; only valid for Ident, Int, String tokens pkgpath string // package path of imported package @@ -245,9 +246,20 @@ func (p *parser) parseVar(pkg *types.Package) *types.Var { return types.NewVar(token.NoPos, pkg, name, p.parseType(pkg)) } -// ConstValue = string | "false" | "true" | ["-"] (int ["'"] | FloatOrComplex) . +// Conversion = "convert" "(" Type "," ConstValue ")" . +func (p *parser) parseConversion(pkg *types.Package) (val constant.Value, typ types.Type) { + p.expectKeyword("convert") + p.expect('(') + typ = p.parseType(pkg) + p.expect(',') + val, _ = p.parseConstValue(pkg) + p.expect(')') + return +} + +// ConstValue = string | "false" | "true" | ["-"] (int ["'"] | FloatOrComplex) | Conversion . // FloatOrComplex = float ["i" | ("+"|"-") float "i"] . -func (p *parser) parseConstValue() (val constant.Value, typ types.Type) { +func (p *parser) parseConstValue(pkg *types.Package) (val constant.Value, typ types.Type) { switch p.tok { case scanner.String: str := p.parseString() @@ -262,6 +274,9 @@ func (p *parser) parseConstValue() (val constant.Value, typ types.Type) { case "true": b = true + case "convert": + return p.parseConversion(pkg) + default: p.errorf("expected const value, got %s (%q)", scanner.TokenString(p.tok), p.lit) } @@ -348,7 +363,7 @@ func (p *parser) parseConst(pkg *types.Package) *types.Const { typ = p.parseType(pkg) } p.expect('=') - val, vtyp := p.parseConstValue() + val, vtyp := p.parseConstValue(pkg) if typ == nil { typ = vtyp } @@ -696,7 +711,10 @@ func (p *parser) parseType(pkg *types.Package) (t types.Type) { func (p *parser) parsePackageInit() PackageInit { name := p.parseUnquotedString() initfunc := p.parseUnquotedString() - priority := int(p.parseInt()) + priority := -1 + if p.version == "v1" { + priority = int(p.parseInt()) + } return PackageInit{Name: name, InitFunc: initfunc, Priority: priority} } @@ -723,7 +741,7 @@ func (p *parser) maybeCreatePackage() { } } -// InitDataDirective = "v1" ";" | +// InitDataDirective = ( "v1" | "v2" ) ";" | // "priority" int ";" | // "init" { PackageInit } ";" | // "checksum" unquotedString ";" . @@ -734,7 +752,8 @@ func (p *parser) parseInitDataDirective() { } switch p.lit { - case "v1": + case "v1", "v2": + p.version = p.lit p.next() p.expect(';') @@ -750,6 +769,15 @@ func (p *parser) parseInitDataDirective() { } p.expect(';') + case "init_graph": + p.next() + // The graph data is thrown away for now. + for p.tok != ';' && p.tok != scanner.EOF { + p.parseInt() + p.parseInt() + } + p.expect(';') + case "checksum": // Don't let the scanner try to parse the checksum as a number. defer func(mode uint) { @@ -766,8 +794,9 @@ func (p *parser) parseInitDataDirective() { } // Directive = InitDataDirective | -// "package" unquotedString ";" | +// "package" unquotedString [ unquotedString ] [ unquotedString ] ";" | // "pkgpath" unquotedString ";" | +// "prefix" unquotedString ";" | // "import" unquotedString unquotedString string ";" | // "func" Func ";" | // "type" Type ";" | @@ -780,13 +809,17 @@ func (p *parser) parseDirective() { } switch p.lit { - case "v1", "priority", "init", "checksum": + case "v1", "v2", "priority", "init", "init_graph", "checksum": p.parseInitDataDirective() case "package": p.next() p.pkgname = p.parseUnquotedString() p.maybeCreatePackage() + if p.version == "v2" && p.tok != ';' { + p.parseUnquotedString() + p.parseUnquotedString() + } p.expect(';') case "pkgpath": @@ -795,6 +828,11 @@ func (p *parser) parseDirective() { p.maybeCreatePackage() p.expect(';') + case "prefix": + p.next() + p.pkgpath = p.parseUnquotedString() + p.expect(';') + case "import": p.next() pkgname := p.parseUnquotedString() |