mirror of
https://github.com/golang/go
synced 2024-11-26 14:56:47 -07:00
gc: handle iface == nil in back end
R=ken OCL=33778 CL=33781
This commit is contained in:
parent
c6fd23ce6d
commit
89f69bb3be
@ -790,6 +790,25 @@ bgen(Node *n, int true, Prog *to)
|
|||||||
regfree(&n1);
|
regfree(&n1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(isinter(nl->type)) {
|
||||||
|
// front end shold only leave cmp to literal nil
|
||||||
|
if((a != OEQ && a != ONE) || nr->op != OLITERAL) {
|
||||||
|
yyerror("illegal interface comparison");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
a = optoas(a, types[tptr]);
|
||||||
|
regalloc(&n1, types[tptr], N);
|
||||||
|
agen(nl, &n1);
|
||||||
|
n2 = n1;
|
||||||
|
n2.op = OINDREG;
|
||||||
|
n2.xoffset = 0;
|
||||||
|
nodconst(&tmp, types[tptr], 0);
|
||||||
|
gins(optoas(OCMP, types[tptr]), &n2, &tmp);
|
||||||
|
patch(gbranch(a, types[tptr]), to);
|
||||||
|
regfree(&n1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
a = optoas(a, nr->type);
|
a = optoas(a, nr->type);
|
||||||
|
|
||||||
|
@ -743,6 +743,7 @@ bgen(Node *n, int true, Prog *to)
|
|||||||
nl = n->left;
|
nl = n->left;
|
||||||
if(nl == N || nl->type == T)
|
if(nl == N || nl->type == T)
|
||||||
goto ret;
|
goto ret;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(n->op) {
|
switch(n->op) {
|
||||||
@ -787,6 +788,25 @@ bgen(Node *n, int true, Prog *to)
|
|||||||
regfree(&n1);
|
regfree(&n1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(isinter(nl->type)) {
|
||||||
|
// front end shold only leave cmp to literal nil
|
||||||
|
if((a != OEQ && a != ONE) || nr->op != OLITERAL) {
|
||||||
|
yyerror("illegal interface comparison");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
a = optoas(a, types[tptr]);
|
||||||
|
regalloc(&n1, types[tptr], N);
|
||||||
|
agen(nl, &n1);
|
||||||
|
n2 = n1;
|
||||||
|
n2.op = OINDREG;
|
||||||
|
n2.xoffset = 0;
|
||||||
|
nodconst(&tmp, types[tptr], 0);
|
||||||
|
gins(optoas(OCMP, types[tptr]), &n2, &tmp);
|
||||||
|
patch(gbranch(a, types[tptr]), to);
|
||||||
|
regfree(&n1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
a = optoas(a, nr->type);
|
a = optoas(a, nr->type);
|
||||||
|
|
||||||
|
@ -838,6 +838,25 @@ bgen(Node *n, int true, Prog *to)
|
|||||||
regfree(&n1);
|
regfree(&n1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(isinter(nl->type)) {
|
||||||
|
// front end shold only leave cmp to literal nil
|
||||||
|
if((a != OEQ && a != ONE) || nr->op != OLITERAL) {
|
||||||
|
yyerror("illegal interface comparison");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
a = optoas(a, types[tptr]);
|
||||||
|
regalloc(&n1, types[tptr], N);
|
||||||
|
agen(nl, &n1);
|
||||||
|
n2 = n1;
|
||||||
|
n2.op = OINDREG;
|
||||||
|
n2.xoffset = 0;
|
||||||
|
nodconst(&tmp, types[tptr], 0);
|
||||||
|
gins(optoas(OCMP, types[tptr]), &n2, &tmp);
|
||||||
|
patch(gbranch(a, types[tptr]), to);
|
||||||
|
regfree(&n1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if(isfloat[nr->type->etype]) {
|
if(isfloat[nr->type->etype]) {
|
||||||
nodreg(&tmp, nr->type, D_F0);
|
nodreg(&tmp, nr->type, D_F0);
|
||||||
|
@ -323,8 +323,16 @@ reswitch:
|
|||||||
n->op = OADDSTR;
|
n->op = OADDSTR;
|
||||||
}
|
}
|
||||||
if(et == TINTER) {
|
if(et == TINTER) {
|
||||||
n->etype = n->op;
|
if(l->op == OLITERAL && l->val.ctype == CTNIL) {
|
||||||
n->op = OCMPIFACE;
|
// swap for back end
|
||||||
|
n->left = r;
|
||||||
|
n->right = l;
|
||||||
|
} else if(r->op == OLITERAL && r->val.ctype == CTNIL) {
|
||||||
|
// leave alone for back end
|
||||||
|
} else {
|
||||||
|
n->etype = n->op;
|
||||||
|
n->op = OCMPIFACE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
n->type = t;
|
n->type = t;
|
||||||
goto ret;
|
goto ret;
|
||||||
|
Loading…
Reference in New Issue
Block a user