VM exception fixes (#11868)

This commit is contained in:
Oscar Nihlgård
2019-08-02 23:59:04 +02:00
committed by cooldome
parent a906b3952b
commit 50e921bb94
3 changed files with 28 additions and 2 deletions

View File

@@ -102,7 +102,8 @@ template stackTrace(c: PCtx, tos: PStackFrame, pc: int, msg: string) =
proc bailOut(c: PCtx; tos: PStackFrame) =
stackTrace(c, tos, c.exceptionInstr, "unhandled exception: " &
c.currentExceptionA.sons[3].skipColon.strVal)
c.currentExceptionA.sons[3].skipColon.strVal &
" [" & c.currentExceptionA.sons[2].skipColon.strVal & "]")
when not defined(nimComputedGoto):
{.pragma: computedGoto.}
@@ -1199,8 +1200,15 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg =
tos = savedFrame
move(regs, tos.slots)
of opcRaise:
let raised = regs[ra].node
let raised =
# Empty `raise` statement - reraise current exception
if regs[ra].kind == rkNone:
c.currentExceptionA
else:
regs[ra].node
c.currentExceptionA = raised
# Set the `name` field of the exception
c.currentExceptionA.sons[2].skipColon.strVal = c.currentExceptionA.typ.sym.name.s
c.exceptionInstr = pc
var frame = tos

View File

@@ -79,6 +79,9 @@ proc getCurrentExceptionMsgWrapper(a: VmArgs) {.nimcall.} =
setResult(a, if a.currentException.isNil: ""
else: a.currentException.sons[3].skipColon.strVal)
proc getCurrentExceptionWrapper(a: VmArgs) {.nimcall.} =
setResult(a, a.currentException)
proc staticWalkDirImpl(path: string, relative: bool): PNode =
result = newNode(nkBracket)
for k, f in walkDir(path, relative):
@@ -132,6 +135,7 @@ proc registerAdditionalOps*(c: PCtx) =
wrap1s(readFile, ioop)
wrap2si(readLines, ioop)
systemop getCurrentExceptionMsg
systemop getCurrentException
registerCallback c, "stdlib.*.staticWalkDir", proc (a: VmArgs) {.nimcall.} =
setResult(a, staticWalkDirImpl(getString(a, 0), getBool(a, 1)))
systemop gorgeEx

14
tests/vm/texception.nim Normal file
View File

@@ -0,0 +1,14 @@
proc someFunc() =
try:
raise newException(ValueError, "message")
except ValueError as err:
doAssert err.name == "ValueError"
doAssert err.msg == "message"
raise
static:
try:
someFunc()
except:
discard