This commit is contained in:
Araq 2015-04-10 11:58:17 +02:00
commit 3a9500f7b1
3 changed files with 22 additions and 27 deletions

View file

@ -99,10 +99,12 @@ proc initCandidate*(ctx: PContext, c: var TCandidate, callee: PSym,
c.calleeSym = callee
if callee.kind in skProcKinds and calleeScope == -1:
if callee.originatingModule == ctx.module:
let rootSym = if sfFromGeneric notin callee.flags: callee
else: callee.owner
c.calleeScope = 2 # rootSym.scope.depthLevel
#echo "SCOPE IS ", rootSym.scope.depthLevel
c.calleeScope = 2
var owner = callee
while true:
owner = owner.skipGenericOwner
if owner.kind == skModule: break
inc c.calleeScope
else:
c.calleeScope = 1
else:

View file

@ -3044,13 +3044,12 @@ template currentSourcePath*: string = instantiationInfo(-1, true).filename
proc raiseAssert*(msg: string) {.noinline.} =
sysFatal(AssertionError, msg)
when true:
proc failedAssertImpl*(msg: string) {.raises: [], tags: [].} =
# trick the compiler to not list ``EAssertionFailed`` when called
# by ``assert``.
type THide = proc (msg: string) {.noinline, raises: [], noSideEffect,
tags: [].}
THide(raiseAssert)(msg)
proc failedAssertImpl*(msg: string) {.raises: [], tags: [].} =
# trick the compiler to not list ``AssertionError`` when called
# by ``assert``.
type THide = proc (msg: string) {.noinline, raises: [], noSideEffect,
tags: [].}
THide(raiseAssert)(msg)
template assert*(cond: bool, msg = "") =
## Raises ``AssertionError`` with `msg` if `cond` is false. Note
@ -3115,24 +3114,18 @@ when not defined(nimhygiene):
template onFailedAssert*(msg: expr, code: stmt): stmt {.dirty, immediate.} =
## Sets an assertion failure handler that will intercept any assert
## statements following `onFailedAssert` in the current lexical scope.
## Can be defined multiple times in a single function.
## statements following `onFailedAssert` in the current module scope.
##
## .. code-block:: nim
## # module-wide policy to change the failed assert
## # exception type in order to include a lineinfo
## onFailedAssert(msg):
## var e = new(TMyError)
## e.msg = msg
## e.lineinfo = instantiationInfo(-2)
## raise e
##
## proc example(x: int): ErrorCode =
## onFailedAssert(msg):
## log msg
## return E_FAIL
##
## assert(...)
##
## onFailedAssert(msg):
## raise newException(MyError, msg)
##
## assert(...)
##
template failedAssertImpl(msgIMPL: string): stmt {.dirty, immediate.} =
template failedAssertImpl(msgIMPL: string): stmt {.dirty.} =
let msg = msgIMPL
code

View file

@ -30,7 +30,7 @@ proc bar: int =
# local overrides that are active only
# in this proc
onFailedAssert(msg): echo "WARNING: " & msg
assert(false, "first assertion from bar")
onFailedAssert(msg):