aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/rc/code.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/rc/code.c')
-rw-r--r--src/cmd/rc/code.c36
1 files changed, 34 insertions, 2 deletions
diff --git a/src/cmd/rc/code.c b/src/cmd/rc/code.c
index 7077a0e..201ecc2 100644
--- a/src/cmd/rc/code.c
+++ b/src/cmd/rc/code.c
@@ -38,10 +38,22 @@ storepc(int a)
interpreter.code[a].i = interpreter.i;
}
+static char *
+funcstr(Tree *node)
+{
+ char *v;
+ Io *io = openstr();
+
+ print(io, "%t", node);
+ v = io->s, io->s = nil;
+ terminate(io);
+
+ return v;
+}
+
void yyerror(const char *msg);
-static
-void
+static void
walk(Tree *node)
{
Tree *n, *c;
@@ -68,6 +80,18 @@ walk(Tree *node)
emitf(Xcount);
break;
+ case Tfunc:
+ emitf(Xmark);
+ walk(node->child[0]);
+ emitf(Xfunc);
+ addr1 = emiti(0);
+ emits(funcstr(node->child[1])); // XXX: why?
+ walk(node->child[1]);
+ emitf(Xunlocal); /* clean $* */
+ emitf(Xreturn);
+ storepc(addr1);
+ break;
+
case Tjoin:
emitf(Xmark);
walk(node->child[0]);
@@ -228,6 +252,14 @@ walk(Tree *node)
storepc(addr3);
break;
+ case Ttwiddle:
+ emitf(Xmark);
+ walk(c->child[1]);
+ emitf(Xmark);
+ walk(c->child[0]);
+ emitf(Xmatch);
+ break;
+
case Twhile:
addr1 = interpreter.i; // head of loop
walk(node->child[0]);