system/excpt: check if the exception is not nil before pop (#18247)
In CPS we would consume an exception in the except branch by stashing it into a local then remove the exception from Nim environment so as not to leak it to other code that would be running before the continuation continues However since popCurrentException() assumes that the exception always exist, removing the exception from an except branch will cause a SIGSEGV to happen. This commit fixes that.
This commit is contained in:
parent
2d34b1f5bc
commit
0adb47aa15
2 changed files with 10 additions and 2 deletions
|
|
@ -135,8 +135,9 @@ proc pushCurrentException(e: sink(ref Exception)) {.compilerRtl, inl.} =
|
|||
#showErrorMessage2 "A"
|
||||
|
||||
proc popCurrentException {.compilerRtl, inl.} =
|
||||
currException = currException.up
|
||||
#showErrorMessage2 "B"
|
||||
if currException != nil:
|
||||
currException = currException.up
|
||||
#showErrorMessage2 "B"
|
||||
|
||||
proc popCurrentExceptionEx(id: uint) {.compilerRtl.} =
|
||||
discard "only for bootstrapping compatbility"
|
||||
|
|
|
|||
|
|
@ -6,3 +6,10 @@ let ex = newException(CatchableError, "test")
|
|||
setCurrentException(ex)
|
||||
doAssert getCurrentException().msg == ex.msg
|
||||
doAssert getCurrentExceptionMsg() == ex.msg
|
||||
setCurrentException(nil)
|
||||
|
||||
try:
|
||||
raise newException(CatchableError, "test2")
|
||||
except:
|
||||
setCurrentException(nil)
|
||||
doAssert getCurrentException() == nil
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue