- fixed import bug (import "...")
- better debugging support
- removed dead code
R=r
OCL=13680
CL=13680
diff --git a/usr/gri/gosrc/parser.go b/usr/gri/gosrc/parser.go
index d12ce76..45b529d 100644
--- a/usr/gri/gosrc/parser.go
+++ b/usr/gri/gosrc/parser.go
@@ -27,7 +27,7 @@
val string; // token value (for IDENT, NUMBER, STRING only)
// Semantic analysis
- level int; // 0 = global scope, -1 = function scope of global functions, etc.
+ level int; // 0 = global scope, -1 = function/struct scope of global functions/structs, etc.
top_scope *Globals.Scope;
undef_types *Globals.List;
exports *Globals.List;
@@ -486,6 +486,7 @@
P.Trace("AnonymousSignature");
P.OpenScope();
+ P.level--;
sig := P.top_scope;
p0 := 0;
@@ -505,6 +506,7 @@
r0 := sig.entries.len_;
P.TryResult();
+ P.level++;
P.CloseScope();
P.Ecart();
@@ -525,6 +527,7 @@
P.Trace("NamedSignature");
P.OpenScope();
+ P.level--;
sig := P.top_scope;
p0 := 0;
@@ -546,6 +549,7 @@
r0 := sig.entries.len_;
P.TryResult();
+ P.level++;
P.CloseScope();
P.Ecart();
@@ -569,11 +573,13 @@
P.ParseIdent();
P.OpenScope();
+ P.level--;
sig := P.top_scope;
p0 := 0;
P.ParseParameters();
r0 := sig.entries.len_;
P.TryResult();
+ P.level++;
P.CloseScope();
P.Optional(Scanner.SEMICOLON);
@@ -587,11 +593,13 @@
P.Expect(Scanner.INTERFACE);
P.Expect(Scanner.LBRACE);
P.OpenScope();
+ P.level--;
typ := Globals.NewType(Type.INTERFACE);
typ.scope = P.top_scope;
for P.tok == Scanner.IDENT {
P.ParseMethodDecl();
}
+ P.level++;
P.CloseScope();
P.Expect(Scanner.RBRACE);
@@ -628,6 +636,7 @@
P.Expect(Scanner.STRUCT);
P.Expect(Scanner.LBRACE);
P.OpenScope();
+ P.level--;
typ := Globals.NewType(Type.STRUCT);
typ.scope = P.top_scope;
for P.tok == Scanner.IDENT {
@@ -637,6 +646,7 @@
}
}
P.Optional(Scanner.SEMICOLON);
+ P.level++;
P.CloseScope();
P.Expect(Scanner.RBRACE);
@@ -745,8 +755,12 @@
if sig != nil {
P.level--;
// add function parameters to scope
+ // TODO do we need to make a copy? what if we change obj fields?
scope := P.top_scope;
for p := sig.entries.first; p != nil; p = p.next {
+ if p.obj.pnolev != P.level {
+ panic "incorrect level";
+ }
scope.Insert(p.obj)
}
}
@@ -1560,12 +1574,13 @@
pkg_name := P.val[1 : len(P.val) - 1]; // strip quotes
pkg := Import.Import(P.comp, pkg_name);
if pkg != nil {
+ pno := pkg.obj.pnolev; // preserve pno
if obj == nil {
// use original package name
obj = pkg.obj;
- P.Declare(obj);
+ P.Declare(obj); // this changes (pkg.)obj.pnolev!
}
- obj.pnolev = pkg.obj.pnolev;
+ obj.pnolev = pno; // correct pno
} else {
P.Error(P.pos, `import of "` + pkg_name + `" failed`);
}
@@ -1836,7 +1851,10 @@
}
P.Optional(Scanner.SEMICOLON);
- { P.OpenScope();
+ { if P.level != 0 {
+ panic "incorrect scope level";
+ }
+ P.OpenScope();
pkg.scope = P.top_scope;
for P.tok == Scanner.IMPORT {
P.ParseDecl(false, Scanner.IMPORT);
@@ -1851,6 +1869,9 @@
P.ResolveUndefTypes();
P.MarkExports();
P.CloseScope();
+ if P.level != 0 {
+ panic "incorrect scope level";
+ }
}
P.CloseScope();