]> Cypherpunks repositories - gostls13.git/commitdiff
import/export
authorKen Thompson <ken@golang.org>
Thu, 12 Jun 2008 04:06:26 +0000 (21:06 -0700)
committerKen Thompson <ken@golang.org>
Thu, 12 Jun 2008 04:06:26 +0000 (21:06 -0700)
SVN=122309

src/cmd/6g/gen.c
src/cmd/6g/gg.h
src/cmd/6g/gsubr.c
src/cmd/gc/dcl.c
src/cmd/gc/export.c
src/cmd/gc/go.h
src/cmd/gc/go.y
src/cmd/gc/lex.c
src/cmd/gc/walk.c

index 1a0385dc12d51eeca6358b5d061688a5d3ad83e0..b755afacee5440d1aa67c1d42df901dfb235e2ab 100644 (file)
@@ -36,9 +36,6 @@ compile(Node *fn)
        if(debug['w'])
                dump("--- pre walk ---", curfn->nbody);
 
-       maxarg = 0;
-       stksize = 0;
-
        walk(curfn);
        if(nerrors != 0)
                return;
@@ -592,6 +589,8 @@ cgen_callmeth(Node *n)
        // (p.f)(...) goes to (f)(p,...)
 
        l = n->left;
+       if(l->op != ODOTMETH)
+               fatal("cgen_callmeth: not dotmethod: %N");
 
        n->op = OCALL;
        n->left = n->left->right;
@@ -647,6 +646,7 @@ cgen_call(Node *n)
        }
 
        // call direct
+       n->left->method = 1;
        gins(ACALL, N, n->left);
 }
 
index eadd6dedde763eff09c871c596e6b2a4d73f0c8a..fa89cc8894718ffa65b00e0467b0e9caed3a273c 100644 (file)
@@ -92,8 +92,6 @@ EXTERN        uchar   reg[D_NONE];
 EXTERN ushort  txt[NTYPE*NTYPE];
 EXTERN long    maxround;
 EXTERN long    widthptr;
-EXTERN long    maxarg;
-EXTERN long    stksize;
 EXTERN Sym*    symstringo;     // string objects
 EXTERN long    stringo;        // size of string objects
 EXTERN long    pcloc;          // instruction counter
index 42eab9fe9bfbb53878d93fb4a43a46ca2ce457e5..4aa5ef47a4b7a5f8fb66addd64988e86b8a48467 100644 (file)
@@ -1047,6 +1047,12 @@ naddr(Node *n, Addr *a)
                a->sym = n->sym;
                if(a->sym == S)
                        a->sym = lookup(".noname");
+               if(n->method) {
+                       if(n->type != T)
+                       if(n->type->sym != S)
+                       if(n->type->sym->opackage != nil)
+                               a->sym = pkglookup(a->sym->name, n->type->sym->opackage);
+               }
 
                switch(n->class) {
                default:
index 3eae5f33b652d3118463a86d118302a94304cfd4..63c64858797e182b2e7aff2cd4c496fe66aac3d7 100644 (file)
@@ -5,6 +5,18 @@
 #include       "go.h"
 #include       "y.tab.h"
 
+int
+dflag(void)
+{
+       if(!debug['d'])
+               return 0;
+       if(debug['y'])
+               return 1;
+       if(inimportsys)
+               return 0;
+       return 1;
+}
+
 void
 dodclvar(Node *n, Type *t)
 {
@@ -70,7 +82,7 @@ loop:
        r->back->forw = d;
        r->back = d;
 
-       if(debug['d'])
+       if(dflag())
                print("const-dcl %S %N\n", n->sym, n->sym->oconst);
 }
 
@@ -321,7 +333,7 @@ funchdr(Node *n)
                n->type = on->type;
                n->class = on->class;
                n->sym = s;
-               if(debug['d'])
+               if(dflag())
                        print("forew  var-dcl %S %T\n", n->sym, n->type);
        }
 
@@ -497,14 +509,14 @@ popdcl(char *why)
 {
        Sym *d, *s;
 
-//     if(debug['d'])
+//     if(dflag())
 //             print("revert\n");
        for(d=dclstack; d!=S; d=d->link) {
                if(d->name == nil)
                        break;
                s = pkglookup(d->name, d->package);
                dcopy(s, d);
-               if(debug['d'])
+               if(dflag())
                        print("\t%ld pop %S\n", curio.lineno, s);
        }
        if(d == S)
@@ -524,7 +536,7 @@ poptodcl(void)
                        break;
                s = pkglookup(d->name, d->package);
                dcopy(s, d);
-               if(debug['d'])
+               if(dflag())
                        print("\t%ld pop %S\n", curio.lineno, s);
        }
        if(d == S)
