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:
parent
7cb31455ee
commit
d5840e1e3d
3 changed files with 23 additions and 1 deletions
|
|
@ -146,5 +146,14 @@ proc registerAdditionalOps*(c: PCtx) =
|
||||||
|
|
||||||
registerCallback c, "stdlib.macros.symBodyHash", proc (a: VmArgs) {.nimcall.} =
|
registerCallback c, "stdlib.macros.symBodyHash", proc (a: VmArgs) {.nimcall.} =
|
||||||
let n = getNode(a, 0)
|
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))
|
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)
|
||||||
|
|
|
||||||
|
|
@ -1611,3 +1611,6 @@ when defined(nimMacrosSizealignof):
|
||||||
## from a field of a type. Therefore it only requires one argument
|
## from a field of a type. Therefore it only requires one argument
|
||||||
## instead of two. Returns a negative value if the Nim compiler
|
## instead of two. Returns a negative value if the Nim compiler
|
||||||
## does not know the offset.
|
## does not know the offset.
|
||||||
|
|
||||||
|
proc isExported*(n: NimNode): bool {.noSideEffect.} =
|
||||||
|
## Returns whether the symbol is exported or not.
|
||||||
|
|
|
||||||
10
tests/macros/tisexported.nim
Normal file
10
tests/macros/tisexported.nim
Normal 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
|
||||||
Loading…
Add table
Add a link
Reference in a new issue