diff options
-rw-r--r-- | compiler/ccgstmts.nim | 6 | ||||
-rw-r--r-- | lib/system/excpt.nim | 10 | ||||
-rw-r--r-- | testament/categories.nim | 1 | ||||
-rw-r--r-- | tests/exception/tunhandledexc.nim | 4 |
4 files changed, 16 insertions, 5 deletions
diff --git a/compiler/ccgstmts.nim b/compiler/ccgstmts.nim index 7905d3daf..5ebe0323d 100644 --- a/compiler/ccgstmts.nim +++ b/compiler/ccgstmts.nim @@ -608,8 +608,10 @@ proc genRaiseStmt(p: BProc, t: PNode) = if isImportedException(typ, p.config): lineF(p, cpsStmts, "throw $1;$n", [e]) else: - lineCg(p, cpsStmts, "#raiseException((#Exception*)$1, $2);$n", - [e, makeCString(typ.sym.name.s)]) + lineCg(p, cpsStmts, "#raiseExceptionEx((#Exception*)$1, $2, $3, $4, $5);$n", + [e, makeCString(typ.sym.name.s), + makeCString(if p.prc != nil: p.prc.name.s else: p.module.module.name.s), + makeCString(toFileName(p.config, t.info)), rope(toLinenumber(t.info))]) else: genLineDir(p, t) # reraise the last exception: diff --git a/lib/system/excpt.nim b/lib/system/excpt.nim index 7d5f5af7f..20ca143ca 100644 --- a/lib/system/excpt.nim +++ b/lib/system/excpt.nim @@ -381,6 +381,8 @@ proc raiseExceptionAux(e: ref Exception) = xadd(buf, s, s.len) var buf: array[0..2000, char] var L = 0 + if e.trace.len != 0: + add(buf, $e.trace) # gc allocation add(buf, "Error: unhandled exception: ") add(buf, e.msg) add(buf, " [") @@ -394,7 +396,7 @@ proc raiseExceptionAux(e: ref Exception) = showErrorMessage(tbuf()) quitOrDebug() -proc raiseException(e: ref Exception, ename: cstring) {.compilerRtl.} = +proc raiseExceptionEx(e: ref Exception, ename, procname, filename: cstring, line: int) {.compilerRtl.} = if e.name.isNil: e.name = ename when hasSomeStackTrace: if e.trace.len == 0: @@ -403,8 +405,14 @@ proc raiseException(e: ref Exception, ename: cstring) {.compilerRtl.} = e.trace.add reraisedFrom(reraisedFromBegin) auxWriteStackTrace(framePtr, e.trace) e.trace.add reraisedFrom(reraisedFromEnd) + else: + if procname != nil and filename != nil: + e.trace.add StackTraceEntry(procname: procname, filename: filename, line: line) raiseExceptionAux(e) +proc raiseException(e: ref Exception, ename: cstring) {.compilerRtl.} = + raiseExceptionEx(e, ename, nil, nil, 0) + proc reraiseException() {.compilerRtl.} = if currException == nil: sysFatal(ReraiseError, "no exception to reraise") diff --git a/testament/categories.nim b/testament/categories.nim index 429330677..36f2a271a 100644 --- a/testament/categories.nim +++ b/testament/categories.nim @@ -246,7 +246,6 @@ proc jsTests(r: var TResults, cat: Category, options: string) = for testfile in ["exception/texceptions", "exception/texcpt1", "exception/texcsub", "exception/tfinally", "exception/tfinally2", "exception/tfinally3", - "exception/tunhandledexc", "actiontable/tactiontable", "method/tmultimjs", "varres/tvarres0", "varres/tvarres3", "varres/tvarres4", "varres/tvartup", "misc/tints", "misc/tunsignedinc", diff --git a/tests/exception/tunhandledexc.nim b/tests/exception/tunhandledexc.nim index c318aec81..f0fa2bf27 100644 --- a/tests/exception/tunhandledexc.nim +++ b/tests/exception/tunhandledexc.nim @@ -1,6 +1,8 @@ discard """ file: "tunhandledexc.nim" - outputsub: "Error: unhandled exception: bla [ESomeOtherErr]" + cmd: "nim $target -d:release $options $file" + outputsub: '''tunhandledexc.nim(16) genErrors +Error: unhandled exception: bla [ESomeOtherErr]''' exitcode: "1" """ type |