@@ -539,7 +551,7 @@ markdcl(char *why)
        d = push();
        d->name = nil;          // used as a mark in fifo
        d->package = why;       // diagnostic for unmatched
-//     if(debug['d'])
+//     if(dflag())
 //             print("markdcl\n");
 }
 
@@ -639,7 +651,7 @@ addvar(Node *n, Type *t, int ctxt)
        r->back->forw = d;
        r->back = d;
 
-       if(debug['d']) {
+       if(dflag()) {
                if(ctxt == PEXTERN)
                        print("extern var-dcl %S G%ld %T\n", s, s->vargen, t);
                else
@@ -666,7 +678,7 @@ addtyp(Type *n, Type *t, int ctxt)
                        // allow nil interface to be
                        // redeclared as an interface
                        if(ot->etype == TINTER && ot->type == T && t->etype == TINTER) {
-                               if(debug['d'])
+                               if(dflag())
                                        print("forew  typ-dcl %S G%ld %T\n", s, s->vargen, t);
                                s->otype = t;
                                return;
@@ -710,7 +722,7 @@ addtyp(Type *n, Type *t, int ctxt)
        r->back->forw = d;
        r->back = d;
 
-       if(debug['d']) {
+       if(dflag()) {
                if(ctxt == PEXTERN)
                        print("extern typ-dcl %S G%ld %T\n", s, s->vargen, t);
                else
index 336ad63685b5f6c1736794630376be31710cd401..b1ddfea625479055dd2039006965f8a8b3b7ef14 100644 (file)
@@ -266,18 +266,34 @@ dumpexport(void)
 /*
  * ******* import *******
  */
+Sym*
+getimportsym(Node *ss)
+{
+       char *pkg;
+       Sym *s;
+
+       if(ss->op != OIMPORT)
+               fatal("getimportsym: oops1 %N\n", ss);
+
+       pkg = ss->psym->name;
+       if(pkgmyname != S)
+               pkg = pkgmyname->name;
+
+       s = pkglookup(ss->sym->name, pkg);
+
+       /* botch - need some diagnostic checking for the following assignment */
+       s->opackage = ss->osym->name;
+       return s;
+}
+
 Type*
 importlooktype(Node *n)
 {
        Sym *s;
 
-       if(n->op != OIMPORT)
-               fatal("importlooktype: oops1 %N\n", n);
-
-       s = pkglookup(n->sym->name, n->psym->name);
+       s = getimportsym(n);
        if(s->otype == T)
                fatal("importlooktype: oops2 %S\n", s);
-
        return s->otype;
 }
 
@@ -367,31 +383,22 @@ importfuncnam(Type *t)
        }
 }
 
-Sym*
-getimportsym(Node *ss)
-{
-       char *pkg;
-       Sym *s;
-
-       pkg = ss->psym->name;
-       if(pkgmyname != S)
-               pkg = pkgmyname->name;
-
-       s = pkglookup(ss->sym->name, pkg);
-       /* botch - need some diagnostic checking for the following assignment */
-       s->opackage = ss->osym->name;
-       return s;
-}
-
 void
 importaddtyp(Node *ss, Type *t)
 {
        Sym *s;
 
        s = getimportsym(ss);
-       if(s->otype == T || !eqtype(t, s->otype, 0)) {
+       if(s->otype == T) {
                addtyp(newtype(s), t, PEXTERN);
+               return;
+       }
+       if(!eqtype(t, s->otype, 0)) {
+               print("redeclaring %S %lT => %lT\n", s, s->otype, t);
+               addtyp(newtype(s), t, PEXTERN);
+               return;
        }
+       print("sametype %S %lT => %lT\n", s, s->otype, t);
 }
 
 /*
index 1f501db5a10ec625e987a5bed9f2008cc7a38a73..3ccefa8484716922fc4d7abe1ed9ab58193e35fa 100644 (file)
@@ -137,6 +137,7 @@ struct      Node
        uchar   trecur;         // to detect loops
        uchar   etype;          // op for OASOP, etype for OTYPE, exclam for export
        uchar   class;          // PPARAM, PAUTO, PEXTERN, PSTATIC
+       uchar   method;         // OCALLMETH name
        long    vargen;         // unique name for OTYPE/ONAME
        ulong   lineno;
        vlong   xoffset;
@@ -353,12 +354,15 @@ EXTERN    Dcl*    externdcl;
 EXTERN Dcl*    exportlist;
 EXTERN int     dclcontext;     // PEXTERN/PAUTO
 EXTERN int     importflag;
+EXTERN int     inimportsys;
 
 EXTERN Node*   booltrue;
 EXTERN Node*   boolfalse;
 EXTERN ulong   iota;
 EXTERN long    vargen;
 EXTERN long    exportgen;
+EXTERN long    maxarg;
+EXTERN long    stksize;
 
 EXTERN Node*   retnil;
 EXTERN Node*   fskel;
index 02251455763be161a40faae874e6295fae2a6b7b..ce7c89a810d129c1d93316002e43a2dc5507a3af 100644 (file)
@@ -829,10 +829,14 @@ keyval:
  * all in one place to show how crappy it all is
  */
 xfndcl:
-       LFUNC fndcl fnbody
+       LFUNC
        {
-               $$ = $2;
-               $$->nbody = $3;
+               maxarg = 0;
+               stksize = 0;
+       } fndcl fnbody
+       {
+               $$ = $3;
+               $$->nbody = $4;
                funcbody($$);
        }
 
index 22bcaf70d2d1074ac059ac0e7829da80183f73d3..96380c647b2e8a9f87bf5bca86f7261691c602ec 100644 (file)
@@ -111,7 +111,7 @@ importfile(Val *f)
                return;
        }
        // BOTCH need to get .8 from backend
-       snprint(namebuf, sizeof(namebuf), "%Z.8", f->sval);
+       snprint(namebuf, sizeof(namebuf), "%Z.6", f->sval);
 
        imp = Bopen(namebuf, OREAD);
        if(imp == nil) {
@@ -154,6 +154,7 @@ unimportfile(void)
        }
        curio = pushedio;
        pushedio.bin = nil;
+       inimportsys = 0;
 }
 
 void
@@ -166,6 +167,7 @@ cannedimports(void)
        curio.infile = "internal sys.go";
        curio.cp = sysimport;
        pkgmyname = S;
+       inimportsys = 1;
 }
 
 long
index 49c1ef4bc13b1728fc21b0edf5bd2ffadef082c0..3952ad2e60d99d7c045e11237e97f5a987438862 100644 (file)
@@ -1301,7 +1301,7 @@ Node*
 reorder1(Node *n)
 {
        Iter save;
-       Node *l, *r, *f;
+       Node *l, *r, *f, *a, *g;
        int c, t;
 
        /*
@@ -1321,10 +1321,6 @@ loop1:
        if(l == N) {
                if(c == 0 || t == 1)
                        return n;
-               if(c > 1) {
-                       yyerror("reorder1: too many function calls evaluating parameters");
-                       return n;
-               }
                goto pass2;
        }
        if(l->op == OLIST)
@@ -1338,23 +1334,50 @@ loop1:
 
 pass2:
        l = listfirst(&save, &n);
-       r = N;  // rest
-       f = N;  // fncall
+       g = N;  // fncalls assigned to tempnames
+       f = N;  // one fncall assigned to stack
+       r = N;  // non fncalls and tempnames assigned to stack
 
 loop2:
        if(l == N) {
-               r = nod(OLIST, f, r);
                r = rev(r);
+               g = rev(g);
+               if(g != N)
+                       f = nod(OLIST, g, f);
+               r = nod(OLIST, f, r);
                return r;
        }
-       if(l->ullman >= UINF)
+       if(l->ullman < UINF) {
+               if(r == N)
+                       r = l;
+               else
+                       r = nod(OLIST, l, r);
+               goto more;
+       }
+       if(f == N) {
                f = l;
+               goto more;
+       }
+
+       // make assignment of fncall to tempname
+       a = nod(OXXX, N, N);
+       tempname(a, l->right->type);
+       a = nod(OAS, a, l->right);
+
+       if(g == N)
+               g = a;
        else
+               g = nod(OLIST, a, g);
+
+       // put normal arg assignment on list
+       // with fncall replaced by tempname
+       l->right = a->left;
        if(r == N)
                r = l;
        else
                r = nod(OLIST, l, r);
 
+more:
        l = listnext(&save);
        goto loop2;
 }