mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-02 19:22:40 +00:00
* fixes #21171; dyn destructors for acyclic inherited refs * add a test * Update compiler/liftdestructors.nim
78 lines
1.4 KiB
Nim
78 lines
1.4 KiB
Nim
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()
|