Arc global (#20768)
* temp * unsure * fix condition * port macro arc runable examples to one file * trigger doc ci * fix Co-authored-by: ringabout <43030857+ringabout@users.noreply.github.com>
This commit is contained in:
parent
93b085a57a
commit
fdc8dd4128
3 changed files with 48 additions and 2 deletions
|
|
@ -490,7 +490,7 @@ proc pVarTopLevel(v: PNode; c: var Con; s: var Scope; res: PNode) =
|
||||||
res.add newTree(nkFastAsgn, v, genDefaultCall(v.typ, c, v.info))
|
res.add newTree(nkFastAsgn, v, genDefaultCall(v.typ, c, v.info))
|
||||||
elif sfThread notin v.sym.flags and sfCursor notin v.sym.flags:
|
elif sfThread notin v.sym.flags and sfCursor notin v.sym.flags:
|
||||||
# do not destroy thread vars for now at all for consistency.
|
# do not destroy thread vars for now at all for consistency.
|
||||||
if sfGlobal in v.sym.flags and s.parent == nil: #XXX: Rethink this logic (see tarcmisc.test2)
|
if {sfGlobal, sfPure} <= v.sym.flags or sfGlobal in v.sym.flags and s.parent == nil:
|
||||||
c.graph.globalDestructors.add c.genDestroy(v)
|
c.graph.globalDestructors.add c.genDestroy(v)
|
||||||
else:
|
else:
|
||||||
s.final.add c.genDestroy(v)
|
s.final.add c.genDestroy(v)
|
||||||
|
|
|
||||||
46
tests/arc/tarc_macro.nim
Normal file
46
tests/arc/tarc_macro.nim
Normal file
|
|
@ -0,0 +1,46 @@
|
||||||
|
import macros
|
||||||
|
|
||||||
|
var destroyCalled = false
|
||||||
|
macro bar() =
|
||||||
|
let s = newTree(nnkAccQuoted, ident"=destroy")
|
||||||
|
# let s = ident"`=destroy`" # this would not work
|
||||||
|
result = quote do:
|
||||||
|
type Foo = object
|
||||||
|
# proc `=destroy`(a: var Foo) = destroyCalled = true # this would not work
|
||||||
|
proc `s`(a: var Foo) = destroyCalled = true
|
||||||
|
block:
|
||||||
|
let a = Foo()
|
||||||
|
bar()
|
||||||
|
doAssert destroyCalled
|
||||||
|
|
||||||
|
# custom `op`
|
||||||
|
var destroyCalled2 = false
|
||||||
|
macro bar(ident) =
|
||||||
|
var x = 1.5
|
||||||
|
result = quote("@") do:
|
||||||
|
type Foo = object
|
||||||
|
let `@ident` = 0 # custom op interpolated symbols need quoted (``)
|
||||||
|
proc `=destroy`(a: var Foo) =
|
||||||
|
doAssert @x == 1.5
|
||||||
|
doAssert compiles(@x == 1.5)
|
||||||
|
let b1 = @[1,2]
|
||||||
|
let b2 = @@[1,2]
|
||||||
|
doAssert $b1 == "[1, 2]"
|
||||||
|
doAssert $b2 == "@[1, 2]"
|
||||||
|
destroyCalled2 = true
|
||||||
|
block:
|
||||||
|
let a = Foo()
|
||||||
|
bar(someident)
|
||||||
|
doAssert destroyCalled2
|
||||||
|
|
||||||
|
proc `&%`(x: int): int = 1
|
||||||
|
proc `&%`(x, y: int): int = 2
|
||||||
|
|
||||||
|
macro bar2() =
|
||||||
|
var x = 3
|
||||||
|
result = quote("&%") do:
|
||||||
|
var y = &%x # quoting operator
|
||||||
|
doAssert &%&%y == 1 # unary operator => need to escape
|
||||||
|
doAssert y &% y == 2 # binary operator => no need to escape
|
||||||
|
doAssert y == 3
|
||||||
|
bar2()
|
||||||
|
|
@ -124,7 +124,7 @@ proc test(count: int) =
|
||||||
test(3)
|
test(3)
|
||||||
|
|
||||||
proc test2(count: int) =
|
proc test2(count: int) =
|
||||||
#block: #XXX: Fails with block currently
|
block: #XXX: Fails with block currently
|
||||||
var v {.global.} = newVariable(20)
|
var v {.global.} = newVariable(20)
|
||||||
|
|
||||||
var count = count - 1
|
var count = count - 1
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue