shithub: mc

Download patch

ref: bb41de486617929a449e5ece1018c4ef66802658
parent: 060940410c47bea543fa9ef1518d533c63591597
parent: 1b71d38fed9e132d36aff99b74217b2d6ec83ccd
author: Ori Bernstein <[email protected]>
date: Wed Jul 11 06:50:56 EDT 2012

Merge branch 'master' of git+ssh://mimir.eigenstate.org/git/ori/mc2

--- a/8/isel.c
+++ b/8/isel.c
@@ -769,6 +769,10 @@
                         fprintf(fd, "%s:\n", lbl);
                         writeblob(fd, v->lit.strval, strlen(v->lit.strval));
                         break;
+        case Ltup:
+            for (i = 0; i < v->lit.nelt; i++)
+                writelit(fd, v->lit.tupval[i]->expr.args[0]);
+            break;
         case Lseq:
             for (i = 0; i < v->lit.nelt; i++)
                 writelit(fd, v->lit.seqval[i]->expr.args[0]);
--- a/8/simp.c
+++ b/8/simp.c
@@ -845,7 +845,7 @@
                 case Lchr: case Lbool: case Lint:
                     r = n;
                     break;
-                case Lstr: case Lseq: case Lflt:
+                case Lstr: case Lseq: case Ltup: case Lflt:
                     r = bloblit(s, n);
                     break;
                 case Lfunc:
--- a/parse/dump.c
+++ b/parse/dump.c
@@ -178,7 +178,11 @@
                     for (i = 0; i < n->lit.nelt; i++)
                         outnode(n->lit.seqval[i], fd, depth+1);
                     break;
-                default: die("Bad literal type"); break;
+                case Ltup:
+                    fprintf(fd, " Ltup\n");
+                    for (i = 0; i < n->lit.nelt; i++)
+                        outnode(n->lit.tupval[i], fd, depth+1);
+                    break;
             }
             break;
         case Nfunc:
--- a/parse/gram.y
+++ b/parse/gram.y
@@ -117,8 +117,9 @@
 
 %start module
 
-%type <ty> type structdef uniondef compoundtype functype funcsig
+%type <ty> type structdef uniondef tupledef compoundtype functype funcsig
 %type <ty> generictype
+%type <tylist> tuptybody
 
 %type <tok> asnop cmpop addop mulop shiftop
 
@@ -127,14 +128,15 @@
 %type <node> exprln retexpr expr atomicexpr littok literal asnexpr lorexpr landexpr borexpr
 %type <node> bandexpr cmpexpr unionexpr addexpr mulexpr shiftexpr prefixexpr postfixexpr
 %type <node> funclit seqlit name block blockbody stmt label use
-%type <node> decl declbody declcore structelt seqelt
+%type <node> decl declbody declcore structelt seqelt tuphead
 %type <node> ifstmt forstmt whilestmt matchstmt elifs optexprln
 %type <node> pat unionpat match
 %type <node> castexpr
 %type <ucon> unionelt
 
