从 emit pragma 中删除堆栈跟踪

Remove stacktraces from an emit pragma

如何创建不添加堆栈跟踪的发射宏?

import macros

macro emitWithoutStacktrace(): stmt = 
  result = newStmtList()
  result.add quote do:
    {.push stacktrace: off.}
  result.add(newNimNode(nnkPragma).add(newNimNode(nnkExprColonExpr).add(newIdentNode("emit"), newStrLitNode("foobar"))))
  result.add quote do:
    {.pop stacktrace: off.}

proc main = 
  emitWithoutStacktrace()

main()

生产

N_NIMCALL(void, main_104042)(void) {
    nimfr("main", "test.nim")
    nimln(7, "test.nim");
    foobar
    popFrame();
}

我更喜欢的地方

N_NIMCALL(void, main_104042)(void) {
    foobar
    popFrame();
}

没有任何额外的编译器参数,例如 --stacktrace: off

请注意,此代码也会发生同样的情况:

proc main =
  {.push stacktrace: off.}
  echo "hi"
  {.pop.}

main()

相反,您需要用 push/pop:

包围整个过程
{.push stacktrace: off.}
proc main =
  echo "hi"
{.pop.}

main()

我昨天在尝试 {.push rangechecks: on.} 时才注意到这一点。