shithub: mc

Download patch

ref: 9e6df79b9758504cb7c1d965bce61d8ae9cf7c62
parent: e79cc81b134141763a5e0b92a5f4bb8743ac990b
author: Ori Bernstein <[email protected]>
date: Mon Jun 4 17:33:28 EDT 2012

Add in tyidxhack for indexing.

--- a/8/reduce.c
+++ b/8/reduce.c
@@ -107,11 +107,7 @@
         case Tyunion:
             die("Sizes for composite types not implemented yet");
             break;
-        case Tybad:
-        case Tyvar:
-        case Typaram:
-        case Tyname:
-        case Ntypes:
+        case Tybad: case Tyvar: case Typaram: case Tyname: case Tyidxhack: case Ntypes:
             die("Type %s does not have size; why did it get down to here?", tystr(t));
             break;
     }
--- a/parse/infer.c
+++ b/parse/infer.c
@@ -293,10 +293,14 @@
             settype(n, t);
             break;
         case Oidx:      /* @a[@b::tcint] -> @a */
-            die("inference of indexes not done yet");
+	    t = mktyidxhack(n->line, type(args[1]));
+	    t = unify(n, type(args[0]), t);
+	    settype(n, t);
             break;
         case Oslice:    /* @a[@b::tcint,@b::tcint] -> @a[,] */
-            die("inference of slices not done yet");
+	    t = mktyidxhack(n->line, type(args[1]));
+	    t = unify(n, type(args[0]), t);
+	    settype(n, t);
             break;
 
         /* special cases */
--- a/parse/parse.h
+++ b/parse/parse.h
@@ -283,6 +283,7 @@
 Type *mktynamed(int line, Node *name);
 Type *mktyarray(int line, Type *base, Node *sz);
 Type *mktyslice(int line, Type *base);
+Type *mktyidxhack(int line, Type *base);
 Type *mktyptr(int line, Type *base);
 Type *mktyfunc(int line, Node **args, size_t nargs, Type *ret);
 Type *mktystruct(int line, Node **decls, size_t ndecls);
--- a/parse/type.c
+++ b/parse/type.c
@@ -143,6 +143,16 @@
     return t;
 }
 
+Type *mktyidxhack(int line, Type *base)
+{
+    Type *t;
+
+    t = mkty(line, Tyidxhack);
+    t->sub = xalloc(sizeof(Type*));
+    t->sub[0] = base;
+    return t;
+}
+
 Type *mktyptr(int line, Type *base)
 {
     Type *t;
@@ -344,6 +354,11 @@
         case Tyarray:
             p += tybfmt(p, end - p, t->sub[0]);
             p += snprintf(p, end - p, "[LEN]");
+            break;
+        case Tyidxhack:
+	    p += snprintf(p, end - p, "Tyidxhack(");
+            p += tybfmt(p, end - p, t->sub[0]);
+            p += snprintf(p, end - p, ")[]");
             break;
         case Tyfunc:
             p += snprintf(p, end - p, "(");
--- a/parse/types.def
+++ b/parse/types.def
@@ -31,6 +31,7 @@
 Ty(Typtr, NULL)
 Ty(Tyslice, NULL)
 Ty(Tyarray, NULL)
+Ty(Tyidxhack, NULL)
 Ty(Tyfunc, NULL)
 Ty(Tytuple, NULL)
 Ty(Tyvar, NULL)