diff options
Diffstat (limited to 'compiler/vm.nim')
-rw-r--r-- | compiler/vm.nim | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/compiler/vm.nim b/compiler/vm.nim index f2b288216..bb8c6bbf2 100644 --- a/compiler/vm.nim +++ b/compiler/vm.nim @@ -2061,13 +2061,21 @@ iterator genericParamsInMacroCall*(macroSym: PSym, call: PNode): (PSym, PNode) = for i in 0 ..< gp.len: let genericParam = gp[i].sym let posInCall = macroSym.typ.len + i - yield (genericParam, call[posInCall]) + if posInCall < call.len: + yield (genericParam, call[posInCall]) # to prevent endless recursion in macro instantiation const evalMacroLimit = 1000 +proc errorNode(owner: PSym, n: PNode): PNode = + result = newNodeI(nkEmpty, n.info) + result.typ = newType(tyError, owner) + result.typ.flags.incl tfCheckedForDestructor + proc evalMacroCall*(module: PSym; g: ModuleGraph; n, nOrig: PNode, sym: PSym): PNode = + if g.config.errorCounter > 0: return errorNode(module, n) + # XXX globalError() is ugly here, but I don't know a better solution for now inc(g.config.evalMacroCounter) if g.config.evalMacroCounter > evalMacroLimit: |