From d0b92cad85dd7ea3aa651e7078e6d41d2ea2f87d Mon Sep 17 00:00:00 2001 From: hogoww Date: Wed, 29 Dec 2021 08:40:54 +0100 Subject: [PATCH] Mutant #456, Installing [ Replace #or: with #and: ] on method [ freeTreeNodesDo: ] --- .../VMMaker/SpurMemoryManager.class.st | 72 ++++++++++++------- 1 file changed, 45 insertions(+), 27 deletions(-) diff --git a/smalltalksrc/VMMaker/SpurMemoryManager.class.st b/smalltalksrc/VMMaker/SpurMemoryManager.class.st index 3c456920d7..f55eeeab8d 100644 --- a/smalltalksrc/VMMaker/SpurMemoryManager.class.st +++ b/smalltalksrc/VMMaker/SpurMemoryManager.class.st @@ -5633,6 +5633,7 @@ 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 @@ -5643,38 +5644,55 @@ 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." + | 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 and: [ + 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: [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 + ((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' }