More generic linked list support.

This commit is contained in:
Martin Haye
2015-09-07 08:46:17 -07:00
parent 6d61a0073f
commit da6073fefa

View File

@@ -1686,19 +1686,29 @@ def countList(p)
return n return n
end end
def unlinkPlayer(toRemove) def randomFromList(p)
word n
n = rand16() % countList(p)
while n > 0
p = p=>nextObj
n = n-1
loop
return p
end
def unlinkFromList(pList, toRemove)
word p word p
word prev word prev
word n, n2 word n, n2
// Count number of players before // Count number of players before
n = countList(global=>players) n = countList(*pList)
// Now unlink // Now unlink
prev = NULL prev = NULL
p = global=>players p = *pList
if p == toRemove if p == toRemove
global=>players = p=>nextObj *pList = p=>nextObj
else else
while p while p
if p == toRemove if p == toRemove
@@ -1717,7 +1727,7 @@ def unlinkPlayer(toRemove)
p=>nextObj = NULL p=>nextObj = NULL
// Check count after // Check count after
n2 = countList(global=>players) n2 = countList(*pList)
if n-1 <> n2 if n-1 <> n2
printf2("Info: n before=%d after=%d\n", n, n2) printf2("Info: n before=%d after=%d\n", n, n2)
fatal("Unlink didn't work") fatal("Unlink didn't work")
@@ -1746,10 +1756,9 @@ def testHeap()
collect() collect()
addPlayer() addPlayer()
collect() collect()
p = global=>players p = randomFromList(global=>players)
p = p=>nextObj
printf1("Unlinking player $%x\n", p) printf1("Unlinking player $%x\n", p)
unlinkPlayer(p) unlinkFromList(global + players, p)
puts("Freeing player\n") puts("Freeing player\n")
freeObj(p) freeObj(p)
puts("Collecting.\n") puts("Collecting.\n")