bugfix: --gc:none -d:useMalloc works again
This commit is contained in:
parent
40b379859c
commit
827dc054fb
2 changed files with 55 additions and 54 deletions
|
|
@ -27,8 +27,6 @@ else:
|
||||||
proc writeToStdErr(msg: CString) =
|
proc writeToStdErr(msg: CString) =
|
||||||
discard MessageBoxA(0, msg, nil, 0)
|
discard MessageBoxA(0, msg, nil, 0)
|
||||||
|
|
||||||
proc registerSignalHandler()
|
|
||||||
|
|
||||||
proc chckIndx(i, a, b: int): int {.inline, compilerproc.}
|
proc chckIndx(i, a, b: int): int {.inline, compilerproc.}
|
||||||
proc chckRange(i, a, b: int): int {.inline, compilerproc.}
|
proc chckRange(i, a, b: int): int {.inline, compilerproc.}
|
||||||
proc chckRangeF(x, a, b: float): float {.inline, compilerproc.}
|
proc chckRangeF(x, a, b: float): float {.inline, compilerproc.}
|
||||||
|
|
@ -278,46 +276,46 @@ when defined(endb):
|
||||||
var
|
var
|
||||||
dbgAborting: bool # whether the debugger wants to abort
|
dbgAborting: bool # whether the debugger wants to abort
|
||||||
|
|
||||||
proc signalHandler(sig: cint) {.exportc: "signalHandler", noconv.} =
|
|
||||||
template processSignal(s, action: expr) {.immediate.} =
|
|
||||||
if s == SIGINT: action("SIGINT: Interrupted by Ctrl-C.\n")
|
|
||||||
elif s == SIGSEGV:
|
|
||||||
action("SIGSEGV: Illegal storage access. (Attempt to read from nil?)\n")
|
|
||||||
elif s == SIGABRT:
|
|
||||||
when defined(endb):
|
|
||||||
if dbgAborting: return # the debugger wants to abort
|
|
||||||
action("SIGABRT: Abnormal termination.\n")
|
|
||||||
elif s == SIGFPE: action("SIGFPE: Arithmetic error.\n")
|
|
||||||
elif s == SIGILL: action("SIGILL: Illegal operation.\n")
|
|
||||||
elif s == SIGBUS:
|
|
||||||
action("SIGBUS: Illegal storage access. (Attempt to read from nil?)\n")
|
|
||||||
else: action("unknown signal\n")
|
|
||||||
|
|
||||||
# print stack trace and quit
|
|
||||||
when hasSomeStackTrace:
|
|
||||||
GC_disable()
|
|
||||||
var buf = newStringOfCap(2000)
|
|
||||||
rawWriteStackTrace(buf)
|
|
||||||
processSignal(sig, buf.add) # nice hu? currying a la nimrod :-)
|
|
||||||
writeToStdErr(buf)
|
|
||||||
GC_enable()
|
|
||||||
else:
|
|
||||||
var msg: cstring
|
|
||||||
template asgn(y: expr) = msg = y
|
|
||||||
processSignal(sig, asgn)
|
|
||||||
writeToStdErr(msg)
|
|
||||||
when defined(endb): dbgAborting = True
|
|
||||||
quit(1) # always quit when SIGABRT
|
|
||||||
|
|
||||||
proc registerSignalHandler() =
|
|
||||||
c_signal(SIGINT, signalHandler)
|
|
||||||
c_signal(SIGSEGV, signalHandler)
|
|
||||||
c_signal(SIGABRT, signalHandler)
|
|
||||||
c_signal(SIGFPE, signalHandler)
|
|
||||||
c_signal(SIGILL, signalHandler)
|
|
||||||
c_signal(SIGBUS, signalHandler)
|
|
||||||
|
|
||||||
when not defined(noSignalHandler):
|
when not defined(noSignalHandler):
|
||||||
|
proc signalHandler(sig: cint) {.exportc: "signalHandler", noconv.} =
|
||||||
|
template processSignal(s, action: expr) {.immediate.} =
|
||||||
|
if s == SIGINT: action("SIGINT: Interrupted by Ctrl-C.\n")
|
||||||
|
elif s == SIGSEGV:
|
||||||
|
action("SIGSEGV: Illegal storage access. (Attempt to read from nil?)\n")
|
||||||
|
elif s == SIGABRT:
|
||||||
|
when defined(endb):
|
||||||
|
if dbgAborting: return # the debugger wants to abort
|
||||||
|
action("SIGABRT: Abnormal termination.\n")
|
||||||
|
elif s == SIGFPE: action("SIGFPE: Arithmetic error.\n")
|
||||||
|
elif s == SIGILL: action("SIGILL: Illegal operation.\n")
|
||||||
|
elif s == SIGBUS:
|
||||||
|
action("SIGBUS: Illegal storage access. (Attempt to read from nil?)\n")
|
||||||
|
else: action("unknown signal\n")
|
||||||
|
|
||||||
|
# print stack trace and quit
|
||||||
|
when hasSomeStackTrace:
|
||||||
|
GC_disable()
|
||||||
|
var buf = newStringOfCap(2000)
|
||||||
|
rawWriteStackTrace(buf)
|
||||||
|
processSignal(sig, buf.add) # nice hu? currying a la nimrod :-)
|
||||||
|
writeToStdErr(buf)
|
||||||
|
GC_enable()
|
||||||
|
else:
|
||||||
|
var msg: cstring
|
||||||
|
template asgn(y: expr) = msg = y
|
||||||
|
processSignal(sig, asgn)
|
||||||
|
writeToStdErr(msg)
|
||||||
|
when defined(endb): dbgAborting = True
|
||||||
|
quit(1) # always quit when SIGABRT
|
||||||
|
|
||||||
|
proc registerSignalHandler() =
|
||||||
|
c_signal(SIGINT, signalHandler)
|
||||||
|
c_signal(SIGSEGV, signalHandler)
|
||||||
|
c_signal(SIGABRT, signalHandler)
|
||||||
|
c_signal(SIGFPE, signalHandler)
|
||||||
|
c_signal(SIGILL, signalHandler)
|
||||||
|
c_signal(SIGBUS, signalHandler)
|
||||||
|
|
||||||
registerSignalHandler() # call it in initialization section
|
registerSignalHandler() # call it in initialization section
|
||||||
|
|
||||||
proc setControlCHook(hook: proc () {.noconv.}) =
|
proc setControlCHook(hook: proc () {.noconv.}) =
|
||||||
|
|
|
||||||
|
|
@ -117,7 +117,8 @@ proc reprSet(p: pointer, typ: PNimType): string {.compilerRtl.} =
|
||||||
type
|
type
|
||||||
TReprClosure {.final.} = object # we cannot use a global variable here
|
TReprClosure {.final.} = object # we cannot use a global variable here
|
||||||
# as this wouldn't be thread-safe
|
# as this wouldn't be thread-safe
|
||||||
marked: TCellSet
|
when defined(TCellSet):
|
||||||
|
marked: TCellSet
|
||||||
recdepth: int # do not recurse endlessly
|
recdepth: int # do not recurse endlessly
|
||||||
indent: int # indentation
|
indent: int # indentation
|
||||||
|
|
||||||
|
|
@ -127,12 +128,13 @@ when not defined(useNimRtl):
|
||||||
# have to do it here ...
|
# have to do it here ...
|
||||||
when hasThreadSupport and hasSharedHeap and defined(heapLock):
|
when hasThreadSupport and hasSharedHeap and defined(heapLock):
|
||||||
AcquireSys(HeapLock)
|
AcquireSys(HeapLock)
|
||||||
Init(cl.marked)
|
when defined(TCellSet):
|
||||||
|
Init(cl.marked)
|
||||||
cl.recdepth = -1 # default is to display everything!
|
cl.recdepth = -1 # default is to display everything!
|
||||||
cl.indent = 0
|
cl.indent = 0
|
||||||
|
|
||||||
proc deinitReprClosure(cl: var TReprClosure) =
|
proc deinitReprClosure(cl: var TReprClosure) =
|
||||||
Deinit(cl.marked)
|
when defined(TCellSet): Deinit(cl.marked)
|
||||||
when hasThreadSupport and hasSharedHeap and defined(heapLock):
|
when hasThreadSupport and hasSharedHeap and defined(heapLock):
|
||||||
ReleaseSys(HeapLock)
|
ReleaseSys(HeapLock)
|
||||||
|
|
||||||
|
|
@ -195,16 +197,17 @@ when not defined(useNimRtl):
|
||||||
proc reprRef(result: var string, p: pointer, typ: PNimType,
|
proc reprRef(result: var string, p: pointer, typ: PNimType,
|
||||||
cl: var TReprClosure) =
|
cl: var TReprClosure) =
|
||||||
# we know that p is not nil here:
|
# we know that p is not nil here:
|
||||||
when defined(boehmGC) or defined(nogc):
|
when defined(TCellSet):
|
||||||
var cell = cast[PCell](p)
|
when defined(boehmGC) or defined(nogc):
|
||||||
else:
|
var cell = cast[PCell](p)
|
||||||
var cell = usrToCell(p)
|
else:
|
||||||
add result, "ref " & reprPointer(p)
|
var cell = usrToCell(p)
|
||||||
if cell notin cl.marked:
|
add result, "ref " & reprPointer(p)
|
||||||
# only the address is shown:
|
if cell notin cl.marked:
|
||||||
incl(cl.marked, cell)
|
# only the address is shown:
|
||||||
add result, " --> "
|
incl(cl.marked, cell)
|
||||||
reprAux(result, p, typ.base, cl)
|
add result, " --> "
|
||||||
|
reprAux(result, p, typ.base, cl)
|
||||||
|
|
||||||
proc reprAux(result: var string, p: pointer, typ: PNimType,
|
proc reprAux(result: var string, p: pointer, typ: PNimType,
|
||||||
cl: var TReprClosure) =
|
cl: var TReprClosure) =
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue