shithub: mc

Download patch

ref: c798301cfa0f19e9d044f2afd0886afd6ac2a298
parent: 8510d8a1f452aed36421c7562aa9c7caa5575a03
author: Ori Bernstein <[email protected]>
date: Sun Jun 17 08:21:14 EDT 2012

Reduce sizes on slices and arrays

--- a/8/reduce.c
+++ b/8/reduce.c
@@ -333,6 +333,16 @@
     return mkexpr(n->line, Oadd, u, v, NULL);
 }
 
+static Node *slicelen(Simp *s, Node *sl)
+{
+    Node *base, *memb, *load;
+
+    base = mkexpr(sl->line, Oaddr, sl, NULL);
+    memb = mkexpr(sl->line, Oadd, base, ptrsz, NULL);
+    load = mkexpr(sl->line, Oload, memb, NULL);
+    return load;
+}
+
 Node *lval(Simp *s, Node *n)
 {
     Node *r;
@@ -339,8 +349,8 @@
 
     switch (exprop(n)) {
         case Ovar:      r = n;  break;
-        case Omemb:     r = membaddr(s, n);     break;
         case Oidx:      r = idxaddr(s, n);      break;
+        case Omemb:     r = membaddr(s, n);     break;
         default:
             die("%s cannot be an lval", opstr(exprop(n)));
             break;
@@ -428,8 +438,16 @@
             r = mkexpr(n->line, Oload, t, NULL);
             break;
         case Omemb:
-            t = membaddr(s, n);
-            r = mkexpr(n->line, Oload, t, NULL);
+            if (exprtype(args[0])->type == Tyslice) {
+                assert(!strcmp(namestr(args[1]), "len"));
+                r = slicelen(s, args[0]);
+            } else if (exprtype(args[0])->type == Tyarray) {
+                assert(!strcmp(namestr(args[1]), "len"));
+                r = exprtype(n)->asize;
+            } else {
+                t = membaddr(s, n);
+                r = mkexpr(n->line, Oload, t, NULL);
+            }
             break;
 
         /* fused ops: