shithub: mc

Download patch

ref: fbbdeabda88a0262e59d68fcf5227c165d673afe
parent: e119045a1d483c7dc7808c140a3659e41b9d160b
author: Ori Bernstein <[email protected]>
date: Sat Jun 8 08:47:09 EDT 2013

Add support for compiling struct literals.

--- a/6/isel.c
+++ b/6/isel.c
@@ -877,6 +877,7 @@
 {
     char lbl[128];
     size_t i;
+    Node *val;
     char *intsz[] = {
         [1] = ".byte",
         [2] = ".short",
@@ -896,12 +897,16 @@
                         writeblob(fd, v->lit.strval, strlen(v->lit.strval));
                         break;
         case Larray:
-            for (i = 0; i < v->lit.nelt; i++)
-                writelit(fd, v->lit.seqval[i]->expr.args[0], size(v->lit.seqval[i]));
+            for (i = 0; i < v->lit.nelt; i++) {
+                val = v->lit.seqval[i]->idxinit.init;
+                writelit(fd, val->expr.args[0], size(val));
+            }
             break;
         case Lstruct:
-            for (i = 0; i < v->lit.nelt; i++)
-                writelit(fd, v->lit.seqval[i]->expr.args[0], size(v->lit.seqval[i]));
+            for (i = 0; i < v->lit.nelt; i++) {
+                val = v->lit.seqval[i]->idxinit.init;
+                writelit(fd, val->expr.args[0], size(val));
+            }
             break;
         case Lfunc:
             die("Generating this shit ain't ready yet ");
--- a/parse/gram.y
+++ b/parse/gram.y
@@ -622,9 +622,9 @@
         : /* empty */
         | arrayelt
             {$$.nl = NULL; $$.nn = 0;
-             lappend(&$$.nl, &$$.nn, $1);}
+             lappend(&$$.nl, &$$.nn, mkidxinit($1->line, mkint($1->line, 0), $1));}
         | arrayelts Tcomma arrayelt
-             {lappend(&$$.nl, &$$.nn, $3);}
+             {lappend(&$$.nl, &$$.nn, mkidxinit($3->line, mkint($3->line, $$.nn), $3));}
 
 arrayelt: endlns expr endlns {$$ = $2;}
         ;
--- a/parse/infer.c
+++ b/parse/infer.c
@@ -339,6 +339,7 @@
       case Nexpr:       t = n->expr.type;       break;
       case Ndecl:       t = decltype(n);        break;
       case Nfunc:       t = n->func.type;       break;
+      case Nidxinit:    t = type(st, n->idxinit.init); break;
       default:
         t = NULL;
         die("untypeable node %s", nodestr(n->type));
--- a/test/structlit.myr
+++ b/test/structlit.myr
@@ -1,3 +1,5 @@
+use std
+
 /* checks that we can create struct literals with named initializers.
 	exits with 42. */
 type t = struct