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 c.calleeSym = callee
if callee.kind in skProcKinds and calleeScope == -1: if callee.kind in skProcKinds and calleeScope == -1:
if callee.originatingModule == ctx.module: if callee.originatingModule == ctx.module:
let rootSym = if sfFromGeneric notin callee.flags: callee c.calleeScope = 2
else: callee.owner var owner = callee
c.calleeScope = 2 # rootSym.scope.depthLevel while true:
#echo "SCOPE IS ", rootSym.scope.depthLevel owner = owner.skipGenericOwner
if owner.kind == skModule: break
inc c.calleeScope
else: else:
c.calleeScope = 1 c.calleeScope = 1
else: else:

View file

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