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!");