diff options
author | Araq <rumpf_a@web.de> | 2013-12-18 07:28:25 +0100 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2013-12-18 07:28:25 +0100 |
commit | 3d869d4decb336c1396a0bfe4db24ea9dcda043e (patch) | |
tree | 4b0c054a68e21fd304a0250cfa19cb4638c3cde9 | |
parent | f095e51275a2780ac3e69509c3bb0b75c1c324fb (diff) | |
download | Nim-3d869d4decb336c1396a0bfe4db24ea9dcda043e.tar.gz |
case expression with discardable result works
-rw-r--r-- | compiler/vmgen.nim | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim index c53d39985..134b2d15a 100644 --- a/compiler/vmgen.nim +++ b/compiler/vmgen.nim @@ -206,6 +206,9 @@ proc genx(c: PCtx; n: PNode): TRegister = gen(c, n, tmp) result = TRegister(tmp) +proc clearDest(n: PNode; dest: var TDest) {.inline.} = + if isEmptyType(n.typ): dest = -1 + proc isNotOpr(n: PNode): bool = n.kind in nkCallKinds and n.sons[0].kind == nkSym and n.sons[0].sym.magic == mNot @@ -244,6 +247,7 @@ proc genWhile(c: PCtx; n: PNode) = proc genBlock(c: PCtx; n: PNode; dest: var TDest) = withBlock(n.sons[0].sym): c.gen(n.sons[1], dest) + clearDest(n, dest) proc genBreak(c: PCtx; n: PNode) = let L1 = c.xjmp(n, opcJmp) @@ -288,6 +292,7 @@ proc genIf(c: PCtx, n: PNode; dest: var TDest) = else: c.gen(it.sons[0], dest) for endPos in endings: c.patch(endPos) + clearDest(n, dest) proc genAndOr(c: PCtx; n: PNode; opc: TOpcode; dest: var TDest) = # asgn dest, a @@ -369,6 +374,7 @@ proc genCase(c: PCtx; n: PNode; dest: var TDest) = endings.add(c.xjmp(it.lastSon, opcJmp, 0)) c.patch(elsePos) for endPos in endings: c.patch(endPos) + clearDest(n, dest) proc genType(c: PCtx; typ: PType): int = for i, t in c.types: @@ -408,6 +414,7 @@ proc genTry(c: PCtx; n: PNode; dest: var TDest) = if fin.kind == nkFinally: c.gen(fin.sons[0], dest) c.gABx(fin, opcFinallyEnd, 0, 0) + clearDest(n, dest) proc genRaise(c: PCtx; n: PNode) = let dest = genx(c, n.sons[0]) @@ -435,6 +442,7 @@ proc genCall(c: PCtx; n: PNode; dest: var TDest) = else: c.gABC(n, opcIndCallAsgn, dest, x, n.len) c.freeTempRange(x, n.len) + clearDest(n, dest) proc genNew(c: PCtx; n: PNode) = let dest = c.genx(n.sons[1]) |