mirror of
https://github.com/golang/go
synced 2024-11-26 10:38:07 -07:00
T,ok = I.(T)
R=r OCL=18580 CL=18582
This commit is contained in:
parent
6f07ec721a
commit
a8b56a73a4
@ -14,8 +14,10 @@ enum
|
|||||||
{
|
{
|
||||||
Inone,
|
Inone,
|
||||||
I2T,
|
I2T,
|
||||||
|
I2T2,
|
||||||
I2I,
|
I2I,
|
||||||
T2I
|
I2I2,
|
||||||
|
T2I,
|
||||||
};
|
};
|
||||||
|
|
||||||
// can this code branch reach the end
|
// can this code branch reach the end
|
||||||
@ -463,6 +465,33 @@ loop:
|
|||||||
goto ret;
|
goto ret;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case OCONV:
|
||||||
|
if(cl == 2 && cr == 1) {
|
||||||
|
// a,b = i.(T)
|
||||||
|
if(r->left == N)
|
||||||
|
break;
|
||||||
|
et = isandss(r->type, r->left);
|
||||||
|
switch(et) {
|
||||||
|
case I2T:
|
||||||
|
et = I2T2;
|
||||||
|
break;
|
||||||
|
case I2I:
|
||||||
|
et = I2I2;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
et = Inone;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(et == Inone)
|
||||||
|
break;
|
||||||
|
r = ifaceop(r->type, r->left, et);
|
||||||
|
l = ascompatet(n->op, &n->left, &r->type, 0);
|
||||||
|
if(l != N)
|
||||||
|
indir(n, list(r, reorder2(l)));
|
||||||
|
goto ret;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(l->op) {
|
switch(l->op) {
|
||||||
@ -2667,6 +2696,15 @@ isandss(Type *lt, Node *r)
|
|||||||
return Inone;
|
return Inone;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char*
|
||||||
|
ifacename[] =
|
||||||
|
{
|
||||||
|
[I2T] = "ifaceI2T",
|
||||||
|
[I2T2] = "ifaceI2T2",
|
||||||
|
[I2I] = "ifaceI2I",
|
||||||
|
[I2I2] = "ifaceI2I2",
|
||||||
|
};
|
||||||
|
|
||||||
Node*
|
Node*
|
||||||
ifaceop(Type *tl, Node *n, int op)
|
ifaceop(Type *tl, Node *n, int op)
|
||||||
{
|
{
|
||||||
@ -2678,26 +2716,7 @@ ifaceop(Type *tl, Node *n, int op)
|
|||||||
|
|
||||||
switch(op) {
|
switch(op) {
|
||||||
default:
|
default:
|
||||||
fatal("ifaceop: unknown op %d\n", op);
|
fatal("ifaceop: unknown op %O\n", op);
|
||||||
|
|
||||||
case I2T:
|
|
||||||
// ifaceI2T(sigt *byte, iface any) (ret any);
|
|
||||||
|
|
||||||
a = n; // interface
|
|
||||||
r = a;
|
|
||||||
|
|
||||||
s = signame(tl); // sigi
|
|
||||||
if(s == S)
|
|
||||||
fatal("ifaceop: signame I2T");
|
|
||||||
a = s->oname;
|
|
||||||
a = nod(OADDR, a, N);
|
|
||||||
r = list(a, r);
|
|
||||||
|
|
||||||
on = syslook("ifaceI2T", 1);
|
|
||||||
argtype(on, tr);
|
|
||||||
argtype(on, tl);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case T2I:
|
case T2I:
|
||||||
// ifaceT2I(sigi *byte, sigt *byte, elem any) (ret any);
|
// ifaceT2I(sigi *byte, sigt *byte, elem any) (ret any);
|
||||||
@ -2726,22 +2745,26 @@ ifaceop(Type *tl, Node *n, int op)
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case I2T:
|
||||||
|
case I2T2:
|
||||||
case I2I:
|
case I2I:
|
||||||
// ifaceI2I(sigi *byte, iface any-1) (ret any-2);
|
case I2I2:
|
||||||
|
// iface[IT]2[IT][2](sigt *byte, iface any) (ret any[, ok bool]);
|
||||||
|
|
||||||
a = n; // interface
|
a = n; // interface
|
||||||
r = a;
|
r = a;
|
||||||
|
|
||||||
s = signame(tl); // sigi
|
s = signame(tl); // sigi
|
||||||
if(s == S)
|
if(s == S)
|
||||||
fatal("ifaceop: signame I2I");
|
fatal("ifaceop: signame %d", op);
|
||||||
a = s->oname;
|
a = s->oname;
|
||||||
a = nod(OADDR, a, N);
|
a = nod(OADDR, a, N);
|
||||||
r = list(a, r);
|
r = list(a, r);
|
||||||
|
|
||||||
on = syslook("ifaceI2I", 1);
|
on = syslook(ifacename[op], 1);
|
||||||
argtype(on, tr);
|
argtype(on, tr);
|
||||||
argtype(on, tl);
|
argtype(on, tl);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OEQ:
|
case OEQ:
|
||||||
|
Loading…
Reference in New Issue
Block a user