Commit 89ac5618 authored by Ken Thompson's avatar Ken Thompson

toward methods on any type

R=r
OCL=16068
CL=16068
parent 3a884d76
...@@ -591,13 +591,15 @@ dumpsignatures(void) ...@@ -591,13 +591,15 @@ dumpsignatures(void)
a = lsort(a, sigcmp); a = lsort(a, sigcmp);
ot = 0; ot = 0;
// first field of an interface signature
// contains the count and is not a real entry
if(et == TINTER) { if(et == TINTER) {
o = 0; o = 0;
for(b=a; b!=nil; b=b->link) for(b=a; b!=nil; b=b->link)
o++; o++;
// sigi[0].name = "" // sigi[0].name = ""
ot = rnd(ot, maxround); ot = rnd(ot, maxround); // array of structures
p = pc; p = pc;
gins(ADATA, N, N); gins(ADATA, N, N);
p->from = at; p->from = at;
...@@ -636,7 +638,7 @@ dumpsignatures(void) ...@@ -636,7 +638,7 @@ dumpsignatures(void)
for(b=a; b!=nil; b=b->link) { for(b=a; b!=nil; b=b->link) {
// sigx[++].name = "fieldname" // sigx[++].name = "fieldname"
ot = rnd(ot, maxround); ot = rnd(ot, maxround); // array of structures
p = pc; p = pc;
gins(ADATA, N, N); gins(ADATA, N, N);
p->from = at; p->from = at;
...@@ -669,6 +671,15 @@ dumpsignatures(void) ...@@ -669,6 +671,15 @@ dumpsignatures(void)
p->to.offset = b->offset; p->to.offset = b->offset;
ot += wi; ot += wi;
} else { } 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 // sigs[++].fun = &method
ot = rnd(ot, widthptr); ot = rnd(ot, widthptr);
p = pc; p = pc;
......
...@@ -237,7 +237,7 @@ methodname(Node *n, Type *t) ...@@ -237,7 +237,7 @@ methodname(Node *n, Type *t)
return newname(lookup(namebuf)); return newname(lookup(namebuf));
bad: bad:
yyerror("illegal <this> pointer: %T", t); yyerror("illegal <this> type: %T", t);
return n; return n;
} }
...@@ -272,6 +272,15 @@ addmethod(Node *n, Type *t, int local) ...@@ -272,6 +272,15 @@ addmethod(Node *n, Type *t, int local)
if(pa == T) if(pa == T)
goto bad; goto bad;
switch(algtype(pa)) {
default:
goto bad;
case ASIMP:
case APTR:
case ASTRING:
break;
}
// optionally rip off ptr to type // optionally rip off ptr to type
ptr = 0; ptr = 0;
if(isptr[pa->etype]) { if(isptr[pa->etype]) {
......
...@@ -34,6 +34,13 @@ enum ...@@ -34,6 +34,13 @@ enum
PRIME7 = 10067, PRIME7 = 10067,
PRIME8 = 10079, PRIME8 = 10079,
PRIME9 = 10091, PRIME9 = 10091,
AUNK = 100,
// these values are known by runtime
ASIMP = 0,
ASTRING,
APTR,
AINTER,
}; };
/* /*
...@@ -553,6 +560,7 @@ Node* nod(int, Node*, Node*); ...@@ -553,6 +560,7 @@ Node* nod(int, Node*, Node*);
Node* list(Node*, Node*); Node* list(Node*, Node*);
Type* typ(int); Type* typ(int);
Dcl* dcl(void); Dcl* dcl(void);
int algtype(Type*);
Node* rev(Node*); Node* rev(Node*);
Node* unrev(Node*); Node* unrev(Node*);
void dodump(Node*, int); void dodump(Node*, int);
......
...@@ -1258,9 +1258,13 @@ structdcl: ...@@ -1258,9 +1258,13 @@ structdcl:
} }
| new_name | new_name
{ {
// must be a latype // must be latype
$$ = nod(ODCLFIELD, N, N); $$ = 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 | LIMPORT structdcl
{ {
...@@ -1691,7 +1695,7 @@ hidden_importfield: ...@@ -1691,7 +1695,7 @@ hidden_importfield:
* to check whether the rest of the grammar is free of * to check whether the rest of the grammar is free of
* reduce/reduce conflicts, comment this section out by * reduce/reduce conflicts, comment this section out by
* removing the slash on the next line. * removing the slash on the next line.
*/ *
lpack: lpack:
LATYPE LATYPE
{ {
......
...@@ -280,6 +280,28 @@ nod(int op, Node *nleft, Node *nright) ...@@ -280,6 +280,28 @@ nod(int op, Node *nleft, Node *nright)
return n; 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* Node*
list(Node *a, Node *b) list(Node *a, Node *b)
{ {
......
...@@ -1884,28 +1884,6 @@ bad: ...@@ -1884,28 +1884,6 @@ bad:
return T; 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* Node*
mapop(Node *n, int top) mapop(Node *n, int top)
{ {
......
...@@ -14,6 +14,9 @@ struct Sigt ...@@ -14,6 +14,9 @@ struct Sigt
{ {
byte* name; byte* name;
uint32 hash; uint32 hash;
uint32 offset; // offset of substruct
uint32 width; // width of type
uint32 elemalg; // algorithm of type
void (*fun)(void); void (*fun)(void);
}; };
...@@ -21,7 +24,7 @@ struct Sigi ...@@ -21,7 +24,7 @@ struct Sigi
{ {
byte* name; byte* name;
uint32 hash; uint32 hash;
uint32 offset; uint32 perm; // location of fun in Sigt
}; };
struct Map struct Map
...@@ -44,7 +47,7 @@ printsigi(Sigi *si) ...@@ -44,7 +47,7 @@ printsigi(Sigi *si)
sys·printpointer(si); sys·printpointer(si);
prints("{"); prints("{");
n = si[0].offset; n = si[0].perm; // first entry has size
for(i=1; i<n; i++) { for(i=1; i<n; i++) {
name = si[i].name; name = si[i].name;
if(name == nil) { if(name == nil) {
...@@ -56,9 +59,9 @@ printsigi(Sigi *si) ...@@ -56,9 +59,9 @@ printsigi(Sigi *si)
prints("]\""); prints("]\"");
prints((int8*)name); prints((int8*)name);
prints("\""); prints("\"");
sys·printint(si[i].hash); sys·printint(si[i].hash%999);
prints("/"); prints("/");
sys·printint(si[i].offset); sys·printint(si[i].perm);
} }
prints("}"); prints("}");
} }
...@@ -80,7 +83,13 @@ printsigt(Sigt *st) ...@@ -80,7 +83,13 @@ printsigt(Sigt *st)
prints("]\""); prints("]\"");
prints((int8*)name); prints((int8*)name);
prints("\""); 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("/"); prints("/");
sys·printpointer(st[i].fun); sys·printpointer(st[i].fun);
} }
...@@ -117,7 +126,7 @@ hashmap(Sigi *si, Sigt *st) ...@@ -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 = mal(sizeof(*m) + ni*sizeof(m->fun[0]));
m->sigi = si; m->sigi = si;
m->sigt = st; m->sigt = st;
...@@ -157,7 +166,7 @@ loop2: ...@@ -157,7 +166,7 @@ loop2:
goto loop2; goto loop2;
} }
m->fun[si[ni].offset] = st[nt].fun; m->fun[si[ni].perm] = st[nt].fun;
ni++; ni++;
goto loop1; goto loop1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment