summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--lib/system/excpt.nim5
-rw-r--r--tests/exception/tdont_overwrite_typename.nim29
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