mirror of
https://github.com/golang/go
synced 2024-11-22 01:54:42 -07:00
- simplified handling of primary types (types w/ names which must
be canonicalized upon import) - missed some exports R=r OCL=13733 CL=13733
This commit is contained in:
parent
0abbb8c76b
commit
c6eb85aecf
@ -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.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";
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
||||
} 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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -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 "<unknown Object kind>";
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user