* fixes #21171; dyn destructors for acyclic inherited refs * add a test * Update compiler/liftdestructors.nim
This commit is contained in:
parent
7a74c2dc3a
commit
4b63ac4b87
3 changed files with 97 additions and 0 deletions
77
tests/arc/t21184.nim
Normal file
77
tests/arc/t21184.nim
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
discard """
|
||||
matrix: "--mm:orc"
|
||||
"""
|
||||
|
||||
import std/[with]
|
||||
|
||||
type
|
||||
Node* {.acyclic.} = ref object of RootObj
|
||||
name: string
|
||||
data: pointer
|
||||
children: seq[Node]
|
||||
TextNode = ref object of Node
|
||||
text: string
|
||||
|
||||
proc fakeEcho(s: string) =
|
||||
if s.len < 0:
|
||||
echo s
|
||||
|
||||
proc newNode[T: Node](parent: Node): T =
|
||||
new result
|
||||
result.data = alloc0(250)
|
||||
parent.children.add(result)
|
||||
|
||||
proc newRootNode(): Node =
|
||||
new result
|
||||
result.data = alloc0(250)
|
||||
|
||||
method printNode(node: Node) {.base.} =
|
||||
fakeEcho node.name
|
||||
|
||||
method printNode(node: TextNode) =
|
||||
procCall printNode(Node(node))
|
||||
fakeEcho node.text
|
||||
|
||||
proc printChildren(node: Node) =
|
||||
for child in node.children:
|
||||
child.printNode()
|
||||
printChildren(child)
|
||||
|
||||
proc free(node: Node) =
|
||||
for child in node.children:
|
||||
free(child)
|
||||
dealloc(node.data)
|
||||
|
||||
template node(parent: Node, body: untyped): untyped =
|
||||
var node = newNode[Node](parent)
|
||||
with node:
|
||||
body
|
||||
|
||||
proc textNode(parent: Node, text: string) =
|
||||
var node = newNode[TextNode](parent)
|
||||
node.text = text
|
||||
|
||||
template withRootNode(body: untyped): untyped =
|
||||
var root = newRootNode()
|
||||
root.name = "root"
|
||||
with root:
|
||||
body
|
||||
root.printNode()
|
||||
printChildren(root)
|
||||
root.free()
|
||||
|
||||
proc doTest() =
|
||||
withRootNode:
|
||||
node:
|
||||
name = "child1"
|
||||
node:
|
||||
name = "child2"
|
||||
node:
|
||||
name = "child3"
|
||||
textNode "Hello, world!"
|
||||
|
||||
|
||||
# bug #21171
|
||||
if isMainModule:
|
||||
for i in 0..100000:
|
||||
doTest()
|
||||
Loading…
Add table
Add a link
Reference in a new issue