diff --git a/compiler/liftdestructors.nim b/compiler/liftdestructors.nim index 026a288939..e9be2ed18f 100644 --- a/compiler/liftdestructors.nim +++ b/compiler/liftdestructors.nim @@ -292,7 +292,7 @@ proc forallElements(c: var TLiftCtx; t: PType; body, x, y: PNode) = let whileLoop = genWhileLoop(c, i, x) let elemType = t.lastSon fillBody(c, elemType, whileLoop.sons[1], x.at(i, elemType), - y.at(i, elemType)) + y.at(i, elemType)) addIncStmt(c, whileLoop.sons[1], i) body.add whileLoop diff --git a/compiler/semmagic.nim b/compiler/semmagic.nim index 47ade51914..1472cd2f36 100644 --- a/compiler/semmagic.nim +++ b/compiler/semmagic.nim @@ -355,6 +355,8 @@ proc semUnown(c: PContext; n: PNode): PNode = result = copyTree(n[1]) result.typ = unownedType(c, result.typ) + # little hack for injectdestructors.nim (see bug #11350): + #result.sons[0].typ = nil proc magicsAfterOverloadResolution(c: PContext, n: PNode, flags: TExprFlags): PNode = diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim index 9e1c4d602f..e221929a21 100644 --- a/compiler/vmgen.nim +++ b/compiler/vmgen.nim @@ -501,7 +501,7 @@ proc genTry(c: PCtx; n: PNode; dest: var TDest) = c.gen(n.sons[0], dest) c.clearDest(n, dest) # Add a jump past the exception handling code - endings.add(c.xjmp(n, opcJmp, 0)) + let jumpToFinally = c.xjmp(n, opcJmp, 0) # This signals where the body ends and where the exception handling begins c.patch(ehPos) for i in 1 ..< n.len: @@ -525,6 +525,7 @@ proc genTry(c: PCtx; n: PNode; dest: var TDest) = let fin = lastSon(n) # we always generate an 'opcFinally' as that pops the safepoint # from the stack if no exception is raised in the body. + c.patch(jumpToFinally) c.gABx(fin, opcFinally, 0, 0) for endPos in endings: c.patch(endPos) if fin.kind == nkFinally: @@ -2230,9 +2231,9 @@ proc genProc(c: PCtx; s: PSym): int = c.gABC(body, opcEof, eofInstr.regA) c.optimizeJumps(result) s.offset = c.prc.maxSlots - # if s.name.s == "fun1": - # echo renderTree(body) - # c.echoCode(result) + #if s.name.s == "main": + # echo renderTree(body) + # c.echoCode(result) c.prc = oldPrc else: c.prc.maxSlots = s.offset diff --git a/tests/vm/tmisc_vm.nim b/tests/vm/tmisc_vm.nim index bce0159ce3..966f9d15e7 100644 --- a/tests/vm/tmisc_vm.nim +++ b/tests/vm/tmisc_vm.nim @@ -3,7 +3,10 @@ discard """ [127, 127, 0, 255] ''' - nimout: '''caught Exception''' + nimout: '''caught Exception +main:begin +main:end +''' """ #bug #1009 @@ -24,7 +27,7 @@ template `B=`*(self: TAggRgba8, val: byte) = template `A=`*(self: TAggRgba8, val: byte) = self[3] = val -proc ABGR*(val: int| int64): TAggRgba8 = +proc ABGR*(val: int | int64): TAggRgba8 = var V = val result.R = byte(V and 0xFF) V = V shr 8 @@ -69,3 +72,12 @@ block: let x1 = fun1() const x2 = fun1() doAssert(x1 == x2) + +# bug #11610 +proc simpleTryFinally()= + try: + echo "main:begin" + finally: + echo "main:end" + +static: simpleTryFinally()