case expression with discardable result works

This commit is contained in:
Araq 2013-12-18 07:28:25 +01:00
commit 3d869d4dec

View file

@ -206,6 +206,9 @@ proc genx(c: PCtx; n: PNode): TRegister =
gen(c, n, tmp) gen(c, n, tmp)
result = TRegister(tmp) result = TRegister(tmp)
proc clearDest(n: PNode; dest: var TDest) {.inline.} =
if isEmptyType(n.typ): dest = -1
proc isNotOpr(n: PNode): bool = proc isNotOpr(n: PNode): bool =
n.kind in nkCallKinds and n.sons[0].kind == nkSym and n.kind in nkCallKinds and n.sons[0].kind == nkSym and
n.sons[0].sym.magic == mNot 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) = proc genBlock(c: PCtx; n: PNode; dest: var TDest) =
withBlock(n.sons[0].sym): withBlock(n.sons[0].sym):
c.gen(n.sons[1], dest) c.gen(n.sons[1], dest)
clearDest(n, dest)
proc genBreak(c: PCtx; n: PNode) = proc genBreak(c: PCtx; n: PNode) =
let L1 = c.xjmp(n, opcJmp) let L1 = c.xjmp(n, opcJmp)
@ -288,6 +292,7 @@ proc genIf(c: PCtx, n: PNode; dest: var TDest) =
else: else:
c.gen(it.sons[0], dest) c.gen(it.sons[0], dest)
for endPos in endings: c.patch(endPos) for endPos in endings: c.patch(endPos)
clearDest(n, dest)
proc genAndOr(c: PCtx; n: PNode; opc: TOpcode; dest: var TDest) = proc genAndOr(c: PCtx; n: PNode; opc: TOpcode; dest: var TDest) =
# asgn dest, a # asgn dest, a
@ -369,6 +374,7 @@ proc genCase(c: PCtx; n: PNode; dest: var TDest) =
endings.add(c.xjmp(it.lastSon, opcJmp, 0)) endings.add(c.xjmp(it.lastSon, opcJmp, 0))
c.patch(elsePos) c.patch(elsePos)
for endPos in endings: c.patch(endPos) for endPos in endings: c.patch(endPos)
clearDest(n, dest)
proc genType(c: PCtx; typ: PType): int = proc genType(c: PCtx; typ: PType): int =
for i, t in c.types: for i, t in c.types:
@ -408,6 +414,7 @@ proc genTry(c: PCtx; n: PNode; dest: var TDest) =
if fin.kind == nkFinally: if fin.kind == nkFinally:
c.gen(fin.sons[0], dest) c.gen(fin.sons[0], dest)
c.gABx(fin, opcFinallyEnd, 0, 0) c.gABx(fin, opcFinallyEnd, 0, 0)
clearDest(n, dest)
proc genRaise(c: PCtx; n: PNode) = proc genRaise(c: PCtx; n: PNode) =
let dest = genx(c, n.sons[0]) let dest = genx(c, n.sons[0])
@ -435,6 +442,7 @@ proc genCall(c: PCtx; n: PNode; dest: var TDest) =
else: else:
c.gABC(n, opcIndCallAsgn, dest, x, n.len) c.gABC(n, opcIndCallAsgn, dest, x, n.len)
c.freeTempRange(x, n.len) c.freeTempRange(x, n.len)
clearDest(n, dest)
proc genNew(c: PCtx; n: PNode) = proc genNew(c: PCtx; n: PNode) =
let dest = c.genx(n.sons[1]) let dest = c.genx(n.sons[1])