From: Robert Griesemer Date: Fri, 1 Aug 2008 21:50:18 +0000 (-0700) Subject: - simplified handling of primary types (types w/ names which must X-Git-Tag: weekly.2009-11-06~3390 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=c6eb85aecf638430aa959232dde83367f197c3e5;p=gostls13.git - 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 466296030e..e127ad6266 100755 --- a/usr/gri/gosrc/export.go +++ b/usr/gri/gosrc/export.go @@ -120,37 +120,37 @@ func (E *Exporter) WriteScope(scope *Globals.Scope, export_all bool) { 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.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; + } - } 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.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 5f086fdcf6..334fcefd27 100755 --- a/usr/gri/gosrc/import.go +++ b/usr/gri/gosrc/import.go @@ -136,43 +136,40 @@ func (I *Importer) ReadScope() *Globals.Scope { 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; + } + + ident := I.ReadString(); + obj := Globals.NewObject(0, tag, ident); + obj.typ = I.ReadType(); + obj.pnolev = I.ReadPackage().obj.pnolev; - } 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"; - } + switch (tag) { + case Object.CONST: + I.ReadInt(); // should set the value field - return obj; + 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 aab80cc57e..aacbe8d519 100755 --- a/usr/gri/gosrc/object.go +++ b/usr/gri/gosrc/object.go @@ -7,12 +7,11 @@ package Object 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 @@ func KindStr(kind int) string { 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 ""; } diff --git a/usr/gri/gosrc/parser.go b/usr/gri/gosrc/parser.go index 02081d3a44..d7e7fa0688 100644 --- a/usr/gri/gosrc/parser.go +++ b/usr/gri/gosrc/parser.go @@ -1649,15 +1649,21 @@ func (P *Parser) ParseConstSpec(exported bool) { 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 @@ func (P *Parser) ParseVarSpec(exported bool) { } } + if exported { + for p := list.first; p != nil; p = p.next { + p.obj.exported = true; + } + } + P.Ecart(); }