Implement isExported for symbols in macros (#11963)

* Implement isExported for macros

* Reimplement isExported using VM callback mechanism

* VM does not support exceptions, use stacktrace() instead.
This commit is contained in:
nc-x
2019-08-18 15:21:28 +05:30
committed by Arne Döring
parent 7cb31455ee
commit d5840e1e3d
3 changed files with 23 additions and 1 deletions

View File

@@ -146,5 +146,14 @@ proc registerAdditionalOps*(c: PCtx) =
registerCallback c, "stdlib.macros.symBodyHash", proc (a: VmArgs) {.nimcall.} =
let n = getNode(a, 0)
if n.kind != nkSym: raise newException(ValueError, "node is not a symbol")
if n.kind != nkSym:
stackTrace(c, PStackFrame(prc: c.prc.sym, comesFrom: 0, next: nil), c.exceptionInstr,
"symBodyHash() requires a symbol. '" & $n & "' is of kind '" & $n.kind & "'", n.info)
setResult(a, $symBodyDigest(c.graph, n.sym))
registerCallback c, "stdlib.macros.isExported", proc(a: VmArgs) {.nimcall.} =
let n = getNode(a, 0)
if n.kind != nkSym:
stackTrace(c, PStackFrame(prc: c.prc.sym, comesFrom: 0, next: nil), c.exceptionInstr,
"isExported() requires a symbol. '" & $n & "' is of kind '" & $n.kind & "'", n.info)
setResult(a, sfExported in n.sym.flags)

View File

@@ -1611,3 +1611,6 @@ when defined(nimMacrosSizealignof):
## from a field of a type. Therefore it only requires one argument
## instead of two. Returns a negative value if the Nim compiler
## does not know the offset.
proc isExported*(n: NimNode): bool {.noSideEffect.} =
## Returns whether the symbol is exported or not.

View File

@@ -0,0 +1,10 @@
import macros
proc t1* = discard
proc t2 = discard
macro check(p1: typed, p2: typed) =
doAssert isExported(p1) == true
doAssert isExported(p2) == false
check t1, t2