restx(&cx, &oldcx);
}
+static int
+cadable(Node *n)
+{
+ if(!n->addable) {
+ // dont know how it happens,
+ // but it does
+ return 0;
+ }
+
+ switch(n->op) {
+ case ONAME:
+ return 1;
+ }
+ return 0;
+}
+
/*
* copy a structure component by component
* return 1 if can do, 0 if cant.
componentgen(Node *nr, Node *nl)
{
Node nodl, nodr;
- int free;
+ int freel, freer;
- free = 0;
- if(!nl->addable || nl->op != ONAME)
+ freel = 0;
+ freer = 0;
+
+ switch(nl->type->etype) {
+ default:
goto no;
+ case TARRAY:
+ if(!isslice(nl->type))
+ goto no;
+ case TSTRING:
+ case TINTER:
+ break;
+ }
+
nodl = *nl;
- if(nr != N) {
- if(!nr->addable || nr->op != ONAME)
+ if(!cadable(nl)) {
+ if(nr == N || !cadable(nr))
goto no;
+ igen(nl, &nodl, N);
+ freel = 1;
+ }
+
+ if(nr != N) {
nodr = *nr;
- if(nr->op != ONAME && nr->op != OINDREG) {
+ if(!cadable(nr)) {
igen(nr, &nodr, N);
- free = 1;
+ freer = 1;
}
}
goto yes;
case TSTRING:
-
nodl.xoffset += Array_array;
nodl.type = ptrto(types[TUINT8]);
goto yes;
case TINTER:
-
nodl.xoffset += Array_array;
nodl.type = ptrto(types[TUINT8]);
}
no:
- if(free)
+ if(freer)
regfree(&nodr);
+ if(freel)
+ regfree(&nodl);
return 0;
yes:
- if(free)
+ if(freer)
regfree(&nodr);
+ if(freel)
+ regfree(&nodl);
return 1;
}