mirror of
https://github.com/nim-lang/Nim.git
synced 2026-05-03 20:44:46 +00:00
VM exception fixes (#11868)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
14
tests/vm/texception.nim
Normal 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
|
||||
|
||||
Reference in New Issue
Block a user