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;
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;
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;
return newname(lookup(namebuf));
bad:
- yyerror("illegal <this> pointer: %T", t);
+ yyerror("illegal <this> type: %T", t);
return n;
}
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]) {
PRIME7 = 10067,
PRIME8 = 10079,
PRIME9 = 10091,
+
+ AUNK = 100,
+ // these values are known by runtime
+ ASIMP = 0,
+ ASTRING,
+ APTR,
+ AINTER,
};
/*
Node* list(Node*, Node*);
Type* typ(int);
Dcl* dcl(void);
+int algtype(Type*);
Node* rev(Node*);
Node* unrev(Node*);
void dodump(Node*, int);
}
| 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
{
* 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
{
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)
{
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)
{
{
byte* name;
uint32 hash;
+ uint32 offset; // offset of substruct
+ uint32 width; // width of type
+ uint32 elemalg; // algorithm of type
void (*fun)(void);
};
{
byte* name;
uint32 hash;
- uint32 offset;
+ uint32 perm; // location of fun in Sigt
};
struct Map
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) {
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("}");
}
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);
}
}
}
- 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;
goto loop2;
}
- m->fun[si[ni].offset] = st[nt].fun;
+ m->fun[si[ni].perm] = st[nt].fun;
ni++;
goto loop1;
}