-%type <nodelist> arglist argdefs structbody params matches seqbody
-%type <uconlist> unionbody
+%type <nodelist> arglist argdefs params matches
+%type <nodelist> structbody seqbody tupbody tuprest
+%type <uconlist> unionbody 
 
 %union {
     struct {
@@ -176,6 +178,7 @@
 toplev
         : decl
             {lappend(&file->file.stmts, &file->file.nstmts, $1);
+             $1->decl.isglobl = 1;
              putdcl(file->file.globls, $1);}
         | use
             {lappend(&file->file.uses, &file->file.nuses, $1);}
@@ -224,7 +227,7 @@
 
 pkgitem : decl 
             {putdcl(file->file.exports, $1);
-            if ($1->decl.init)
+             if ($1->decl.init)
                  lappend(&file->file.stmts, &file->file.nstmts, $1);}
         | tydef {puttype(file->file.exports, mkname($1.line, $1.name), $1.type);}
         | visdef {die("Unimplemented visdef");}
@@ -263,6 +266,7 @@
         ;
 
 type    : structdef
+        | tupledef
         | uniondef
         | compoundtype
         | generictype
@@ -304,6 +308,18 @@
              $$.nn = 0;}
         ;
 
+tupledef: Tosqbrac tuptybody Tcsqbrac
+            {$$ = mktytuple($1->line, $2.types, $2.ntypes);}
+        ;
+
+tuptybody
+        : type 
+            {$$.types = NULL; $$.ntypes = 0;
+             lappend(&$$.types, &$$.ntypes, $1);}
+        | tuptybody Tcomma type
+            {lappend(&$$.types, &$$.ntypes, $3);}
+        ;
+
 structdef
         : Tstruct structbody Tendblk
             {$$ = mktystruct($1->line, $2.nl, $2.nn);}
@@ -488,10 +504,26 @@
         | literal {$$ = mkexpr($1->line, Olit, $1, NULL);}
         | Toparen expr Tcparen
             {$$ = $2;}
+        | Toparen tupbody Tcparen
+            {$$ = mkexpr($1->line, Olit, mktuple($1->line, $2.nl, $2.nn), NULL);}
         | Tsizeof Toparen type Tcparen
             {$$ = mkexpr($1->line, Osize, mkpseudodecl($3), NULL);}
         ;
 
+tupbody : tuphead tuprest
+            {$$ = $2;
+             linsert(&$$.nl, &$$.nn, 0, $1);}
+        ;
+
+tuphead : expr Tcomma {$$ = $1;}
+        ;
+
+tuprest : expr
+            {$$.nl = NULL; $$.nn = 0; lappend(&$$.nl, &$$.nn, $1);}
+        | tuprest Tcomma expr
+            {lappend(&$$.nl, &$$.nn, $3);}
+        ;
+
 literal : funclit       {$$ = $1;}
         | seqlit        {$$ = $1;}
         | littok        {$$ = $1;}
@@ -522,7 +554,8 @@
             {$$ = mkseq($1->line, $2.nl, $2.nn);}
         ;
 
-seqbody : seqelt
+seqbody : /* empty */ {$$.nl = NULL; $$.nn = 0;}
+        | seqelt
             {$$.nl = NULL; $$.nn = 0;
              lappend(&$$.nl, &$$.nn, $1);}
         | seqbody Tcomma seqelt
@@ -533,9 +566,11 @@
             {die("Unimplemented struct member init");}
         | Thash atomicexpr Tasn expr
             {die("Unimplmented array member init");}
-        | expr {$$ = $1;}
-        | Tendln seqelt {$$ = $2;}
-        | seqelt Tendln {$$ = $1;}
+        | endlns expr endlns{$$ = $2;}
+        ;
+
+endlns  : /* none */
+        | endlns Tendln
         ;
 
 stmt    : decl
--- a/parse/infer.c
+++ b/parse/infer.c
@@ -176,6 +176,7 @@
         case Lstr:      return mktyslice(n->line, mkty(n->line, Tychar));       break;
         case Lfunc:     return n->lit.fnval->func.type;                         break;
         case Lseq:      return NULL; break;
+        case Ltup:      return NULL; break;
     };
     die("Bad lit type %d", n->lit.littype);
     return NULL;
@@ -385,6 +386,19 @@
     settype(n, mktyarray(n->line, type(n->lit.seqval[0]), mkintlit(n->line, n->lit.nelt)));
 }
 
+static void infertup(Node *n)
+{
+    size_t i;
+    Type **t;
+
+    t = xalloc(sizeof(Type *)*n->lit.nelt);
+    for (i = 0; i < n->lit.nelt; i++) {
+        infernode(n->lit.tupval[i], NULL, NULL);
+        t[i] = type(n->lit.tupval[i]);
+    }
+    settype(n, mktytuple(n->line, t, n->lit.nelt));
+}
+
 static void inferexpr(Node *n, Type *ret, int *sawret)
 {
     Node **args;
@@ -544,6 +558,7 @@
             switch (args[0]->lit.littype) {
                 case Lfunc:     infernode(args[0]->lit.fnval, NULL, NULL); break;
                 case Lseq:      inferseq(args[0]);                         break;
+                case Ltup:      infertup(args[0]);                         break;
                 default:        /* pass */                                 break;
             }
             settype(n, type(args[0]));
--- a/parse/lits.def
+++ b/parse/lits.def
@@ -5,3 +5,4 @@
 L(Lstr)
 L(Lfunc)
 L(Lseq)
+L(Ltup)
--- a/parse/node.c
+++ b/parse/node.c
@@ -220,6 +220,18 @@
     return n;
 }
 
+Node *mktuple(int line, Node **vals, size_t nvals)
+{
+    Node *n;
+
+    n = mknode(line, Nlit);
+    n->lit.littype = Ltup;
+    n->lit.nelt = nvals;
+    n->lit.seqval = vals;
+
+    return n;
+}
+
 Node *mkname(int line, char *name)
 {
     Node *n;
--- a/parse/parse.h
+++ b/parse/parse.h
@@ -170,6 +170,7 @@
                 int      boolval;
                 Node    *fnval;
                 Node    **seqval;
+                Node    **tupval;
             };
         } lit;
 
@@ -209,9 +210,10 @@
 
         struct {
             long  did;
-            int   isconst;
-            int   isgeneric;
-            int   isextern;
+            char  isglobl;
+            char  isconst;
+            char  isgeneric;
+            char  isextern;
             Node *name;
             Type *type;
             Node *init;
@@ -329,6 +331,7 @@
 Type *mktyslice(int line, Type *base);
 Type *mktyidxhack(int line, Type *base);
 Type *mktyptr(int line, Type *base);
+Type *mktytuple(int line, Type **sub, size_t nsub);
 Type *mktyfunc(int line, Node **args, size_t nargs, Type *ret);
 Type *mktystruct(int line, Node **decls, size_t ndecls);
 Type *mktyunion(int line, Ucon **decls, size_t ndecls);
@@ -364,6 +367,7 @@
 Node *mkfloat(int line, double flt);
 Node *mkfunc(int line, Node **args, size_t nargs, Type *ret, Node *body);
 Node *mkseq(int line, Node **vals, size_t nvals);
+Node *mktuple(int line, Node **vals, size_t nvals);
 Node *mkname(int line, char *name);
 Node *mknsname(int line, char *ns, char *name);
 Node *mkdecl(int line, Node *name, Type *ty);
--- a/parse/pickle.c
+++ b/parse/pickle.c
@@ -316,6 +316,10 @@
                     for (i = 0; i < n->lit.nelt; i++)
                         pickle(n->lit.seqval[i], fd);
                     break;
+                case Ltup:
+                    for (i = 0; i < n->lit.nelt; i++)
+                        pickle(n->lit.tupval[i], fd);
+                    break;
             }
             break;
         case Nloopstmt:
@@ -432,6 +436,10 @@
                 case Lseq:
                     for (i = 0; i < n->lit.nelt; i++)
                         n->lit.seqval[i] = unpickle(fd);
+                    break;
+                case Ltup:
+                    for (i = 0; i < n->lit.nelt; i++)
+                        n->lit.tupval[i] = unpickle(fd);
                     break;
             }
             break;
--- a/parse/specialize.c
+++ b/parse/specialize.c
@@ -106,6 +106,10 @@
                     for (i = 0; i < n->lit.nelt; i++)
                         fixup(n->lit.seqval[i]);
                     break;
+                case Ltup:
+                    for (i = 0; i < n->lit.nelt; i++)
+                        fixup(n->lit.tupval[i]);
+                    break;
                 case Lchr: case Lint: case Lflt: case Lstr: case Lbool:
                     break;
             }
@@ -188,6 +192,9 @@
                 case Lseq:
                     for (i = 0; i < n->lit.nelt; i++)
                         r->lit.seqval[i] = specializenode(n->lit.seqval[i], tsmap);
+                case Ltup:
+                    for (i = 0; i < n->lit.nelt; i++)
+                        r->lit.tupval[i] = specializenode(n->lit.tupval[i], tsmap);
                     break;
             }
             break;
--- a/parse/stab.c
+++ b/parse/stab.c
@@ -78,7 +78,7 @@
             /* record that this is in the closure of this scope */
             if (!st->closure)
                 st->closure = mkht(namehash, nameeq);
-            if (st != orig)
+            if (st != orig && !n->decl.isglobl)
                 htput(st->closure, s->decl.name, s);
             return s;
         }
--- a/parse/type.c
+++ b/parse/type.c
@@ -177,6 +177,19 @@
     return t;
 }
 
+Type *mktytuple(int line, Type **sub, size_t nsub)
+{
+    Type *t;
+    size_t i;
+
+    t = mkty(line, Tyfunc);
+    t->nsub = nsub;
+    t->sub = xalloc(nsub*sizeof(Type));
+    for (i = 0; i < nsub; i++)
+        t->sub[i] = sub[i];
+    return t;
+}
+
 Type *mktyfunc(int line, Node **args, size_t nargs, Type *ret)
 {
     Type *t;
--- /dev/null
+++ b/test/closure.myr
@@ -1,0 +1,7 @@
+const main = {
+	var a = 42
+	var f = {b
+		-> a + b
+	}
+	-> f(13)
+}
--- a/test/tests
+++ b/test/tests
@@ -32,6 +32,7 @@
 B voidcall	E	12
 B callbig	E	42
 B nestfn	E	42
+B closure	E	55
 B loop		E	45
 B fib		E	21
 B float		E	1