summaryrefslogtreecommitdiff
path: root/libgo/go/go/internal/gccgoimporter/parser.go
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/go/go/internal/gccgoimporter/parser.go')
-rw-r--r--libgo/go/go/internal/gccgoimporter/parser.go54
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()