]> Cypherpunks repositories - gostls13.git/commitdiff
- more import/export stuff
authorRobert Griesemer <gri@golang.org>
Mon, 4 Aug 2008 17:19:36 +0000 (10:19 -0700)
committerRobert Griesemer <gri@golang.org>
Mon, 4 Aug 2008 17:19:36 +0000 (10:19 -0700)
- use new export syntax

R=r
OCL=13807
CL=13807

usr/gri/gosrc/compilation.go
usr/gri/gosrc/export.go
usr/gri/gosrc/globals.go
usr/gri/gosrc/import.go
usr/gri/gosrc/object.go
usr/gri/gosrc/parser.go
usr/gri/gosrc/printer.go
usr/gri/gosrc/scanner.go
usr/gri/gosrc/type.go
usr/gri/gosrc/verifier.go

index a7d1c9a1adb95904492fac94b08227be878686b6..ec404dee71fd565ede1400639fcb384dbaa641a4 100644 (file)
@@ -31,7 +31,6 @@ func Compile(comp *Globals.Compilation, file_name string) {
        parser := new(Parser.Parser);
        parser.Open(comp, scanner);
 
-       print "parsing ", file_name, "\n";
        parser.ParseProgram();
        if parser.S.nerrors > 0 {
                return;
@@ -44,7 +43,7 @@ func Compile(comp *Globals.Compilation, file_name string) {
        Verifier.Verify(comp);
        
        if comp.flags.print_export {
-               Printer.PrintObject(comp, comp.pkgs[0].obj, false);
+               Printer.PrintObject(comp, comp.pkg_list[0].obj, false);
        }
        
        Export.Export(comp, file_name);
index e127ad62667c6e071d8699f3bdf8e5ee5114be90..ac6afd9bbdfc8b50b2c98e9a3bf19511d991ac60 100755 (executable)
@@ -137,7 +137,6 @@ func (E *Exporter) WriteObject(obj *Globals.Object) {
 
        E.WriteString(obj.ident);
        E.WriteType(obj.typ);
-       E.WritePackage(obj.pnolev);
 
        switch obj.kind {
        case Object.CONST:
@@ -164,21 +163,32 @@ func (E *Exporter) WriteType(typ *Globals.Type) {
        if -typ.form >= 0 {
                panic "-typ.form >= 0";  // conflict with ref numbers
        }
-       
        E.WriteTypeTag(-typ.form);
        typ.ref = E.type_ref;
        E.type_ref++;
 
+       // if we have a primary type, export the type identifier and package
+       ident := "";
        if typ.obj != nil {
+               // primary type
                if typ.obj.typ != typ {
-                       panic "typ.obj.type() != typ";  // primary type
+                       panic "inconsistent primary type";
+               }
+               ident = typ.obj.ident;
+               if !typ.obj.exported {
+                       // the type is invisible (it's identifier is not exported)
+                       // prepend "." to the identifier to make it an illegal
+                       // identifier and thus invisible in Go source code
+                       ident = "." + ident;
                }
-               E.WriteString(typ.obj.ident);
+       }
+       
+       E.WriteString(ident);
+       if len(ident) > 0 {
+               // primary type
                E.WritePackage(typ.obj.pnolev);
-       } else {
-               E.WriteString("");
        }
-
+       
        switch typ.form {
        case Type.ALIAS:
                E.WriteType(typ.elt);
@@ -215,7 +225,7 @@ func (E *Exporter) WritePackage(pno int) {
        if pno < 0 {
                pno = 0;
        }
-       pkg := E.comp.pkgs[pno];
+       pkg := E.comp.pkg_list[pno];
        if pkg.ref >= 0 {
                E.WritePackageTag(pkg.ref);  // package already exported
                return;
@@ -254,7 +264,7 @@ func (E *Exporter) Export(comp* Globals.Compilation, file_name string) {
        }
        E.type_ref = Universe.types.len_;
        
-       pkg := comp.pkgs[0];
+       pkg := comp.pkg_list[0];
        E.WritePackage(0);
        E.WriteScope(pkg.scope, false);
        
index 90214d6d10bfd021f4d75a0c76d4d9e34ae8f630..7969a352914f10ea6422a29beea622ab80495698 100644 (file)
@@ -13,20 +13,17 @@ package Globals
 
 // ----------------------------------------------------------------------------
 
-export Object
-type Object struct {
+export type Object struct {
        exported bool;
        pos int;  // source position (< 0 if unknown position)
        kind int;
        ident string;
-       typ *Type;
-       pnolev int;  // >= 0: package no., <= 0: level, 0: global level of compilation
-       scope *Scope;  // which contains the object
+       typ *Type;  // nil for packages
+       pnolev int;  // >= 0: package no., <= 0: function nesting level, 0: global level
 }
 
 
-export Type
-type Type struct {
+export type Type struct {
        ref int;  // for exporting only: >= 0 means already exported
        form int;
        flags int;  // channels, functions
@@ -39,13 +36,12 @@ type Type struct {
 }
 
 
-export Package
-type Package struct {
+export type Package struct {
        ref int;  // for exporting only: >= 0 means already exported
        file_name string;
        key string;
        obj *Object;
-       scope *Scope;
+       scope *Scope;  // holds the (global) objects in this package
 }
 
 
@@ -61,23 +57,20 @@ type Elem struct {
 }
 
 
-export List
-type List struct {
+export type List struct {
        len_ int;
        first, last *Elem;
 };
 
 
-export Scope
-type Scope struct {
+export type Scope struct {
        parent *Scope;
        entries *List;
        // entries *map[string] *Object;  // doesn't work properly
 }
 
 
-export Flags;
-type Flags struct {
+export type Flags struct {
        debug bool;
        print_export bool;
        semantic_checks bool;
@@ -86,24 +79,21 @@ type Flags struct {
 }
 
 
-export Compilation
-type Compilation struct {
+export type Compilation struct {
        flags *Flags;
        // TODO use open arrays eventually
-       pkgs [256] *Package;  // pkgs[0] is the current package
-       npkgs int;
+       pkg_list [256] *Package;  // pkg_list[0] is the current package
+       pkg_ref int;
 }
 
 
-export Expr
-type Expr interface {
+export type Expr interface {
        typ() *Type;
        // ... more to come here
 }
 
 
-export Stat
-type Stat interface {
+export type Stat interface {
        // ... more to come here
 }
 
@@ -111,8 +101,7 @@ type Stat interface {
 // ----------------------------------------------------------------------------
 // Creation
 
-export Universe_undef_t
-var Universe_undef_t *Type  // initialized by Universe to Universe.undef_t
+export var Universe_undef_t *Type  // initialized by Universe to Universe.undef_t
 
 export NewObject
 func NewObject(pos, kind int, ident string) *Object {
@@ -123,7 +112,6 @@ func NewObject(pos, kind int, ident string) *Object {
        obj.ident = ident;
        obj.typ = Universe_undef_t;
        obj.pnolev = 0;
-       obj.scope = nil;
        return obj;
 }
 
@@ -138,11 +126,12 @@ func NewType(form int) *Type {
 
 
 export NewPackage;
-func NewPackage(file_name string) *Package {
+func NewPackage(file_name string, obj *Object) *Package {
        pkg := new(Package);
        pkg.ref = -1;  // not yet exported
        pkg.file_name = file_name;
        pkg.key = "<the package key>";  // TODO fix this
+       pkg.obj = obj;
        return pkg;
 }
 
@@ -181,7 +170,6 @@ func (obj *Object) Copy() *Object {
        copy.ident = obj.ident;
        copy.typ = obj.typ;
        copy.pnolev = obj.pnolev;
-       copy.scope = nil;  // cannot be in the same scope (same ident!)
        return copy;
 }
 
@@ -272,9 +260,6 @@ func (L *List) AddTyp(typ *Type) {
 func (scope *Scope) Lookup(ident string) *Object {
        for p := scope.entries.first; p != nil; p = p.next {
                if p.obj.ident == ident {
-                       if p.obj.scope != scope {
-                               panic "incorrect scope for object";
-                       }
                        return p.obj;
                }
        }
@@ -286,11 +271,7 @@ func (scope *Scope) Insert(obj *Object) {
        if scope.Lookup(obj.ident) != nil {
                panic "obj already inserted";
        }
-       if obj.scope != nil {
-               panic "obj already in a scope";
-       }
        scope.entries.AddObj(obj);
-       obj.scope = scope;
 }
 
 
@@ -317,8 +298,8 @@ func (scope *Scope) Print() {
 // Compilation methods
 
 func (C *Compilation) Lookup(file_name string) *Package {
-       for i := 0; i < C.npkgs; i++ {
-               pkg := C.pkgs[i];
+       for i := 0; i < C.pkg_ref; i++ {
+               pkg := C.pkg_list[i];
                if pkg.file_name == file_name {
                        return pkg;
                }
@@ -331,9 +312,9 @@ func (C *Compilation) Insert(pkg *Package) {
        if C.Lookup(pkg.file_name) != nil {
                panic "package already inserted";
        }
-       pkg.obj.pnolev = C.npkgs;
-       C.pkgs[C.npkgs] = pkg;
-       C.npkgs++;
+       pkg.obj.pnolev = C.pkg_ref;
+       C.pkg_list[C.pkg_ref] = pkg;
+       C.pkg_ref++;
 }
 
 
index 334fcefd279390b6cafc0aa84e5c18ab61f4d366..3c0c5d70067a0f75012e8ee172ed4d37d5738720 100755 (executable)
@@ -16,9 +16,9 @@ type Importer struct {
        debug bool;
        buf string;
        buf_pos int;
-       pkgs [256] *Globals.Package;
+       pkg_list [256] *Globals.Package;
        pkg_ref int;
-       types [1024] *Globals.Type;
+       type_list [1024] *Globals.Type;
        type_ref int;
 };
 
@@ -120,8 +120,6 @@ func (I *Importer) ReadScope() *Globals.Scope {
        scope := Globals.NewScope(nil);
        obj := I.ReadObject();
        for obj != nil {
-               // InsertImport only needed for package scopes
-               // but ok to use always
                scope.InsertImport(obj);
                obj = I.ReadObject();
        }
@@ -153,7 +151,6 @@ func (I *Importer) ReadObject() *Globals.Object {
        ident := I.ReadString();
        obj := Globals.NewObject(0, tag, ident);
        obj.typ = I.ReadType();
-       obj.pnolev = I.ReadPackage().obj.pnolev;
 
        switch (tag) {
        case Object.CONST:
@@ -176,26 +173,31 @@ func (I *Importer) ReadObject() *Globals.Object {
 func (I *Importer) ReadType() *Globals.Type {
        tag := I.ReadTypeTag();
        if tag >= 0 {
-               return I.types[tag];  // type already imported
+               return I.type_list[tag];  // type already imported
        }
 
        typ := Globals.NewType(-tag);
        ptyp := typ;  // primary type
+
        ident := I.ReadString();
        if len(ident) > 0 {
                // primary type
+               pkg := I.ReadPackage();
+               
+               // create corresponding type object
                obj := Globals.NewObject(0, Object.TYPE, ident);
+               obj.exported = true;
                obj.typ = typ;
+               obj.pnolev = pkg.obj.pnolev;
                typ.obj = obj;
 
                // canonicalize type
-               pkg := I.ReadPackage();
-               obj.pnolev = pkg.obj.pnolev;
-               obj = pkg.scope.InsertImport(obj);
-
-               ptyp = obj.typ;
+               // (if the type was seen before, use primary instance!)
+               ptyp = pkg.scope.InsertImport(obj).typ;
        }
-       I.types[I.type_ref] = ptyp;
+       // insert the primary type into the type table but
+       // keep filling in the current type fields
+       I.type_list[I.type_ref] = ptyp;
        I.type_ref++;
 
        switch (typ.form) {
@@ -235,7 +237,7 @@ func (I *Importer) ReadType() *Globals.Type {
 func (I *Importer) ReadPackage() *Globals.Package {
        tag := I.ReadPackageTag();
        if tag >= 0 {
-               return I.pkgs[tag];  // package already imported
+               return I.pkg_list[tag];  // package already imported
        }
 
        ident := I.ReadString();
@@ -245,8 +247,8 @@ func (I *Importer) ReadPackage() *Globals.Package {
 
        if pkg == nil {
                // new package
-               pkg = Globals.NewPackage(file_name);
-               pkg.obj = Globals.NewObject(-1, Object.PACKAGE, ident);
+               obj := Globals.NewObject(-1, Object.PACKAGE, ident);
+               pkg = Globals.NewPackage(file_name, obj);
                pkg.scope = Globals.NewScope(nil);
                pkg = I.comp.InsertImport(pkg);
 
@@ -254,7 +256,7 @@ func (I *Importer) ReadPackage() *Globals.Package {
                // package inconsistency
                panic "package key inconsistency";
        }
-       I.pkgs[I.pkg_ref] = pkg;
+       I.pkg_list[I.pkg_ref] = pkg;
        I.pkg_ref++;
 
        return pkg;
@@ -284,7 +286,7 @@ func (I *Importer) Import(comp* Globals.Compilation, file_name string) *Globals.
                if p.typ.ref != I.type_ref {
                        panic "incorrect ref for predeclared type";
                }
-               I.types[I.type_ref] = p.typ;
+               I.type_list[I.type_ref] = p.typ;
                I.type_ref++;
        }
 
index aacbe8d5195ff50e3024d6c759a6802d5b991ed9..54ccb12e92a8af7553c879d89c280010c88dd64f 100755 (executable)
@@ -7,8 +7,7 @@ package Object
 import Globals "globals"
 
 
-export BAD, CONST, TYPE, VAR, FUNC, PACKAGE, LABEL, END
-const /* kind */ (
+export const /* kind */ (
        BAD = iota;  // error handling
        CONST; TYPE; VAR; FUNC; PACKAGE; LABEL;
        END;  // end of scope (import/export only)
index d7e7fa0688511a857ee8713f44c4f269b9a59251..0008562042287b83bbb4cb40be5a555edb4c2537 100644 (file)
@@ -306,7 +306,7 @@ func (P *Parser) ParseQualifiedIdent(pos int, ident string) *Globals.Object {
                        if obj.pnolev < 0 {
                                panic "obj.pnolev < 0";
                        }
-                       pkg := P.comp.pkgs[obj.pnolev];
+                       pkg := P.comp.pkg_list[obj.pnolev];
                        //if pkg.obj.ident != ident {
                        //      panic "pkg.obj.ident != ident";
                        //}
@@ -1916,10 +1916,10 @@ func (P *Parser) ParseProgram() {
        
        P.OpenScope();
        P.Expect(Scanner.PACKAGE);
-       pkg := Globals.NewPackage(P.S.filename);
-       pkg.obj = P.ParseIdentDecl(Object.PACKAGE);
+       obj := P.ParseIdentDecl(Object.PACKAGE);
+       pkg := Globals.NewPackage(P.S.filename, obj);
        P.comp.Insert(pkg);
-       if P.comp.npkgs != 1 {
+       if P.comp.pkg_ref != 1 {
                panic "should have exactly one package now";
        }
        P.Optional(Scanner.SEMICOLON);
index 9b27e4cfac9203228cfee4f725eda47079edc475..7fd2ab98a3869c606ed95fbe1dde95e161dd34e0 100755 (executable)
@@ -164,7 +164,7 @@ func (P *Printer) PrintObjectStruct(obj *Globals.Object) {
                print "package ";
                P.PrintObject(obj);
                print " ";
-               P.PrintScope(P.comp.pkgs[obj.pnolev].scope, 0);
+               P.PrintScope(P.comp.pkg_list[obj.pnolev].scope, 0);
 
        default:
                panic "UNREACHABLE";
@@ -178,7 +178,7 @@ func (P *Printer) PrintObjectStruct(obj *Globals.Object) {
 
 func (P *Printer) PrintObject(obj *Globals.Object) {
        if obj.pnolev > 0 {
-               print P.comp.pkgs[obj.pnolev].obj.ident, ".";
+               print P.comp.pkg_list[obj.pnolev].obj.ident, ".";
        }
        print obj.ident;
 }
index 9d4e9953a9bf0c0fdcf53bab76a585eb6c3734be..d8a15af42125f4d110b28f08968ac20dfc2d088e 100644 (file)
@@ -6,27 +6,7 @@ package Scanner
 
 import Utils "utils"
 
-
-export
-       ILLEGAL, EOF, IDENT, STRING, NUMBER,
-       COMMA, COLON, SEMICOLON, PERIOD,
-       LPAREN, RPAREN, LBRACK, RBRACK, LBRACE, RBRACE,
-       ASSIGN, DEFINE,
-       INC, DEC, NOT,
-       AND, OR, XOR,
-       ADD, SUB, MUL, QUO, REM,
-       EQL, NEQ, LSS, LEQ, GTR, GEQ,
-       SHL, SHR,
-       SEND, RECV,
-       ADD_ASSIGN, SUB_ASSIGN, MUL_ASSIGN, QUO_ASSIGN, REM_ASSIGN,
-       AND_ASSIGN, OR_ASSIGN, XOR_ASSIGN, SHL_ASSIGN, SHR_ASSIGN,
-       LAND, LOR,
-       BREAK, CASE, CHAN, CONST, CONTINUE, DEFAULT, ELSE, EXPORT, FALLTHROUGH, FALSE,
-       FOR, FUNC, GO, GOTO, IF, IMPORT, INTERFACE, IOTA, MAP, NEW, NIL, PACKAGE, RANGE,
-       RETURN, SELECT, STRUCT, SWITCH, TRUE, TYPE, VAR
-       
-       
-const (
+export const (
        ILLEGAL = iota;
        EOF;
        IDENT;
@@ -270,8 +250,7 @@ func digit_val(ch int) int {
 }
 
 
-export Scanner
-type Scanner struct {
+export type Scanner struct {
        filename string;  // error reporting only
        nerrors int;  // number of errors
        errpos int;  // last error position
index ff7ddcbf286e362197ef527c4ee930b9c72e716e..27801a05ec2a25b3db513d5079adb4a373f1f8d4 100644 (file)
@@ -4,13 +4,7 @@
 
 package Type
 
-export
-       UNDEF, BAD, NIL,
-       BOOL, UINT, INT, FLOAT, STRING,
-       ANY,
-       ALIAS, ARRAY, STRUCT, INTERFACE, MAP, CHANNEL, FUNCTION, POINTER, REFERENCE
-
-const /* form */ (
+export const /* form */ (
        // internal types
        UNDEF = iota; BAD; NIL;
        // basic types
@@ -22,10 +16,7 @@ const /* form */ (
 )
 
 
-export
-       SEND, RECV
-       
-const /* flag */ (
+export const /* flag */ (
        SEND = 1 << iota;  // chan>
        RECV;  // chan< or method
 )
index d653fd659744a7d5b0b2b3d994b4b81a89a647b7..9aef51740f3ba3f8fbd5f0d10033f6d637af6bf1 100644 (file)
@@ -106,7 +106,7 @@ func VerifyPackage(pkg *Globals.Package, pno int) {
 
 export Verify
 func Verify(comp *Globals.Compilation) {
-       for i := 0; i < comp.npkgs; i++ {
-               VerifyPackage(comp.pkgs[i], i);
+       for i := 0; i < comp.pkg_ref; i++ {
+               VerifyPackage(comp.pkg_list[i], i);
        }
 }