diff options
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/ast.nim | 6 | ||||
-rw-r--r-- | compiler/condsyms.nim | 1 | ||||
-rw-r--r-- | compiler/evaltempl.nim | 4 | ||||
-rw-r--r-- | compiler/pragmas.nim | 5 | ||||
-rw-r--r-- | compiler/semstmts.nim | 7 | ||||
-rw-r--r-- | compiler/semtempl.nim | 6 | ||||
-rw-r--r-- | compiler/vm.nim | 5 | ||||
-rw-r--r-- | compiler/wordrecg.nim | 2 |
8 files changed, 19 insertions, 17 deletions
diff --git a/compiler/ast.nim b/compiler/ast.nim index e1d982a43..4174e7f34 100644 --- a/compiler/ast.nim +++ b/compiler/ast.nim @@ -1254,6 +1254,12 @@ proc skipPragmaExpr*(n: PNode): PNode = else: result = n +proc setInfoRecursive*(n: PNode, info: TLineInfo) = + ## set line info recursively + if n != nil: + for i in 0..<n.safeLen: setInfoRecursive(n[i], info) + n.info = info + when defined(useNodeIds): const nodeIdToDebug* = -1 # 2322968 var gNodeId: int diff --git a/compiler/condsyms.nim b/compiler/condsyms.nim index 10f4b86ab..c4f4d8290 100644 --- a/compiler/condsyms.nim +++ b/compiler/condsyms.nim @@ -143,4 +143,5 @@ proc initDefines*(symbols: StringTableRef) = defineSymbol("nimHasTopDownInference") defineSymbol("nimHasTemplateRedefinitionPragma") defineSymbol("nimHasCstringCase") + defineSymbol("nimHasCallsitePragma") defineSymbol("nimHasAmbiguousEnumHint") diff --git a/compiler/evaltempl.nim b/compiler/evaltempl.nim index 8a6bf9287..d4aa466c2 100644 --- a/compiler/evaltempl.nim +++ b/compiler/evaltempl.nim @@ -26,7 +26,7 @@ type proc copyNode(ctx: TemplCtx, a, b: PNode): PNode = result = copyNode(a) - if ctx.instLines: result.info = b.info + if ctx.instLines: setInfoRecursive(result, b.info) proc evalTemplateAux(templ, actual: PNode, c: var TemplCtx, result: PNode) = template handleParam(param) = @@ -204,7 +204,7 @@ proc evalTemplate*(n: PNode, tmpl, genSymOwner: PSym; result = copyNode(body) ctx.instLines = sfCallsite in tmpl.flags if ctx.instLines: - result.info = n.info + setInfoRecursive(result, n.info) for i in 0..<body.safeLen: evalTemplateAux(body[i], args, ctx, result) result.flags.incl nfFromTemplate diff --git a/compiler/pragmas.nim b/compiler/pragmas.nim index a312478ae..d4932a877 100644 --- a/compiler/pragmas.nim +++ b/compiler/pragmas.nim @@ -38,7 +38,7 @@ const converterPragmas* = procPragmas methodPragmas* = procPragmas+{wBase}-{wImportCpp} templatePragmas* = {wDeprecated, wError, wGensym, wInject, wDirty, - wDelegator, wExportNims, wUsed, wPragma, wRedefine} + wDelegator, wExportNims, wUsed, wPragma, wRedefine, wCallsite} macroPragmas* = declPragmas + {FirstCallConv..LastCallConv, wMagic, wNoSideEffect, wCompilerProc, wNonReloadable, wCore, wDiscardable, wGensym, wInject, wDelegator} @@ -873,6 +873,9 @@ proc singlePragma(c: PContext, sym: PSym, n: PNode, i: var int, of wRedefine: if sym.kind == skTemplate: incl(sym.flags, sfTemplateRedefinition) else: invalidPragma(c, it) + of wCallsite: + if sym.kind == skTemplate: incl(sym.flags, sfCallsite) + else: invalidPragma(c, it) of wImportCpp: processImportCpp(c, sym, getOptionalStr(c, it, "$1"), it.info) of wCppNonPod: diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index 270086e66..26356a33c 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -2338,11 +2338,6 @@ proc evalInclude(c: PContext, n: PNode): PNode = else: incMod(c, n, it, result) -proc setLine(n: PNode, info: TLineInfo) = - if n != nil: - for i in 0..<n.safeLen: setLine(n[i], info) - n.info = info - proc recursiveSetFlag(n: PNode, flag: TNodeFlag) = if n != nil: for i in 0..<n.safeLen: recursiveSetFlag(n[i], flag) @@ -2371,7 +2366,7 @@ proc semPragmaBlock(c: PContext, n: PNode; expectedType: PType = nil): PNode = result.typ = n[1].typ for i in 0..<pragmaList.len: case whichPragma(pragmaList[i]) - of wLine: setLine(result, pragmaList[i].info) + of wLine: setInfoRecursive(result, pragmaList[i].info) of wNoRewrite: recursiveSetFlag(result, nfNoRewrite) else: discard diff --git a/compiler/semtempl.nim b/compiler/semtempl.nim index 2d5f077f9..ed2475341 100644 --- a/compiler/semtempl.nim +++ b/compiler/semtempl.nim @@ -620,12 +620,6 @@ proc semTemplateDef(c: PContext, n: PNode): PNode = s = semIdentVis(c, skTemplate, n[namePos], {}) assert s.kind == skTemplate - if s.owner != nil: - const names = ["!=", ">=", ">", "incl", "excl", "in", "notin", "isnot"] - if sfSystemModule in s.owner.flags and s.name.s in names or - s.owner.name.s == "vm" and s.name.s == "stackTrace": - incl(s.flags, sfCallsite) - styleCheckDef(c, s) onDef(n[namePos].info, s) # check parameter list: diff --git a/compiler/vm.nim b/compiler/vm.nim index 1717fe119..7a6dbd0ee 100644 --- a/compiler/vm.nim +++ b/compiler/vm.nim @@ -75,8 +75,11 @@ proc stackTraceImpl(c: PCtx, tos: PStackFrame, pc: int, let lineInfo = if lineInfo == TLineInfo.default: c.debug[pc] else: lineInfo liMessage(c.config, lineInfo, errGenerated, msg, action, infoOrigin) +when not defined(nimHasCallsitePragma): + {.pragma: callsite.} + template stackTrace(c: PCtx, tos: PStackFrame, pc: int, - msg: string, lineInfo: TLineInfo = TLineInfo.default) = + msg: string, lineInfo: TLineInfo = TLineInfo.default) {.callsite.} = stackTraceImpl(c, tos, pc, msg, lineInfo, instantiationInfo(-2, fullPaths = true)) return diff --git a/compiler/wordrecg.nim b/compiler/wordrecg.nim index d33982b0f..c21eda1f9 100644 --- a/compiler/wordrecg.nim +++ b/compiler/wordrecg.nim @@ -87,7 +87,7 @@ type wGlobal = "global", wCodegenDecl = "codegenDecl", wUnchecked = "unchecked", wGuard = "guard", wLocks = "locks", wPartial = "partial", wExplain = "explain", wLiftLocals = "liftlocals", wEnforceNoRaises = "enforceNoRaises", - wRedefine = "redefine", + wRedefine = "redefine", wCallsite = "callsite", wAuto = "auto", wBool = "bool", wCatch = "catch", wChar = "char", wClass = "class", wCompl = "compl", wConstCast = "const_cast", wDefault = "default", |