diff options
-rw-r--r-- | lib/system/excpt.nim | 5 | ||||
-rw-r--r-- | tests/exception/tdont_overwrite_typename.nim | 29 |
2 files changed, 32 insertions, 2 deletions
diff --git a/lib/system/excpt.nim b/lib/system/excpt.nim index bae5de9d3..8ed1fbb38 100644 --- a/lib/system/excpt.nim +++ b/lib/system/excpt.nim @@ -73,7 +73,8 @@ proc popSafePoint {.compilerRtl, inl.} = excHandler = excHandler.prev proc pushCurrentException(e: ref Exception) {.compilerRtl, inl.} = - e.parent = currException + #if e.parent.isNil: + # e.parent = currException currException = e proc popCurrentException {.compilerRtl, inl.} = @@ -279,7 +280,7 @@ proc raiseExceptionAux(e: ref Exception) = quitOrDebug() proc raiseException(e: ref Exception, ename: cstring) {.compilerRtl.} = - e.name = ename + if e.name.isNil: e.name = ename when hasSomeStackTrace: e.trace = "" rawWriteStackTrace(e.trace) diff --git a/tests/exception/tdont_overwrite_typename.nim b/tests/exception/tdont_overwrite_typename.nim new file mode 100644 index 000000000..147ccc001 --- /dev/null +++ b/tests/exception/tdont_overwrite_typename.nim @@ -0,0 +1,29 @@ +discard """ + output: '''Check passed +Check passed''' +""" + +# bug #5628 + +proc checkException(ex: ref Exception) = + doAssert(ex.name == "ValueError") + doAssert(ex.msg == "SecondException") + doAssert(ex.parent != nil) + doAssert(ex.parent.name == "KeyError") + doAssert(ex.parent.msg == "FirstException") + echo "Check passed" + +var e: ref Exception +try: + try: + raise newException(KeyError, "FirstException") + except: + raise newException(ValueError, "SecondException", getCurrentException()) +except: + e = getCurrentException() + +try: + checkException(e) # passes here + raise e +except ValueError: + checkException(getCurrentException()) # fails here |