aboutsummaryrefslogtreecommitdiff
path: root/sys/cmd/rc/code.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/cmd/rc/code.c')
-rw-r--r--sys/cmd/rc/code.c89
1 files changed, 53 insertions, 36 deletions
diff --git a/sys/cmd/rc/code.c b/sys/cmd/rc/code.c
index 46873ef..bcc3d38 100644
--- a/sys/cmd/rc/code.c
+++ b/sys/cmd/rc/code.c
@@ -85,35 +85,35 @@ walk(Tree *node)
emitf(Xconcatenate);
break;
- case Targs:
- walk(node->child[1]);
+ case Tandand:
walk(node->child[0]);
+ emitf(Xtrue);
+ addr1 = emiti(0);
+ walk(node->child[1]);
+ storepc(addr1);
break;
- case Tparen: case Tblock:
+ case Toror:
walk(node->child[0]);
+ emitf(Xfalse);
+ addr1 = emiti(0);
+ walk(node->child[1]);
+ storepc(addr1);
break;
- case Tbasic:
- emitf(Xmark);
+ case Targs:
+ walk(node->child[1]);
walk(node->child[0]);
- emitf(Xbasic);
break;
- case '&':
- emitf(Xasync);
- addr1 = emiti(0);
+ case Tparen: case Tblock:
walk(node->child[0]);
- emitf(Xexit);
- storepc(addr1);
break;
- case Tsubshell:
- emitf(Xsubshell);
- addr1 = emiti(0);
+ case Tbasic:
+ emitf(Xmark);
walk(node->child[0]);
- emitf(Xexit);
- storepc(addr1);
+ emitf(Xbasic);
break;
case Tbang:
@@ -130,26 +130,6 @@ walk(Tree *node)
walk(node->child[0]);
break;
- case Tpipe:
- emitf(Xpipe);
-
- emiti(node->redir.fd[0]);
- emiti(node->redir.fd[1]);
- addr1 = emiti(0);
- addr2 = emiti(0);
-
- walk(node->child[0]);
- emitf(Xexit);
- storepc(addr1);
-
- walk(node->child[1]);
- emitf(Xreturn);
- storepc(addr2);
-
- emitf(Xpipewait);
-
- break;
-
case '=':
for(n=node; node && node->type == '='; node = node->child[2])
;
@@ -175,6 +155,43 @@ walk(Tree *node)
}
node = n;
break;
+
+ /* forks */
+ case '&':
+ emitf(Xasync);
+ addr1 = emiti(0);
+ walk(node->child[0]);
+ emitf(Xexit);
+ storepc(addr1);
+ break;
+
+ case Tsubshell:
+ emitf(Xsubshell);
+ addr1 = emiti(0);
+ walk(node->child[0]);
+ emitf(Xexit);
+ storepc(addr1);
+ break;
+
+ case Tpipe:
+ emitf(Xpipe);
+
+ emiti(node->redir.fd[0]);
+ emiti(node->redir.fd[1]);
+ addr1 = emiti(0);
+ addr2 = emiti(0);
+
+ walk(node->child[0]);
+ emitf(Xexit);
+ storepc(addr1);
+
+ walk(node->child[1]);
+ emitf(Xreturn);
+ storepc(addr2);
+
+ emitf(Xpipewait);
+
+ break;
}
}