From e4f9b993e97b6e6e790810b6d261dc5bf61b0513 Mon Sep 17 00:00:00 2001 From: Nicholas Date: Mon, 15 Nov 2021 19:48:42 -0800 Subject: Feat: added functions --- src/cmd/rc/code.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) (limited to 'src/cmd/rc/code.c') 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]); -- cgit v1.2.1