Commit fce222a9 authored by Scott Lawrence's avatar Scott Lawrence Committed by Russ Cox

gc: implement new slice spec

Fixes #382.

R=gri, cw, r, rsc
CC=golang-dev
https://golang.org/cl/1957045
parent 89e92318
...@@ -845,10 +845,6 @@ pexpr_no_paren: ...@@ -845,10 +845,6 @@ pexpr_no_paren:
} }
| pexpr '[' oexpr ':' oexpr ']' | pexpr '[' oexpr ':' oexpr ']'
{ {
if($3 == N) {
yyerror("missing lower bound in slice expression");
$3 = nodintconst(0);
}
$$ = nod(OSLICE, $1, nod(OKEY, $3, $5)); $$ = nod(OSLICE, $1, nod(OKEY, $3, $5));
} }
| pseudocall | pseudocall
......
...@@ -654,15 +654,13 @@ reswitch: ...@@ -654,15 +654,13 @@ reswitch:
typecheck(&n->left, top); typecheck(&n->left, top);
} }
implicitstar(&n->left); implicitstar(&n->left);
if(n->right->left == N) { if(n->right->left != N) {
yyerror("missing slice bounds?"); if((t = n->right->left->type) == T)
goto error; goto error;
if(!isint[t->etype]) {
yyerror("invalid slice index %#N (type %T)", n->right->left, t);
goto error;
} }
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(n->right->right != N) {
if((t = n->right->right->type) == T) if((t = n->right->right->type) == T)
......
...@@ -1095,13 +1095,17 @@ walkexpr(Node **np, NodeList **init) ...@@ -1095,13 +1095,17 @@ walkexpr(Node **np, NodeList **init)
// sliceslice(old []any, lb uint64, hb uint64, width uint64) (ary []any) // sliceslice(old []any, lb uint64, hb uint64, width uint64) (ary []any)
// sliceslice1(old []any, lb uint64, width uint64) (ary []any) // sliceslice1(old []any, lb uint64, width uint64) (ary []any)
t = n->type; t = n->type;
if(n->right->left == N)
l = nodintconst(0);
else
l = conv(n->right->left, types[TUINT64]);
if(n->right->right != N) { if(n->right->right != N) {
fn = syslook("sliceslice", 1); fn = syslook("sliceslice", 1);
argtype(fn, t->type); // any-1 argtype(fn, t->type); // any-1
argtype(fn, t->type); // any-2 argtype(fn, t->type); // any-2
n = mkcall1(fn, t, init, n = mkcall1(fn, t, init,
n->left, n->left,
conv(n->right->left, types[TUINT64]), l,
conv(n->right->right, types[TUINT64]), conv(n->right->right, types[TUINT64]),
nodintconst(t->type->width)); nodintconst(t->type->width));
} else { } else {
...@@ -1110,7 +1114,7 @@ walkexpr(Node **np, NodeList **init) ...@@ -1110,7 +1114,7 @@ walkexpr(Node **np, NodeList **init)
argtype(fn, t->type); // any-2 argtype(fn, t->type); // any-2
n = mkcall1(fn, t, init, n = mkcall1(fn, t, init,
n->left, n->left,
conv(n->right->left, types[TUINT64]), l,
nodintconst(t->type->width)); nodintconst(t->type->width));
} }
goto ret; goto ret;
...@@ -1122,13 +1126,17 @@ walkexpr(Node **np, NodeList **init) ...@@ -1122,13 +1126,17 @@ walkexpr(Node **np, NodeList **init)
fn = syslook("slicearray", 1); fn = syslook("slicearray", 1);
argtype(fn, n->left->type); // any-1 argtype(fn, n->left->type); // any-1
argtype(fn, t->type); // any-2 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) if(n->right->right == N)
r = nodintconst(n->left->type->bound); r = nodintconst(n->left->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), nod(OADDR, n->left, N), nodintconst(n->left->type->bound),
conv(n->right->left, types[TUINT64]), l,
r, r,
nodintconst(t->type->width)); nodintconst(t->type->width));
goto ret; goto ret;
...@@ -1213,15 +1221,19 @@ walkexpr(Node **np, NodeList **init) ...@@ -1213,15 +1221,19 @@ walkexpr(Node **np, NodeList **init)
case OSLICESTR: case OSLICESTR:
// sys_slicestring(s, lb, hb) // sys_slicestring(s, lb, hb)
if(n->right->left == N)
l = nodintconst(0);
else
l = conv(n->right->left, types[TINT]);
if(n->right->right) { if(n->right->right) {
n = mkcall("slicestring", n->type, init, n = mkcall("slicestring", n->type, init,
conv(n->left, types[TSTRING]), conv(n->left, types[TSTRING]),
conv(n->right->left, types[TINT]), l,
conv(n->right->right, types[TINT])); conv(n->right->right, types[TINT]));
} else { } else {
n = mkcall("slicestring1", n->type, init, n = mkcall("slicestring1", n->type, init,
conv(n->left, types[TSTRING]), conv(n->left, types[TSTRING]),
conv(n->right->left, types[TINT])); l);
} }
goto ret; goto ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment