mirror of
https://github.com/golang/go
synced 2024-11-25 14:07:56 -07:00
gc: remove &[10]int -> []int conversion
Fixes #829. R=ken2 CC=golang-dev https://golang.org/cl/2124044
This commit is contained in:
parent
5801928817
commit
82ee481dfc
@ -358,7 +358,7 @@ enum
|
|||||||
OCLOSURE,
|
OCLOSURE,
|
||||||
OCMPIFACE, OCMPSTR,
|
OCMPIFACE, OCMPSTR,
|
||||||
OCOMPLIT, OMAPLIT, OSTRUCTLIT, OARRAYLIT,
|
OCOMPLIT, OMAPLIT, OSTRUCTLIT, OARRAYLIT,
|
||||||
OCONV, OCONVIFACE, OCONVNOP, OCONVSLICE,
|
OCONV, OCONVIFACE, OCONVNOP,
|
||||||
OCOPY,
|
OCOPY,
|
||||||
ODCL, ODCLFUNC, ODCLFIELD, ODCLCONST, ODCLTYPE,
|
ODCL, ODCLFUNC, ODCLFIELD, ODCLCONST, ODCLTYPE,
|
||||||
ODOT, ODOTPTR, ODOTMETH, ODOTINTER, OXDOT,
|
ODOT, ODOTPTR, ODOTMETH, ODOTINTER, OXDOT,
|
||||||
|
@ -55,7 +55,6 @@ exprfmt(Fmt *f, Node *n, int prec)
|
|||||||
case OCALL:
|
case OCALL:
|
||||||
case OCONV:
|
case OCONV:
|
||||||
case OCONVNOP:
|
case OCONVNOP:
|
||||||
case OCONVSLICE:
|
|
||||||
case OMAKESLICE:
|
case OMAKESLICE:
|
||||||
case ORUNESTR:
|
case ORUNESTR:
|
||||||
case OADDR:
|
case OADDR:
|
||||||
@ -319,8 +318,11 @@ exprfmt(Fmt *f, Node *n, int prec)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case OSLICE:
|
case OSLICE:
|
||||||
|
case OSLICESTR:
|
||||||
|
case OSLICEARR:
|
||||||
exprfmt(f, n->left, 7);
|
exprfmt(f, n->left, 7);
|
||||||
fmtprint(f, "[");
|
fmtprint(f, "[");
|
||||||
|
if(n->right->left != N)
|
||||||
exprfmt(f, n->right->left, 0);
|
exprfmt(f, n->right->left, 0);
|
||||||
fmtprint(f, ":");
|
fmtprint(f, ":");
|
||||||
if(n->right->right != N)
|
if(n->right->right != N)
|
||||||
@ -361,7 +363,6 @@ exprfmt(Fmt *f, Node *n, int prec)
|
|||||||
case OCONV:
|
case OCONV:
|
||||||
case OCONVIFACE:
|
case OCONVIFACE:
|
||||||
case OCONVNOP:
|
case OCONVNOP:
|
||||||
case OCONVSLICE:
|
|
||||||
case OARRAYBYTESTR:
|
case OARRAYBYTESTR:
|
||||||
case ORUNESTR:
|
case ORUNESTR:
|
||||||
if(n->type == T || n->type->sym == S)
|
if(n->type == T || n->type->sym == S)
|
||||||
|
@ -401,7 +401,7 @@ slicelit(int ctxt, Node *n, Node *var, NodeList **init)
|
|||||||
arraylit(ctxt, 2, n, vstat, init);
|
arraylit(ctxt, 2, n, vstat, init);
|
||||||
|
|
||||||
// copy static to slice
|
// copy static to slice
|
||||||
a = nod(OADDR, vstat, N);
|
a = nod(OSLICE, vstat, nod(OKEY, N, N));
|
||||||
a = nod(OAS, var, a);
|
a = nod(OAS, var, a);
|
||||||
typecheck(&a, Etop);
|
typecheck(&a, Etop);
|
||||||
a->dodata = 2;
|
a->dodata = 2;
|
||||||
@ -459,7 +459,7 @@ slicelit(int ctxt, Node *n, Node *var, NodeList **init)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// make slice out of heap (5)
|
// make slice out of heap (5)
|
||||||
a = nod(OAS, var, vauto);
|
a = nod(OAS, var, nod(OSLICE, vauto, nod(OKEY, N, N)));
|
||||||
typecheck(&a, Etop);
|
typecheck(&a, Etop);
|
||||||
walkexpr(&a, init);
|
walkexpr(&a, init);
|
||||||
*init = list(*init, a);
|
*init = list(*init, a);
|
||||||
@ -864,8 +864,18 @@ gen_as_init(Node *n)
|
|||||||
default:
|
default:
|
||||||
goto no;
|
goto no;
|
||||||
|
|
||||||
case OCONVSLICE:
|
case OCONVNOP:
|
||||||
|
nr = nr->left;
|
||||||
|
if(nr == N || nr->op != OSLICEARR)
|
||||||
|
goto no;
|
||||||
|
// fall through
|
||||||
|
|
||||||
|
case OSLICEARR:
|
||||||
|
if(nr->right->op == OKEY && nr->right->left == N && nr->right->right == N) {
|
||||||
|
nr = nr->left;
|
||||||
goto slice;
|
goto slice;
|
||||||
|
}
|
||||||
|
goto no;
|
||||||
|
|
||||||
case OLITERAL:
|
case OLITERAL:
|
||||||
break;
|
break;
|
||||||
@ -914,7 +924,7 @@ yes:
|
|||||||
|
|
||||||
slice:
|
slice:
|
||||||
gused(N); // in case the data is the dest of a goto
|
gused(N); // in case the data is the dest of a goto
|
||||||
nr = n->right->left;
|
nl = nr;
|
||||||
if(nr == N || nr->op != OADDR)
|
if(nr == N || nr->op != OADDR)
|
||||||
goto no;
|
goto no;
|
||||||
nr = nr->left;
|
nr = nr->left;
|
||||||
@ -926,7 +936,7 @@ slice:
|
|||||||
goto no;
|
goto no;
|
||||||
|
|
||||||
nam.xoffset += Array_array;
|
nam.xoffset += Array_array;
|
||||||
gdata(&nam, n->right->left, types[tptr]->width);
|
gdata(&nam, nl, types[tptr]->width);
|
||||||
|
|
||||||
nam.xoffset += Array_nel-Array_array;
|
nam.xoffset += Array_nel-Array_array;
|
||||||
nodconst(&nod1, types[TINT32], nr->type->bound);
|
nodconst(&nod1, types[TINT32], nr->type->bound);
|
||||||
|
@ -1925,13 +1925,6 @@ assignop(Type *src, Type *dst, char **why)
|
|||||||
if(dst->etype == TBLANK)
|
if(dst->etype == TBLANK)
|
||||||
return OCONVNOP;
|
return OCONVNOP;
|
||||||
|
|
||||||
// 8. Array to slice.
|
|
||||||
// TODO(rsc): Not for long.
|
|
||||||
if(!src->sym || !dst->sym)
|
|
||||||
if(isptr[src->etype] && isfixedarray(src->type) && isslice(dst))
|
|
||||||
if(eqtype(src->type->type, dst->type))
|
|
||||||
return OCONVSLICE;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -648,12 +648,9 @@ reswitch:
|
|||||||
defaultlit(&n->right->left, T);
|
defaultlit(&n->right->left, T);
|
||||||
defaultlit(&n->right->right, T);
|
defaultlit(&n->right->right, T);
|
||||||
if(isfixedarray(n->left->type)) {
|
if(isfixedarray(n->left->type)) {
|
||||||
// Insert explicit & before fixed array
|
|
||||||
// so that back end knows to move to heap.
|
|
||||||
n->left = nod(OADDR, n->left, N);
|
n->left = nod(OADDR, n->left, N);
|
||||||
typecheck(&n->left, top);
|
typecheck(&n->left, top);
|
||||||
}
|
}
|
||||||
implicitstar(&n->left);
|
|
||||||
if(n->right->left != N) {
|
if(n->right->left != N) {
|
||||||
if((t = n->right->left->type) == T)
|
if((t = n->right->left->type) == T)
|
||||||
goto error;
|
goto error;
|
||||||
@ -678,9 +675,9 @@ reswitch:
|
|||||||
n->op = OSLICESTR;
|
n->op = OSLICESTR;
|
||||||
goto ret;
|
goto ret;
|
||||||
}
|
}
|
||||||
if(isfixedarray(t)) {
|
if(isptr[t->etype] && isfixedarray(t->type)) {
|
||||||
n->type = typ(TARRAY);
|
n->type = typ(TARRAY);
|
||||||
n->type->type = t->type;
|
n->type->type = t->type->type;
|
||||||
n->type->bound = -1;
|
n->type->bound = -1;
|
||||||
dowidth(n->type);
|
dowidth(n->type);
|
||||||
n->op = OSLICEARR;
|
n->op = OSLICEARR;
|
||||||
@ -1269,7 +1266,7 @@ implicitstar(Node **nn)
|
|||||||
Type *t;
|
Type *t;
|
||||||
Node *n;
|
Node *n;
|
||||||
|
|
||||||
// insert implicit * if needed
|
// insert implicit * if needed for fixed array
|
||||||
n = *nn;
|
n = *nn;
|
||||||
t = n->type;
|
t = n->type;
|
||||||
if(t == T || !isptr[t->etype])
|
if(t == T || !isptr[t->etype])
|
||||||
|
@ -1124,35 +1124,23 @@ walkexpr(Node **np, NodeList **init)
|
|||||||
// slicearray(old *any, uint64 nel, lb uint64, hb uint64, width uint64) (ary []any)
|
// slicearray(old *any, uint64 nel, lb uint64, hb uint64, width uint64) (ary []any)
|
||||||
t = n->type;
|
t = n->type;
|
||||||
fn = syslook("slicearray", 1);
|
fn = syslook("slicearray", 1);
|
||||||
argtype(fn, n->left->type); // any-1
|
argtype(fn, n->left->type->type); // any-1
|
||||||
argtype(fn, t->type); // any-2
|
argtype(fn, t->type); // any-2
|
||||||
if(n->right->left == N)
|
if(n->right->left == N)
|
||||||
l = nodintconst(0);
|
l = nodintconst(0);
|
||||||
else
|
else
|
||||||
l = conv(n->right->left, types[TUINT64]);
|
l = conv(n->right->left, types[TUINT64]);
|
||||||
if(n->right->right == N)
|
if(n->right->right == N)
|
||||||
r = nodintconst(n->left->type->bound);
|
r = nodintconst(n->left->type->type->bound);
|
||||||
else
|
else
|
||||||
r = conv(n->right->right, types[TUINT64]);
|
r = conv(n->right->right, types[TUINT64]);
|
||||||
n = mkcall1(fn, t, init,
|
n = mkcall1(fn, t, init,
|
||||||
nod(OADDR, n->left, N), nodintconst(n->left->type->bound),
|
n->left, nodintconst(n->left->type->type->bound),
|
||||||
l,
|
l,
|
||||||
r,
|
r,
|
||||||
nodintconst(t->type->width));
|
nodintconst(t->type->width));
|
||||||
goto ret;
|
goto ret;
|
||||||
|
|
||||||
case OCONVSLICE:
|
|
||||||
// slicearray(old *any, uint64 nel, lb uint64, hb uint64, width uint64) (ary []any)
|
|
||||||
fn = syslook("slicearray", 1);
|
|
||||||
argtype(fn, n->left->type->type); // any-1
|
|
||||||
argtype(fn, n->type->type); // any-2
|
|
||||||
n = mkcall1(fn, n->type, init, n->left,
|
|
||||||
nodintconst(n->left->type->type->bound),
|
|
||||||
nodintconst(0),
|
|
||||||
nodintconst(n->left->type->type->bound),
|
|
||||||
nodintconst(n->type->type->width));
|
|
||||||
goto ret;
|
|
||||||
|
|
||||||
case OADDR:;
|
case OADDR:;
|
||||||
Node *nvar, *nstar;
|
Node *nvar, *nstar;
|
||||||
|
|
||||||
@ -2140,12 +2128,17 @@ static void
|
|||||||
heapmoves(void)
|
heapmoves(void)
|
||||||
{
|
{
|
||||||
NodeList *nn;
|
NodeList *nn;
|
||||||
|
int32 lno;
|
||||||
|
|
||||||
|
lno = lineno;
|
||||||
|
lineno = curfn->lineno;
|
||||||
nn = paramstoheap(getthis(curfn->type), 0);
|
nn = paramstoheap(getthis(curfn->type), 0);
|
||||||
nn = concat(nn, paramstoheap(getinarg(curfn->type), 0));
|
nn = concat(nn, paramstoheap(getinarg(curfn->type), 0));
|
||||||
nn = concat(nn, paramstoheap(getoutarg(curfn->type), 1));
|
nn = concat(nn, paramstoheap(getoutarg(curfn->type), 1));
|
||||||
curfn->enter = concat(curfn->enter, nn);
|
curfn->enter = concat(curfn->enter, nn);
|
||||||
|
lineno = curfn->endlineno;
|
||||||
curfn->exit = returnsfromheap(getoutarg(curfn->type));
|
curfn->exit = returnsfromheap(getoutarg(curfn->type));
|
||||||
|
lineno = lno;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Node*
|
static Node*
|
||||||
|
Loading…
Reference in New Issue
Block a user