diff options
Diffstat (limited to 'src/cmd/rc/code.c')
-rw-r--r-- | src/cmd/rc/code.c | 36 |
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]); |