mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-19 22:10:33 +00:00
@@ -1663,6 +1663,11 @@ proc genInitCode(m: BModule) =
|
||||
|
||||
if beforeRetNeeded in m.initProc.flags:
|
||||
prc.add(~"\tBeforeRet_: ;$n")
|
||||
|
||||
if sfMainModule in m.module.flags and m.config.exc == excGoto:
|
||||
if getCompilerProc(m.g.graph, "nimTestErrorFlag") != nil:
|
||||
m.appcg(prc, "\t#nimTestErrorFlag();$n", [])
|
||||
|
||||
if optStackTrace in m.initProc.options and preventStackTrace notin m.flags:
|
||||
prc.add(deinitFrame(m.initProc))
|
||||
|
||||
@@ -1990,9 +1995,10 @@ proc myClose(graph: ModuleGraph; b: PPassContext, n: PNode): PNode =
|
||||
if b == nil: return
|
||||
var m = BModule(b)
|
||||
if sfMainModule in m.module.flags:
|
||||
let testForError = getCompilerProc(graph, "nimTestErrorFlag")
|
||||
if testForError != nil and graph.config.exc == excGoto:
|
||||
n.add newTree(nkCall, testForError.newSymNode)
|
||||
# phase ordering problem here: We need to announce this
|
||||
# dependency to 'nimTestErrorFlag' before system.c has been written to disk.
|
||||
if m.config.exc == excGoto and getCompilerProc(graph, "nimTestErrorFlag") != nil:
|
||||
discard cgsym(m, "nimTestErrorFlag")
|
||||
|
||||
for i in countdown(high(graph.globalDestructors), 0):
|
||||
n.add graph.globalDestructors[i]
|
||||
|
||||
@@ -591,7 +591,8 @@ proc p(n: PNode; c: var Con; mode: ProcessMode): PNode =
|
||||
# move the variable declaration to the top of the frame:
|
||||
c.addTopVar v
|
||||
# make sure it's destroyed at the end of the proc:
|
||||
if not isUnpackedTuple(v):
|
||||
if not isUnpackedTuple(v) and sfThread notin v.sym.flags:
|
||||
# do not destroy thread vars for now at all for consistency.
|
||||
c.destroys.add genDestroy(c, v)
|
||||
elif c.inLoop > 0:
|
||||
# unpacked tuple needs reset at every loop iteration
|
||||
|
||||
10
tests/destructor/tgotoexceptions6.nim
Normal file
10
tests/destructor/tgotoexceptions6.nim
Normal file
@@ -0,0 +1,10 @@
|
||||
discard """
|
||||
cmd: "nim c --gc:arc --exceptions:goto $file"
|
||||
outputsub: "Error: unhandled exception: virus detected [ValueError]"
|
||||
exitcode: "1"
|
||||
"""
|
||||
|
||||
# bug #13436
|
||||
proc foo =
|
||||
raise newException(ValueError, "virus detected")
|
||||
foo()
|
||||
Reference in New Issue
Block a user