better error message for subtle nil errors
This commit is contained in:
parent
a8ba628bcd
commit
8c211113f2
4 changed files with 8 additions and 3 deletions
|
|
@ -346,6 +346,8 @@ proc resetLoc(p: BProc, loc: var TLoc) =
|
||||||
else:
|
else:
|
||||||
linefmt(p, cpsStmts, "$1 = 0;$n", rdLoc(loc))
|
linefmt(p, cpsStmts, "$1 = 0;$n", rdLoc(loc))
|
||||||
else:
|
else:
|
||||||
|
if optNilCheck in p.options:
|
||||||
|
linefmt(p, cpsStmts, "#chckNil((void*)$1);$n", addrLoc(loc))
|
||||||
if loc.s != OnStack:
|
if loc.s != OnStack:
|
||||||
linefmt(p, cpsStmts, "#genericReset((void*)$1, $2);$n",
|
linefmt(p, cpsStmts, "#genericReset((void*)$1, $2);$n",
|
||||||
addrLoc(loc), genTypeInfo(p.module, loc.t))
|
addrLoc(loc), genTypeInfo(p.module, loc.t))
|
||||||
|
|
|
||||||
|
|
@ -92,7 +92,7 @@ var
|
||||||
gOptions*: TOptions = {optObjCheck, optFieldCheck, optRangeCheck,
|
gOptions*: TOptions = {optObjCheck, optFieldCheck, optRangeCheck,
|
||||||
optBoundsCheck, optOverflowCheck, optAssert, optWarns,
|
optBoundsCheck, optOverflowCheck, optAssert, optWarns,
|
||||||
optHints, optStackTrace, optLineTrace,
|
optHints, optStackTrace, optLineTrace,
|
||||||
optPatterns}
|
optPatterns, optNilCheck}
|
||||||
gGlobalOptions*: TGlobalOptions = {optThreadAnalysis}
|
gGlobalOptions*: TGlobalOptions = {optThreadAnalysis}
|
||||||
gExitcode*: int8
|
gExitcode*: int8
|
||||||
gCmd*: TCommands = cmdNone # the command
|
gCmd*: TCommands = cmdNone # the command
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@ 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.}
|
||||||
proc chckNil(p: pointer) {.inline, compilerproc.}
|
proc chckNil(p: pointer) {.noinline, compilerproc.}
|
||||||
|
|
||||||
var
|
var
|
||||||
framePtr {.rtlThreadVar.}: PFrame
|
framePtr {.rtlThreadVar.}: PFrame
|
||||||
|
|
@ -359,7 +359,9 @@ proc chckRangeF(x, a, b: float): float =
|
||||||
raise newException(EOutOfRange, "value " & $x & " out of range")
|
raise newException(EOutOfRange, "value " & $x & " out of range")
|
||||||
|
|
||||||
proc chckNil(p: pointer) =
|
proc chckNil(p: pointer) =
|
||||||
if p == nil: c_raise(SIGSEGV)
|
if p == nil:
|
||||||
|
raise newException(EInvalidValue, "attempt to write to a nil address")
|
||||||
|
#c_raise(SIGSEGV)
|
||||||
|
|
||||||
proc chckObj(obj, subclass: PNimType) {.compilerproc.} =
|
proc chckObj(obj, subclass: PNimType) {.compilerproc.} =
|
||||||
# checks if obj is of type subclass:
|
# checks if obj is of type subclass:
|
||||||
|
|
|
||||||
1
todo.txt
1
todo.txt
|
|
@ -9,6 +9,7 @@ version 0.9.4
|
||||||
- overloading of ``.``? Special case ``.=``?
|
- overloading of ``.``? Special case ``.=``?
|
||||||
- built-in 'getImpl'
|
- built-in 'getImpl'
|
||||||
- macros.gensym still missing?
|
- macros.gensym still missing?
|
||||||
|
- optimize 'genericReset'; 'newException' leads to code bloat
|
||||||
|
|
||||||
|
|
||||||
Bugs
|
Bugs
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue