Skip to content

Commit

Permalink
Mutant pharo-project#428, Reverting [ Replace #and: argument with [tr…
Browse files Browse the repository at this point in the history
…ue] ] on method [ freeTreeNodesDo: ] KILLED by 1/234 test cases.
  • Loading branch information
hogoww committed Dec 29, 2021
1 parent 41dc9b2 commit 30c2d4a
Showing 1 changed file with 27 additions and 45 deletions.
72 changes: 27 additions & 45 deletions smalltalksrc/VMMaker/SpurMemoryManager.class.st
Expand Up @@ -5633,7 +5633,6 @@ SpurMemoryManager >> freeStart [
{ #category : #'free space' }
SpurMemoryManager >> freeTreeNodesDo: aBlock [
"Enumerate all nodes in the free tree (in order, smaller to larger),
but *not* including the next nodes of the same size off each tree node.
This is an iterative version so that the block argument can be
Expand All @@ -5644,55 +5643,38 @@ SpurMemoryManager >> freeTreeNodesDo: aBlock [
N.B For the convenience of rebuildFreeTreeFromSortedFreeChunks
aBlock *MUST* answer the freeTreeNode it was invoked with, or
its replacement if it was replaced by aBlock."
<inline: true>
| treeNode cameFrom |
treeNode := freeLists at: 0.
treeNode = 0 ifTrue: [ ^ self ].
treeNode = 0 ifTrue:
[^self].
cameFrom := -1.
[
| smallChild largeChild |
self assert: (self bytesInObject: treeNode)
>= (self numFreeLists * self allocationUnit).
smallChild := self
fetchPointer: self freeChunkSmallerIndex
ofFreeChunk: treeNode.
largeChild := self
fetchPointer: self freeChunkLargerIndex
ofFreeChunk: treeNode.
self assert: (smallChild = 0 or: [
treeNode
=
(self
fetchPointer: self freeChunkParentIndex
ofFreeChunk: smallChild) ]).
self assert: (largeChild = 0 or: [
treeNode
=
(self
fetchPointer: self freeChunkParentIndex
ofFreeChunk: largeChild) ]).
"apply if the node has no children, or it has no large children and we're
[| smallChild largeChild |
self assert: (self bytesInObject: treeNode) >= (self numFreeLists * self allocationUnit).
smallChild := self fetchPointer: self freeChunkSmallerIndex ofFreeChunk: treeNode.
largeChild := self fetchPointer: self freeChunkLargerIndex ofFreeChunk: treeNode.
self assert: (smallChild = 0 or: [treeNode = (self fetchPointer: self freeChunkParentIndex ofFreeChunk: smallChild)]).
self assert: (largeChild = 0 or: [treeNode = (self fetchPointer: self freeChunkParentIndex ofFreeChunk: largeChild)]).
"apply if the node has no children, or it has no large children and we're
returning from the small child, or we're returning from the large child."
((smallChild = 0 and: [ true ]) or: [
largeChild = 0
ifTrue: [ cameFrom = smallChild ]
ifFalse: [ cameFrom = largeChild ] ])
ifTrue: [
treeNode := aBlock value: treeNode.
"and since we've applied we must move on up"
cameFrom := treeNode.
treeNode := self
fetchPointer: self freeChunkParentIndex
ofFreeChunk: treeNode ]
ifFalse: [
(smallChild ~= 0 and: [ cameFrom ~= smallChild ])
ifTrue: [ treeNode := smallChild ]
ifFalse: [
self assert: largeChild ~= 0.
treeNode := largeChild ].
cameFrom := -1 ].
treeNode ~= 0 ] whileTrue
((smallChild = 0 and: [largeChild = 0])
or: [largeChild = 0
ifTrue: [cameFrom = smallChild]
ifFalse: [cameFrom = largeChild]])
ifTrue:
[treeNode := aBlock value: treeNode.
"and since we've applied we must move on up"
cameFrom := treeNode.
treeNode := self fetchPointer: self freeChunkParentIndex ofFreeChunk: treeNode]
ifFalse:
[(smallChild ~= 0 and: [cameFrom ~= smallChild])
ifTrue:
[treeNode := smallChild]
ifFalse:
[self assert: largeChild ~= 0.
treeNode := largeChild].
cameFrom := -1].
treeNode ~= 0] whileTrue
]
{ #category : #'free space' }
Expand Down

0 comments on commit 30c2d4a

Please sign in to comment.