shithub: mc

Download patch

ref: 8a41392deeff765bda28b910e1d5d62397fe8d32
parent: c2d507cdfe2d67c5d3bb4cc01cec2f0614421599
author: Ori Bernstein <[email protected]>
date: Wed Aug 1 21:08:49 EDT 2012

Convert array sizes.

    Since we decided to make 'len' generic, we need to do the right
    conversions to make it work.

--- a/6/isel.c
+++ b/6/isel.c
@@ -154,7 +154,6 @@
         g(s, Imovz, src, dst, NULL);
 }
 
-
 static void load(Isel *s, Loc *a, Loc *b)
 {
     Loc *l;
@@ -584,6 +583,7 @@
             break;
         case Ozwiden:
             a = selexpr(s, args[0]);
+            a = inr(s, a);
             b = locreg(mode(n));
             movz(s, a, b);
             r = b;
@@ -590,6 +590,7 @@
             break;
         case Oswiden:
             a = selexpr(s, args[0]);
+            a = inr(s, a);
             b = locreg(mode(n));
             g(s, Imovs, a, b, NULL);
             r = b;
--- a/6/simp.c
+++ b/6/simp.c
@@ -711,9 +711,8 @@
     return t;
 }
 
-static Node *simpcast(Simp *s, Node *n)
+static Node *simpcast(Simp *s, Node *val, Type *to)
 {
-    Node **args;
     Node *sz;
     Node *r;
     Type *t;
@@ -722,22 +721,21 @@
 
     issigned = 0;
     r = NULL;
-    args = n->expr.args;
-    switch (tybase(exprtype(n))->type) {
+    switch (tybase(to)->type) {
         case Tyint8: case Tyint16: case Tyint32: case Tyint64:
         case Tyuint8: case Tyuint16: case Tyuint32: case Tyuint64:
         case Tyint: case Tyuint: case Tylong: case Tyulong:
         case Tychar: case Tybyte:
         case Typtr:
-            t = tybase(exprtype(args[0]));
+            t = tybase(exprtype(val));
             switch (t->type) {
                 case Tyslice:
                     if (t->type == Typtr)
-                        fatal(n->line, "Bad cast from %s to %s",
-                              tystr(exprtype(args[0])), tystr(exprtype(n)));
-                    sz = mkintlit(n->line, Ptrsz);
-                    sz->expr.type = exprtype(args[0]);
-                    r = slicebase(s, args[0], sz);
+                        fatal(val->line, "Bad cast from %s to %s",
+                              tystr(exprtype(val)), tystr(to));
+                    sz = mkintlit(val->line, Ptrsz);
+                    sz->expr.type = exprtype(val);
+                    r = slicebase(s, val, sz);
                     break;
                 case Tyint8: case Tyint16: case Tyint32: case Tyint64:
                 case Tyint: case Tylong:
@@ -745,27 +743,27 @@
                 case Tyuint8: case Tyuint16: case Tyuint32: case Tyuint64:
                 case Tyuint: case Tyulong: case Tychar: case Tybyte:
                 case Typtr:
-                    fromsz = size(args[0]);
-                    tosz = size(n);
-                    r = rval(s, args[0], NULL);
+                    fromsz = size(val);
+                    tosz = tysize(to);
+                    r = rval(s, val, NULL);
                     if (fromsz > tosz) {
-                        r = mkexpr(n->line, Otrunc, r, NULL);
+                        r = mkexpr(val->line, Otrunc, r, NULL);
                     } else if (tosz > fromsz) {
                         if (issigned)
-                            r = mkexpr(n->line, Oswiden, r, NULL);
+                            r = mkexpr(val->line, Oswiden, r, NULL);
                         else
-                            r = mkexpr(n->line, Ozwiden, r, NULL);
+                            r = mkexpr(val->line, Ozwiden, r, NULL);
                     }
-                    r->expr.type = n->expr.type;
+                    r->expr.type = to;
                     break;
                 default:
-                    fatal(n->line, "Bad cast from %s to %s",
-                          tystr(exprtype(args[0])), tystr(exprtype(n)));
+                    fatal(val->line, "Bad cast from %s to %s",
+                          tystr(exprtype(val)), tystr(to));
             }
             break;
         default:
-            fatal(n->line, "Bad cast from %s to %s",
-                  tystr(exprtype(args[0])), tystr(exprtype(n)));
+            fatal(val->line, "Bad cast from %s to %s",
+                  tystr(exprtype(val)), tystr(to));
     }
     return r;
 }
@@ -962,10 +960,12 @@
         case Omemb:
             if (exprtype(args[0])->type == Tyslice) {
                 assert(!strcmp(namestr(args[1]), "len"));
-                r = slicelen(s, args[0]);
+                t = slicelen(s, args[0]);
+                r = simpcast(s, t, exprtype(n));
             } else if (exprtype(args[0])->type == Tyarray) {
                 assert(!strcmp(namestr(args[1]), "len"));
-                r = exprtype(args[0])->asize;
+                t = exprtype(args[0])->asize;
+                r = simpcast(s, t, exprtype(n));
             } else {
                 t = membaddr(s, n);
                 r = load(t);
@@ -978,8 +978,7 @@
             r = simptup(s, n, dst);
             break;
         case Ocast:
-            /* slice -> ptr cast */
-            r = simpcast(s, n);
+            r = simpcast(s, args[0], exprtype(n));
             break;
 
         /* fused ops: