shithub: mc

Download patch

ref: 196258441277732b8ab24471404b7fd21a81987a
parent: 3e51d386096b13c255d6aec4406f85548e9e7d63
author: Ori Bernstein <[email protected]>
date: Sat Feb 1 06:14:46 EST 2014

Stub in more code for trait/impl.

    We now make Impl nodes, and then die when we try to use them.

--- a/myrtypes/myrtypes.c
+++ b/myrtypes/myrtypes.c
@@ -109,8 +109,8 @@
             printf("Body:\n");
             dumptypes(n->func.body, indent + 1);
             break;
-        case Ntrait:
-            die("Traits not fully implemented\n");
+        case Ntrait: case Nimpl:
+            die("Ntrait/Nimpl not yet supported!");
             break;
         case Nname:
             break;
--- a/parse/dump.c
+++ b/parse/dump.c
@@ -227,7 +227,10 @@
             fprintf(fd, ")\n");
             break;
         case Ntrait:
-            fprintf(fd, "Trait definition");
+            die("Trait definition");
+            break;
+        case Nimpl:
+            die("Impl definition");
             break;
         case Nnone:
             fprintf(stderr, "Nnone not a real node type!");
--- a/parse/gram.y
+++ b/parse/gram.y
@@ -306,10 +306,8 @@
             {$$ = $3; setns($3, $1->str);}
         ;
 
-implstmt: Timpl name type {
-            $$ = NULL;
-            die("impl foo not done");
-            }
+implstmt: Timpl name type 
+            {$$ = mkimplstmt($1->line, $2, $3);}
         ;
 
 traitdef: Ttrait Tident generictype Tasn traitbody Tendblk
--- a/parse/infer.c
+++ b/parse/infer.c
@@ -1425,6 +1425,9 @@
         case Ntrait:
             die("Trait inference not yet implemented\n");
             break;
+        case Nimpl:
+            die("Impl not yet implemented\n");
+            break;
         case Nname:
         case Nlit:
         case Nuse:
@@ -1742,6 +1745,9 @@
         case Ntrait:
             die("Trait inference not yet implemented\n");
             break;
+        case Nimpl:
+            die("Trait inference not yet implemented\n");
+            break;
         case Nname:
         case Nuse:
             break;
@@ -1852,6 +1858,9 @@
             break;
         case Ntrait:
             die("Trait inference not yet implemented\n");
+            break;
+        case Nimpl:
+            die("Impl not yet implemented\n");
             break;
 
         case Nuse: case Nname:
--- a/parse/node.c
+++ b/parse/node.c
@@ -196,6 +196,17 @@
     return n;
 }
 
+Node *mkimplstmt(int line, Node *name, Type *t)
+{
+    Node *n;
+
+    n = mknode(line, Nimpl);
+    n->impl.traitname = name;
+    n->impl.type = t;
+    return n;
+}
+
+
 Node *mkintlit(int line, uvlong val)
 {
     return mkexpr(line, Olit, mkint(line, val), NULL);
--- a/parse/nodes.def
+++ b/parse/nodes.def
@@ -13,3 +13,4 @@
 N(Ndecl)
 N(Nfunc)
 N(Ntrait)
+N(Nimpl)
--- a/parse/parse.h
+++ b/parse/parse.h
@@ -284,7 +284,10 @@
             size_t nmembs;
         } trait;
 
-            
+        struct {
+            Node *traitname;
+            Type *type;
+        } impl;
     };
 };
 
@@ -430,6 +433,7 @@
 Node *mkmatch(int line, Node *pat, Node *body);
 Node *mkblock(int line, Stab *scope);
 Node *mktraitdef(int line, Node *name, Node **funcs, size_t nfuncs, Node **membs, size_t nmembs);
+Node *mkimplstmt(int line, Node *name, Type *type);
 Node *mkintlit(int line, uvlong val);
 Node *mkidxinit(int line, Node *idx, Node *init);
 
--- a/parse/specialize.c
+++ b/parse/specialize.c
@@ -222,8 +222,11 @@
             fixup(n->func.body);
             popstab();
             break;
-        case Nnone: case Nname: case Ntrait:
+        case Nnone: case Nname:
             break;
+        case Ntrait: case Nimpl:
+            die("trait/impl not implemented");
+            break;
     }
 }
 
@@ -340,8 +343,8 @@
             r->func.body = specializenode(n->func.body, tsmap);
             popstab();
             break;
-        case Ntrait:
-            break;
+        case Ntrait: case Nimpl:
+            die("trait/impl not implemented");
         case Nnone:
             die("Nnone should not be seen as node type!");
             break;
--- a/parse/use.c
+++ b/parse/use.c
@@ -461,8 +461,8 @@
                 pickle(n->func.args[i], fd);
             pickle(n->func.body, fd);
             break;
-        case Ntrait:
-            die("Ntrait not yet supported!");
+        case Ntrait: case Nimpl:
+            die("Ntrait/Nimpl not yet supported!");
             break;
         case Nnone:
             die("Nnone should not be seen as node type!");
@@ -596,8 +596,8 @@
             n->func.body = unpickle(fd);
             popstab();
             break;
-        case Ntrait:
-            die("Ntrait not yet implemented");
+        case Ntrait: case Nimpl:
+            die("Ntrait/Nimpl not yet supported!");
             break;
         case Nnone:
             die("Nnone should not be seen as node type!");