1
0
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:
Russ Cox 2010-09-10 11:53:27 -04:00
parent 5801928817
commit 82ee481dfc
6 changed files with 35 additions and 41 deletions

View File

@ -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,

View File

@ -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)

View File

@ -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);

View File

@ -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;
} }

View File

@ -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])

View File

@ -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*