]> Cypherpunks repositories - gostls13.git/commitdiff
toward methods on any type
authorKen Thompson <ken@golang.org>
Mon, 29 Sep 2008 03:22:31 +0000 (20:22 -0700)
committerKen Thompson <ken@golang.org>
Mon, 29 Sep 2008 03:22:31 +0000 (20:22 -0700)
R=r
OCL=16068
CL=16068

src/cmd/6g/obj.c
src/cmd/gc/dcl.c
src/cmd/gc/go.h
src/cmd/gc/go.y
src/cmd/gc/subr.c
src/cmd/gc/walk.c
src/runtime/iface.c

index 969bd995ea7d6eeda0dee42a22f9d8ecae365d4f..5b16e716d0ffa21b619f27858c06c6735d7cd66a 100644 (file)
@@ -591,13 +591,15 @@ dumpsignatures(void)
                a = lsort(a, sigcmp);
                ot = 0;
 
+               // first field of an interface signature
+               // contains the count and is not a real entry
                if(et == TINTER) {
                        o = 0;
                        for(b=a; b!=nil; b=b->link)
                                o++;
 
                        // sigi[0].name = ""
-                       ot = rnd(ot, maxround);
+                       ot = rnd(ot, maxround); // array of structures
                        p = pc;
                        gins(ADATA, N, N);
                        p->from = at;
@@ -636,7 +638,7 @@ dumpsignatures(void)
                for(b=a; b!=nil; b=b->link) {
 
                        // sigx[++].name = "fieldname"
-                       ot = rnd(ot, maxround);
+                       ot = rnd(ot, maxround); // array of structures
                        p = pc;
                        gins(ADATA, N, N);
                        p->from = at;
@@ -669,6 +671,15 @@ dumpsignatures(void)
                                p->to.offset = b->offset;
                                ot += wi;
                        } else {
+                               // leave space for 3 ints
+                               // offset, algorithm and width
+                               ot = rnd(ot, wi);
+                               ot += wi;
+                               ot = rnd(ot, wi);
+                               ot += wi;
+                               ot = rnd(ot, wi);
+                               ot += wi;
+
                                // sigs[++].fun = &method
                                ot = rnd(ot, widthptr);
                                p = pc;
index 988cd25bdf4104b4b4787a2c1d3380e95a27cc9b..568f1e3df0db606f04632ce6bf9475f20212dfcd 100644 (file)
@@ -237,7 +237,7 @@ methodname(Node *n, Type *t)
        return newname(lookup(namebuf));
 
 bad:
-       yyerror("illegal <this> pointer: %T", t);
+       yyerror("illegal <this> type: %T", t);
        return n;
 }
 
@@ -272,6 +272,15 @@ addmethod(Node *n, Type *t, int local)
        if(pa == T)
                goto bad;
 
+       switch(algtype(pa)) {
+       default:
+               goto bad;
+       case ASIMP:
+       case APTR:
+       case ASTRING:
+               break;
+       }
+
        // optionally rip off ptr to type
        ptr = 0;
        if(isptr[pa->etype]) {
index d80f6e77510a5a256263d6d61b8128e6da835795..45716c362b27a9149fd353beaec8c7eeb47b8eeb 100644 (file)
@@ -34,6 +34,13 @@ enum
        PRIME7          = 10067,
        PRIME8          = 10079,
        PRIME9          = 10091,
+
+       AUNK            = 100,
+       // these values are known by runtime
+       ASIMP           = 0,
+       ASTRING,
+       APTR,
+       AINTER,
 };
 
 /*
@@ -553,6 +560,7 @@ Node*       nod(int, Node*, Node*);
 Node*  list(Node*, Node*);
 Type*  typ(int);
 Dcl*   dcl(void);
+int    algtype(Type*);
 Node*  rev(Node*);
 Node*  unrev(Node*);
 void   dodump(Node*, int);
index 4f46a1e1dcf08dc3ad6ae6e0b1e5cf8da833e097..69b7c76d0d5e8c899487a66f8832572c2ed5e586 100644 (file)
@@ -1258,9 +1258,13 @@ structdcl:
        }
 |      new_name
        {
-               // must be a latype
+               // must be  latype
                $$ = nod(ODCLFIELD, N, N);
-               $$->type = $1;
+               $$->type = $1->sym->otype;
+               if($1->sym->lexical != LATYPE) {
+                       yyerror("unnamed structure field must be a type");
+                       $$->type = types[TINT32];
+               };
        }
 |      LIMPORT structdcl
        {
@@ -1691,7 +1695,7 @@ hidden_importfield:
  * to check whether the rest of the grammar is free of
  * reduce/reduce conflicts, comment this section out by
  * removing the slash on the next line.
- */
+ *
 lpack:
        LATYPE
        {
index 8859b3761c908fb62e749d1409d0485cc572c97d..20ba25344b96e6c988f9029ac7b5db40300ffedf 100644 (file)
@@ -280,6 +280,28 @@ nod(int op, Node *nleft, Node *nright)
        return n;
 }
 
+int
+algtype(Type *t)
+{
+       int a;
+
+       a = AUNK;
+       if(issimple[t->etype])
+               a = ASIMP;      // simple mem
+       else
+       if(isptrto(t, TSTRING))
+               a = ASTRING;    // string
+       else
+       if(isptr[t->etype])
+               a = APTR;       // pointer
+       else
+       if(isinter(t))
+               a = AINTER;     // interface
+//     else
+//             fatal("algtype: cant find type %T", t);
+       return a;
+}
+
 Node*
 list(Node *a, Node *b)
 {
index 417b01121484a3ef27eaed5dc302ac45b268a461..6029214c4edd10ea9150f592ea039632a8a9c9a4 100644 (file)
@@ -1884,28 +1884,6 @@ bad:
        return T;
 }
 
-static int
-algtype(Type *t)
-{
-       int a;
-
-       a = 100;
-       if(issimple[t->etype])
-               a = 0;          // simple mem
-       else
-       if(isptrto(t, TSTRING))
-               a = 1;          // string
-       else
-       if(isptr[t->etype])
-               a = 2;          // pointer
-       else
-       if(isinter(t))
-               a = 3;          // interface
-       else
-               fatal("algtype: cant find type %T", t);
-       return a;
-}
-
 Node*
 mapop(Node *n, int top)
 {
index b8e980fc481456a0eb9b6a4bcf49762b9586808f..31d1ae1a3350c036fbe055d60edd542f0e9acb56 100644 (file)
@@ -14,6 +14,9 @@ struct        Sigt
 {
        byte*   name;
        uint32  hash;
+       uint32  offset;         // offset of substruct
+       uint32  width;          // width of type
+       uint32  elemalg;        // algorithm of type
        void    (*fun)(void);
 };
 
@@ -21,7 +24,7 @@ struct        Sigi
 {
        byte*   name;
        uint32  hash;
-       uint32  offset;
+       uint32  perm;           // location of fun in Sigt
 };
 
 struct Map
@@ -44,7 +47,7 @@ printsigi(Sigi *si)
 
        sys·printpointer(si);
        prints("{");
-       n = si[0].offset;
+       n = si[0].perm;         // first entry has size
        for(i=1; i<n; i++) {
                name = si[i].name;
                if(name == nil) {
@@ -56,9 +59,9 @@ printsigi(Sigi *si)
                prints("]\"");
                prints((int8*)name);
                prints("\"");
-               sys·printint(si[i].hash);
+               sys·printint(si[i].hash%999);
                prints("/");
-               sys·printint(si[i].offset);
+               sys·printint(si[i].perm);
        }
        prints("}");
 }
@@ -80,7 +83,13 @@ printsigt(Sigt *st)
                prints("]\"");
                prints((int8*)name);
                prints("\"");
-               sys·printint(st[i].hash);
+               sys·printint(st[i].hash%999);
+               prints("/");
+               sys·printint(st[i].offset);
+               prints(",");
+               sys·printint(st[i].width);
+               prints(",");
+               sys·printint(st[i].elemalg);
                prints("/");
                sys·printpointer(st[i].fun);
        }
@@ -117,7 +126,7 @@ hashmap(Sigi *si, Sigt *st)
                }
        }
 
-       ni = si[0].offset;      // first word has size
+       ni = si[0].perm;        // first entry has size
        m = mal(sizeof(*m) + ni*sizeof(m->fun[0]));
        m->sigi = si;
        m->sigt = st;
@@ -157,7 +166,7 @@ loop2:
                goto loop2;
        }
 
-       m->fun[si[ni].offset] = st[nt].fun;
+       m->fun[si[ni].perm] = st[nt].fun;
        ni++;
        goto loop1;
 }