1
0
mirror of https://github.com/golang/go synced 2024-11-19 13:04:45 -07:00

interfaces of all types

R=r
OCL=16462
CL=16462
This commit is contained in:
Ken Thompson 2008-10-03 16:12:21 -07:00
parent bbb908fef0
commit 8877d27b40
6 changed files with 81 additions and 81 deletions

View File

@ -170,7 +170,7 @@ dowidth(Type *t)
case TFUNC:
// function is 3 cated structures
w = widstruct(*getthis(t), 0, 0);
w = widstruct(*getthis(t), 0, 1);
w = widstruct(*getinarg(t), w, 0);
w = widstruct(*getoutarg(t), w, 1);
t->argwid = w;

View File

@ -60,8 +60,6 @@ struct Sig
uint32 hash;
int32 perm;
int32 offset;
int32 width;
int32 elemalg;
Sig* link;
};

View File

@ -485,6 +485,7 @@ dumpsignatures(void)
x->dtype = d->dtype;
x->forw = signatlist;
signatlist = x;
//print("SIG = %lS %lS %lT\n", d->dsym, s, t);
}
/*
@ -585,8 +586,6 @@ dumpsignatures(void)
at.sym->name+5, f->sym->name);
a->sym = lookup(namebuf);
a->offset = 0;
a->elemalg = 0;
a->width = 0;
o++;
}
@ -594,24 +593,26 @@ dumpsignatures(void)
a = lsort(a, sigcmp);
ot = 0;
// first field of an interface signature
// contains the count and is not a real entry
// sigi[0].name = ""
ot = rnd(ot, maxround); // array of structures
p = pc;
gins(ADATA, N, N);
p->from = at;
p->from.offset = ot;
p->from.scale = widthptr;
p->to = ao;
p->to.offset = stringo;
ot += widthptr;
datastring("", 1);
if(et == TINTER) {
// first field of an interface signature
// contains the count and is not a real entry
o = 0;
for(b=a; b!=nil; b=b->link)
o++;
// sigi[0].name = ""
ot = rnd(ot, maxround); // array of structures
p = pc;
gins(ADATA, N, N);
p->from = at;
p->from.offset = ot;
p->from.scale = widthptr;
p->to = ao;
p->to.offset = stringo;
ot += widthptr;
// sigi[0].hash = 0
ot = rnd(ot, wi);
p = pc;
@ -634,8 +635,39 @@ dumpsignatures(void)
p->to.offset = o;
ot += wi;
datastring("", 1);
} else {
// first field of an type signature contains
// the element parameters and is not a real entry
t = d->dtype;
if(t->methptr & 2)
t = types[tptr];
// sigi[0].hash = elemalg
ot = rnd(ot, wi);
p = pc;
gins(ADATA, N, N);
p->from = at;
p->from.offset = ot;
p->from.scale = wi;
p->to = ac;
p->to.offset = algtype(t);
ot += wi;
// sigi[0].offset = width
ot = rnd(ot, wi);
p = pc;
gins(ADATA, N, N);
p->from = at;
p->from.offset = ot;
p->from.scale = wi;
p->to = ac;
p->to.offset = t->width;
ot += wi;
// skip the function
ot = rnd(ot, widthptr);
ot += widthptr;
}
for(b=a; b!=nil; b=b->link) {
@ -685,28 +717,6 @@ dumpsignatures(void)
p->to.offset = b->offset;
ot += wi;
// sigt[++].width = type size
ot = rnd(ot, wi);
p = pc;
gins(ADATA, N, N);
p->from = at;
p->from.offset = ot;
p->from.scale = wi;
p->to = ac;
p->to.offset = b->width;
ot += wi;
// sigt[++].elemalg = type algorithm
ot = rnd(ot, wi);
p = pc;
gins(ADATA, N, N);
p->from = at;
p->from.offset = ot;
p->from.scale = wi;
p->to = ac;
p->to.offset = b->elemalg;
ot += wi;
// sigt[++].fun = &method
ot = rnd(ot, widthptr);
p = pc;

View File

@ -122,7 +122,7 @@ struct Type
uchar chan;
uchar recur; // to detect loops
uchar trecur; // to detect loops
uchar methptr; // all methods are pointers to this type
uchar methptr; // 1=direct 2=pointer
// TFUNCT
uchar thistuple;

View File

@ -1418,37 +1418,25 @@ signame(Type *t)
Sym *s, *ss;
char *e;
loop:
if(t == T) {
// print("signame: nil type\n");
if(t == T)
goto bad;
}
switch(t->etype) {
default:
e = "sigs";
break;
case TPTR32:
case TPTR64:
t = t->type;
goto loop;
case TINTER:
e = "sigi";
break;
}
s = t->sym;
if(s == S) {
// print("signame: no type name\n");
goto bad;
}
if(s->name[0] == '_') {
// print("signame: temp type name %S\n", s);
goto bad;
if(s == S || s->name[0] == '_') {
if(isptr[t->etype]) {
t = t->type;
if(t == T)
goto bad;
}
s = t->sym;
if(s == S || s->name[0] == '_')
goto bad;
}
e = "sigt";
if(t->etype == TINTER)
e = "sigi";
snprint(namebuf, sizeof(namebuf), "%s_%s", e, s->name);
ss = pkglookup(namebuf, s->opackage);
if(ss->oname == N) {

View File

@ -15,8 +15,6 @@ struct Sigt
byte* name;
uint32 hash;
uint32 offset; // offset of substruct
uint32 width; // width of type
uint32 elemalg; // algorithm of type
void (*fun)(void);
};
@ -47,13 +45,10 @@ printsigi(Sigi *si)
sys·printpointer(si);
prints("{");
n = si[0].perm; // first entry has size
for(i=1; i<n; i++) {
for(i=1;; i++) {
name = si[i].name;
if(name == nil) {
prints("<nil>");
if(name == nil)
break;
}
prints("[");
sys·printint(i);
prints("]\"");
@ -74,7 +69,10 @@ printsigt(Sigt *st)
sys·printpointer(st);
prints("{");
for(i=0;; i++) {
sys·printint(st[0].hash); // first element has alg
prints(",");
sys·printint(st[0].offset); // first element has width
for(i=1;; i++) {
name = st[i].name;
if(name == nil)
break;
@ -86,10 +84,6 @@ printsigt(Sigt *st)
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);
}
@ -165,6 +159,7 @@ hashmap(Sigi *si, Sigt *st)
void
sys·ifaceT2I(Sigi *si, Sigt *st, void *elem, Map *retim, void *retit)
{
// int32 alg, wid;
if(debug) {
prints("T2I sigi=");
@ -177,7 +172,11 @@ sys·ifaceT2I(Sigi *si, Sigt *st, void *elem, Map *retim, void *retit)
}
retim = hashmap(si, st);
retit = elem;
// alg = st->hash;
// wid = st->offset;
// algarray[alg].copy(wid, &retit, &elem);
retit = elem; // for speed could do this
if(debug) {
prints("T2I ret=");
@ -193,6 +192,7 @@ sys·ifaceT2I(Sigi *si, Sigt *st, void *elem, Map *retim, void *retit)
void
sys·ifaceI2T(Sigt *st, Map *im, void *it, void *ret)
{
// int32 alg, wid;
if(debug) {
prints("I2T sigt=");
@ -208,7 +208,11 @@ sys·ifaceI2T(Sigt *st, Map *im, void *it, void *ret)
if(im->sigt != st)
throw("ifaceI2T: wrong type");
// alg = st->hash;
// wid = st->offset;
// algarray[alg].copy(wid, &ret, &it);
ret = it;
if(debug) {
prints("I2T ret=");
sys·printpointer(ret);