cursor and mutation tracking fixes (#15113)
* fixes #15110 * fixes #15096 * prepare varpartitions for cursor inference * new cursor inference begins to work * make tests green
This commit is contained in:
parent
32c6146200
commit
d130175342
8 changed files with 311 additions and 368 deletions
51
tests/arc/topt_cursor2.nim
Normal file
51
tests/arc/topt_cursor2.nim
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
discard """
|
||||
output: '''emptyemptyempty'''
|
||||
cmd: '''nim c --gc:arc $file'''
|
||||
"""
|
||||
|
||||
# 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()
|
||||
|
|
@ -29,11 +29,14 @@ result = (
|
|||
-- end of expandArc ------------------------
|
||||
--expandArc: delete
|
||||
|
||||
var saved
|
||||
var sibling_cursor = target.parent.left
|
||||
`=`(saved, sibling_cursor.right)
|
||||
`=`(sibling_cursor.right, saved.left)
|
||||
`=sink`(sibling_cursor.parent, saved)
|
||||
var
|
||||
sibling
|
||||
saved
|
||||
`=`(sibling, target.parent.left)
|
||||
`=`(saved, sibling.right)
|
||||
`=`(sibling.right, saved.left)
|
||||
`=sink`(sibling.parent, saved)
|
||||
`=destroy`(sibling)
|
||||
-- end of expandArc ------------------------'''
|
||||
"""
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue