shithub: mc

Download patch

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