2

How do I create emit macros that don't add a stacktrace?

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()

Produces

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

Where I would prefer

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

Without any additional compiler arguments like --stacktrace: off.

4

1 に答える 1

1

このコードでも同じことが起こることに注意してください。

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

main()

代わりに、proc 全体をプッシュ/ポップで囲む必要があります。

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

main()

昨日、やろうとしたときにこれに気づきました{.push rangechecks: on.}

于 2015-02-19T10:19:45.513 に答える