Sym* sym; // various
int32 vargen; // unique name for OTYPE/ONAME
int32 lineno;
- int32 endlineno;
+ int32 endlineno;
vlong xoffset;
int32 ostk;
int32 iota;
OCLOSURE,
OCMPIFACE, OCMPSTR,
OCOMPLIT, OMAPLIT, OSTRUCTLIT, OARRAYLIT,
- OCONV, OCONVIFACE, OCONVNOP, OCONVSLICE,
+ OCONV, OCONVIFACE, OCONVNOP,
OCOPY,
ODCL, ODCLFUNC, ODCLFIELD, ODCLCONST, ODCLTYPE,
ODOT, ODOTPTR, ODOTMETH, ODOTINTER, OXDOT,
case OCALL:
case OCONV:
case OCONVNOP:
- case OCONVSLICE:
case OMAKESLICE:
case ORUNESTR:
case OADDR:
break;
case OSLICE:
+ case OSLICESTR:
+ case OSLICEARR:
exprfmt(f, n->left, 7);
fmtprint(f, "[");
- exprfmt(f, n->right->left, 0);
+ if(n->right->left != N)
+ exprfmt(f, n->right->left, 0);
fmtprint(f, ":");
if(n->right->right != N)
exprfmt(f, n->right->right, 0);
case OCONV:
case OCONVIFACE:
case OCONVNOP:
- case OCONVSLICE:
case OARRAYBYTESTR:
case ORUNESTR:
if(n->type == T || n->type->sym == S)
arraylit(ctxt, 2, n, vstat, init);
// copy static to slice
- a = nod(OADDR, vstat, N);
+ a = nod(OSLICE, vstat, nod(OKEY, N, N));
a = nod(OAS, var, a);
typecheck(&a, Etop);
a->dodata = 2;
}
// 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);
walkexpr(&a, init);
*init = list(*init, a);
default:
goto no;
- case OCONVSLICE:
- goto slice;
+ 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 no;
case OLITERAL:
break;
slice:
gused(N); // in case the data is the dest of a goto
- nr = n->right->left;
+ nl = nr;
if(nr == N || nr->op != OADDR)
goto no;
nr = nr->left;
goto no;
nam.xoffset += Array_array;
- gdata(&nam, n->right->left, types[tptr]->width);
+ gdata(&nam, nl, types[tptr]->width);
nam.xoffset += Array_nel-Array_array;
nodconst(&nod1, types[TINT32], nr->type->bound);
// 7. Any typed value can be assigned to the blank identifier.
if(dst->etype == TBLANK)
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;
}
defaultlit(&n->right->left, T);
defaultlit(&n->right->right, T);
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);
typecheck(&n->left, top);
}
- implicitstar(&n->left);
if(n->right->left != N) {
if((t = n->right->left->type) == T)
goto error;
if(!isint[t->etype]) {
yyerror("invalid slice index %#N (type %T)", n->right->left, t);
goto error;
- }
+ }
}
if(n->right->right != N) {
if((t = n->right->right->type) == T)
n->op = OSLICESTR;
goto ret;
}
- if(isfixedarray(t)) {
+ if(isptr[t->etype] && isfixedarray(t->type)) {
n->type = typ(TARRAY);
- n->type->type = t->type;
+ n->type->type = t->type->type;
n->type->bound = -1;
dowidth(n->type);
n->op = OSLICEARR;
Type *t;
Node *n;
- // insert implicit * if needed
+ // insert implicit * if needed for fixed array
n = *nn;
t = n->type;
if(t == T || !isptr[t->etype])
// slicearray(old *any, uint64 nel, lb uint64, hb uint64, width uint64) (ary []any)
t = n->type;
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
if(n->right->left == N)
l = nodintconst(0);
else
l = conv(n->right->left, types[TUINT64]);
if(n->right->right == N)
- r = nodintconst(n->left->type->bound);
+ r = nodintconst(n->left->type->type->bound);
else
r = conv(n->right->right, types[TUINT64]);
n = mkcall1(fn, t, init,
- nod(OADDR, n->left, N), nodintconst(n->left->type->bound),
+ n->left, nodintconst(n->left->type->type->bound),
l,
r,
nodintconst(t->type->width));
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:;
Node *nvar, *nstar;
heapmoves(void)
{
NodeList *nn;
-
+ int32 lno;
+
+ lno = lineno;
+ lineno = curfn->lineno;
nn = paramstoheap(getthis(curfn->type), 0);
nn = concat(nn, paramstoheap(getinarg(curfn->type), 0));
nn = concat(nn, paramstoheap(getoutarg(curfn->type), 1));
curfn->enter = concat(curfn->enter, nn);
+ lineno = curfn->endlineno;
curfn->exit = returnsfromheap(getoutarg(curfn->type));
+ lineno = lno;
}
static Node*