- simplified handling of primary types (types w/ names which must
be canonicalized upon import)
- missed some exports
R=r
OCL=13733
CL=13733
diff --git a/usr/gri/gosrc/export.go b/usr/gri/gosrc/export.go
index 4662960..e127ad6 100755
--- a/usr/gri/gosrc/export.go
+++ b/usr/gri/gosrc/export.go
@@ -120,37 +120,37 @@
func (E *Exporter) WriteObject(obj *Globals.Object) {
if obj == nil {
- E.WriteObjectTag(Object.EOS);
+ E.WriteObjectTag(Object.END);
return;
}
- if obj.kind == Object.TYPE && obj.typ.obj == obj {
- // primary type object - handled entirely by WriteType()
- E.WriteObjectTag(Object.PTYPE);
- E.WriteType(obj.typ);
-
- } else {
- E.WriteObjectTag(obj.kind);
- E.WriteString(obj.ident);
- E.WriteType(obj.typ);
- E.WritePackage(obj.pnolev);
-
- switch obj.kind {
- case Object.CONST:
- E.WriteInt(0); // should be the correct value
-
- case Object.TYPE:
- // nothing to do
-
- case Object.VAR:
- E.WriteInt(0); // should be the correct address/offset
-
- case Object.FUNC:
- E.WriteInt(0); // should be the correct address/offset
-
- default:
- panic "UNREACHABLE";
+ E.WriteObjectTag(obj.kind);
+ if obj.kind == Object.TYPE {
+ // named types are always primary types
+ // and handled entirely by WriteType()
+ if obj.typ.obj != obj {
+ panic "inconsistent primary type"
}
+ E.WriteType(obj.typ);
+ return;
+ }
+
+ E.WriteString(obj.ident);
+ E.WriteType(obj.typ);
+ E.WritePackage(obj.pnolev);
+
+ switch obj.kind {
+ case Object.CONST:
+ E.WriteInt(0); // should be the correct value
+
+ case Object.VAR:
+ E.WriteInt(0); // should be the correct address/offset
+
+ case Object.FUNC:
+ E.WriteInt(0); // should be the correct address/offset
+
+ default:
+ panic "UNREACHABLE";
}
}
diff --git a/usr/gri/gosrc/import.go b/usr/gri/gosrc/import.go
index 5f086fd..334fcef 100755
--- a/usr/gri/gosrc/import.go
+++ b/usr/gri/gosrc/import.go
@@ -136,43 +136,40 @@
func (I *Importer) ReadObject() *Globals.Object {
tag := I.ReadObjectTag();
- if tag == Object.EOS {
+ if tag == Object.END {
return nil;
}
- if tag == Object.PTYPE {
- // primary type object - handled entirely by ReadType()
+ if tag == Object.TYPE {
+ // named types are always primary types
+ // and handled entirely by ReadType()
typ := I.ReadType();
if typ.obj.typ != typ {
- panic "incorrect primary type";
+ panic "inconsistent primary type";
}
return typ.obj;
-
- } else {
- ident := I.ReadString();
- obj := Globals.NewObject(0, tag, ident);
- obj.typ = I.ReadType();
- obj.pnolev = I.ReadPackage().obj.pnolev;
-
- switch (tag) {
- case Object.CONST:
- I.ReadInt(); // should set the value field
-
- case Object.TYPE:
- // nothing to do
-
- case Object.VAR:
- I.ReadInt(); // should set the address/offset field
-
- case Object.FUNC:
- I.ReadInt(); // should set the address/offset field
-
- default:
- panic "UNREACHABLE";
- }
-
- return obj;
}
+
+ ident := I.ReadString();
+ obj := Globals.NewObject(0, tag, ident);
+ obj.typ = I.ReadType();
+ obj.pnolev = I.ReadPackage().obj.pnolev;
+
+ switch (tag) {
+ case Object.CONST:
+ I.ReadInt(); // should set the value field
+
+ case Object.VAR:
+ I.ReadInt(); // should set the address/offset field
+
+ case Object.FUNC:
+ I.ReadInt(); // should set the address/offset field
+
+ default:
+ panic "UNREACHABLE";
+ }
+
+ return obj;
}
diff --git a/usr/gri/gosrc/object.go b/usr/gri/gosrc/object.go
index aab80cc..aacbe8d 100755
--- a/usr/gri/gosrc/object.go
+++ b/usr/gri/gosrc/object.go
@@ -7,12 +7,11 @@
import Globals "globals"
-export BAD, CONST, TYPE, VAR, FUNC, PACKAGE, LABEL, PTYPE, EOS
+export BAD, CONST, TYPE, VAR, FUNC, PACKAGE, LABEL, END
const /* kind */ (
BAD = iota; // error handling
CONST; TYPE; VAR; FUNC; PACKAGE; LABEL;
- PTYPE; // primary type (import/export only)
- EOS; // end of scope (import/export only)
+ END; // end of scope (import/export only)
)
@@ -31,8 +30,7 @@
case FUNC: return "FUNC";
case PACKAGE: return "PACKAGE";
case LABEL: return "LABEL";
- case PTYPE: return "PTYPE";
- case EOS: return "EOS";
+ case END: return "END";
}
return "<unknown Object kind>";
}
diff --git a/usr/gri/gosrc/parser.go b/usr/gri/gosrc/parser.go
index 02081d3..d7e7fa0 100644
--- a/usr/gri/gosrc/parser.go
+++ b/usr/gri/gosrc/parser.go
@@ -1649,15 +1649,21 @@
typ := P.TryType();
if typ != nil {
for p := list.first; p != nil; p = p.next {
- p.obj.exported = exported;
- p.obj.typ = typ; // TODO should use/have set_type()!
+ p.obj.typ = typ;
}
}
+
if P.tok == Scanner.ASSIGN {
P.Next();
P.ParseExpressionList();
}
+ if exported {
+ for p := list.first; p != nil; p = p.next {
+ p.obj.exported = true;
+ }
+ }
+
P.Ecart();
}
@@ -1725,6 +1731,12 @@
}
}
+ if exported {
+ for p := list.first; p != nil; p = p.next {
+ p.obj.exported = true;
+ }
+ }
+
P.Ecart();
}