mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-30 09:54:49 +00:00
77 lines
1.5 KiB
Nim
77 lines
1.5 KiB
Nim
discard """
|
|
cmd: '''nim c --gc:arc $file'''
|
|
output: '''emptyemptyempty
|
|
inner destroy
|
|
'''
|
|
"""
|
|
|
|
# bug #15039
|
|
|
|
import lists
|
|
|
|
type
|
|
Token = ref object of RootObj
|
|
children: DoublyLinkedList[Token]
|
|
|
|
Paragraph = ref object of Token
|
|
|
|
method `$`(token: Token): string {.base.} =
|
|
result = "empty"
|
|
|
|
method `$`(token: Paragraph): string =
|
|
if token.children.head == nil:
|
|
result = ""
|
|
else:
|
|
for c in token.children:
|
|
result.add $c
|
|
|
|
proc parseLeafBlockInlines(token: Token) =
|
|
token.children.append(Token())
|
|
token.children.append(Token()) # <-- this one AAA
|
|
|
|
var emNode = newDoublyLinkedNode(Token())
|
|
var i = 0
|
|
|
|
var it = token.children.head
|
|
while it != nil:
|
|
var nxt = it.next # this is not a cursor, it takes over ownership.
|
|
var childNode = it
|
|
if i == 0:
|
|
childNode.next = emNode # frees the object allocated in line 29 marked with AAA
|
|
elif i == 1:
|
|
emNode.next = childNode #
|
|
it = nxt # incref on freed data, 'nxt' is freed
|
|
inc i
|
|
|
|
proc parse() =
|
|
var token = Token()
|
|
token.children.append Paragraph()
|
|
parseLeafBlockInlines(token.children.head.value)
|
|
for children in token.children:
|
|
echo children
|
|
|
|
parse()
|
|
|
|
|
|
#------------------------------------------------------------------------------
|
|
# issue #15629
|
|
|
|
type inner = object
|
|
type outer = ref inner
|
|
|
|
proc `=destroy`(b: var inner) =
|
|
echo "inner destroy"
|
|
|
|
proc newOuter(): outer =
|
|
new(result)
|
|
|
|
type holder = object
|
|
contents: outer
|
|
|
|
proc main() =
|
|
var t: holder
|
|
t.contents = newOuter()
|
|
|
|
main()
|
|
|