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:
parent
bbb908fef0
commit
8877d27b40
@ -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;
|
||||
|
@ -60,8 +60,6 @@ struct Sig
|
||||
uint32 hash;
|
||||
int32 perm;
|
||||
int32 offset;
|
||||
int32 width;
|
||||
int32 elemalg;
|
||||
Sig* link;
|
||||
};
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user