ref: 1ee7b711a9622a60058e33f5a2b4e27bab47a42f
parent: f0003c878c3274a7f710cd240571875ddd904002
author: Ori Bernstein <[email protected]>
date: Wed Jun 6 09:59:45 EDT 2012
More work towards working slices. Implement more operators, don't error out as early.
--- a/8/isel.c
+++ b/8/isel.c
@@ -562,6 +562,7 @@
case Osubeq: case Omuleq: case Odiveq: case Omodeq: case Oboreq:
case Obandeq: case Obxoreq: case Obsleq: case Obsreq: case Omemb:
case Oslice: case Oidx: case Osize: case Numops:
+ case Oslbase: case Osllen:
dump(n, stdout);
die("Should not see %s in isel", opstr(exprop(n)));
break;
--- a/8/reduce.c
+++ b/8/reduce.c
@@ -294,7 +294,7 @@
if (args[0]->expr.type->type == Tyarray)
t = mkexpr(-1, Oaddr, args[0], NULL);
else if (args[0]->expr.type->type == Tyslice)
- die("Slice indexing not implemeneted yet");
+ t = mkexpr(-1, Oslbase, args[0], NULL);
else
die("Can't index type %s\n", tystr(n->expr.type));
u = rval(s, args[1]);
@@ -302,6 +302,21 @@
return r;
}
+static Node *slicebase(Simp *s, Node *n, Node *off)
+{
+ Node *t, *u;
+
+ t = rval(s, n);
+ u = NULL;
+ switch (n->expr.type->type) {
+ case Typtr: u = n;
+ case Tyarray: u = mkexpr(-1, Oaddr, n, NULL); break;
+ case Tyslice: u = mkexpr(-1, Oslbase, n, NULL); break;
+ default: die("Unslicable type %s", tystr(n->expr.type));
+ }
+ return mkexpr(-1, Oadd, u, off, NULL);
+}
+
Node *lval(Simp *s, Node *n)
{
Node *r;
@@ -319,10 +334,10 @@
return r;
}
-
Node *rval(Simp *s, Node *n)
{
- Node *r, *t, *u, *v;
+ Node *r; /* expression result */
+ Node *t, *u, *v; /* temporary nodes */
int i;
Node **args;
const Op fusedmap[] = {
@@ -345,8 +360,14 @@
switch (exprop(n)) {
case Obad:
case Olor: case Oland:
- case Oslice: case Osize:
+ case Osize:
die("Have not implemented lowering op %s", opstr(exprop(n)));
+ break;
+ case Oslice:
+ args[1] = rval(s, args[1]);
+ args[2] = rval(s, args[2]);
+ t = mkexpr(-1, Osub, args[2], args[1]);
+ args[0] = slicebase(s, args[0], t);
break;
case Oidx:
t = idxaddr(s, n);
--- a/parse/infer.c
+++ b/parse/infer.c
@@ -368,6 +368,7 @@
settype(n, mktyptr(n->line, mkty(-1, Tyvoid)));
case Obad: case Numops: case Ocjmp:
case Oload: case Ostor:
+ case Oslbase: case Osllen:
die("Should not see %s in fe", opstr(exprop(n)));
break;
}
--- a/parse/ops.def
+++ b/parse/ops.def
@@ -52,3 +52,5 @@
O(Ocjmp, 1) /* conditional jump */
O(Oload, 1) /* load from memory */
O(Ostor, 1) /* store to memory */
+O(Osllen, 1)
+O(Oslbase, 1)
--- a/parse/parse.h
+++ b/parse/parse.h
@@ -322,6 +322,7 @@
Node *mkname(int line, char *name);
Node *mkdecl(int line, Sym *sym);
Node *mklbl(int line, char *lbl);
+Node *mkslice(int line, Node *base, Node *off);
/* node util functions */
char *declname(Node *n);
--- a/test/slice.myr
+++ b/test/slice.myr
@@ -1,4 +1,4 @@
-const msin = {
+const main = {
var a : int[3]
var s