diff --git a/smalltalksrc/VMMaker/SpurMemoryManager.class.st b/smalltalksrc/VMMaker/SpurMemoryManager.class.st index 8090b2e79d..3c456920d7 100644 --- a/smalltalksrc/VMMaker/SpurMemoryManager.class.st +++ b/smalltalksrc/VMMaker/SpurMemoryManager.class.st @@ -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 @@ -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." - | 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 and: [ - 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: [ 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' }