shithub: mc

Download patch

ref: b4e37364481ba805a39e8699ce9ae0e78b85d6c0
parent: 3c9502102b2b01d6b32dad5f4f23f6f1fe736721
author: Ori Bernstein <[email protected]>
date: Fri Jun 7 20:55:49 EDT 2013

Add indexed initializer tree support.

    Needed to support indexed initialization of sequence literals.

--- a/parse/dump.c
+++ b/parse/dump.c
@@ -222,6 +222,11 @@
             fprintf(stderr, "Nnone not a real node type!");
             fprintf(fd, "Nnone\n");
             break;
+        case Nidxinit:
+            fprintf(fd, "\n");
+            outnode(n->idxinit.idx, fd, depth + 1);
+            outnode(n->idxinit.init, fd, depth + 1);
+            break;
     }
 }
 
--- a/parse/gram.y
+++ b/parse/gram.y
@@ -638,7 +638,8 @@
              {lappend(&$$.nl, &$$.nn, $3);}
         ;
 
-structelt: endlns Tdot Tident Tasn expr endlns {$$ = $5;}
+structelt: endlns Tdot Tident Tasn expr endlns 
+            {$$ = mkidxinit($2->line, mkname($3->line, $3->str), $5);}
          ;
 
 endlns  : /* none */
--- a/parse/infer.c
+++ b/parse/infer.c
@@ -1143,6 +1143,10 @@
             inferfunc(st, n);
             popstab();
             break;
+        case Nidxinit:
+            infernode(st, n->idxinit.idx, NULL, NULL);
+            infernode(st, n->idxinit.init, NULL, NULL);
+            break;
         case Nname:
         case Nlit:
         case Nuse:
@@ -1350,6 +1354,10 @@
                     break;
                 default:        break;
             }
+            break;
+        case Nidxinit:
+            typesub(st, n->idxinit.idx);
+            typesub(st, n->idxinit.init);
             break;
         case Nname:
         case Nuse:
--- a/parse/node.c
+++ b/parse/node.c
@@ -256,6 +256,17 @@
     return n;
 }
 
+Node *mkidxinit(int line, Node *idx, Node *init)
+{
+    Node *n;
+
+    n = mknode(line, Nidxinit);
+    n->idxinit.idx = idx;
+    n->idxinit.init = init;
+
+    return n;
+}
+
 Node *mkname(int line, char *name)
 {
     Node *n;
--- a/parse/nodes.def
+++ b/parse/nodes.def
@@ -11,3 +11,4 @@
 N(Nname)
 N(Ndecl)
 N(Nfunc)
+N(Nidxinit)
--- a/parse/parse.h
+++ b/parse/parse.h
@@ -222,6 +222,11 @@
         } match;
 
         struct {
+            Node *idx;
+            Node *init;
+        } idxinit;
+
+        struct {
             Stab *scope;
             size_t nstmts;
             Node **stmts;
@@ -387,6 +392,7 @@
 Node *mkmatch(int line, Node *pat, Node *body);
 Node *mkblock(int line, Stab *scope);
 Node *mkintlit(int line, uvlong val);
+Node *mkidxinit(int line, Node *idx, Node *init);
 
 Node *mkbool(int line, int val);
 Node *mkint(int line, uint64_t val);
--- a/parse/specialize.c
+++ b/parse/specialize.c
@@ -192,6 +192,9 @@
             fixup(n->func.body);
             popstab();
             break;
+        case Nidxinit:
+            fixup(n->idxinit.idx);
+            fixup(n->idxinit.init);
         case Nnone: case Nname:
             break;
     }
@@ -311,6 +314,10 @@
                 r->func.args[i] = specializenode(n->func.args[i], tsmap);
             r->func.body = specializenode(n->func.body, tsmap);
             popstab();
+            break;
+        case Nidxinit:
+            r->idxinit.idx = specializenode(n->idxinit.idx, tsmap);
+            r->idxinit.init = specializenode(n->idxinit.init, tsmap);
             break;
         case Nnone:
             die("Nnone should not be seen as node type!");
--- a/parse/use.c
+++ b/parse/use.c
@@ -413,6 +413,10 @@
                 pickle(n->func.args[i], fd);
             pickle(n->func.body, fd);
             break;
+        case Nidxinit:
+            pickle(n->idxinit.idx, fd);
+            pickle(n->idxinit.init, fd);
+            break;
         case Nnone:
             die("Nnone should not be seen as node type!");
             break;
@@ -546,6 +550,10 @@
             n->func.body = unpickle(fd);
             popstab();
             break;
+        case Nidxinit:
+            n->idxinit.idx = unpickle(fd);
+            n->idxinit.init = unpickle(fd);
+            break;
         case Nnone:
             die("Nnone should not be seen as node type!");
             break;
@@ -768,6 +776,11 @@
             for (i = 0; i < n->func.nargs; i++)
                 nodetag(n->func.args[i]);
             nodetag(n->func.body);
+            break;
+        case Nidxinit:
+            nodetag(n->idxinit.idx);
+            nodetag(n->idxinit.init);
+            break;
 
         case Nuse: case Nname:
             break;