Skip to content

Commit

Permalink
Mutant pharo-project#384, Reverting [ Replace #- with #+ ] on method …
Browse files Browse the repository at this point in the history
…[ addToFreeTree:bytes: ] KILLED by 1/234 test cases.
  • Loading branch information
hogoww committed Dec 29, 2021
1 parent 764a27a commit 9c2e613
Showing 1 changed file with 34 additions and 60 deletions.
94 changes: 34 additions & 60 deletions smalltalksrc/VMMaker/SpurMemoryManager.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -1294,81 +1294,55 @@ SpurMemoryManager >> addToFreeList: freeChunk bytes: chunkBytes [
{ #category : #'free space' }
SpurMemoryManager >> addToFreeTree: freeChunk bytes: chunkBytes [
"Add freeChunk to the large free chunk tree.
For the benefit of sortedFreeObject:, answer the treeNode it is added
to, if it is added to the next list of a freeTreeNode, otherwise answer 0."
| childBytes parent child |
self assert: (self isFreeObject: freeChunk).
self assert: chunkBytes = (self bytesInObject: freeChunk).
self assert: chunkBytes >= (self numFreeLists * self allocationUnit).
self
storePointer: self freeChunkNextIndex
ofFreeChunk: freeChunk
withValue: 0;
storePointer: self freeChunkPrevIndex
ofFreeChunk: freeChunk
withValue: 0;
storePointer: self freeChunkParentIndex
ofFreeChunk: freeChunk
withValue: 0;
storePointer: self freeChunkSmallerIndex
ofFreeChunk: freeChunk
withValue: 0;
storePointer: self freeChunkLargerIndex
ofFreeChunk: freeChunk
withValue: 0.
storePointer: self freeChunkNextIndex ofFreeChunk: freeChunk withValue: 0;
storePointer: self freeChunkPrevIndex ofFreeChunk: freeChunk withValue: 0;
storePointer: self freeChunkParentIndex ofFreeChunk: freeChunk withValue: 0;
storePointer: self freeChunkSmallerIndex ofFreeChunk: freeChunk withValue: 0;
storePointer: self freeChunkLargerIndex ofFreeChunk: freeChunk withValue: 0.
"Large chunk list organized as a tree, each node of which is a list of chunks of the same size.
Beneath the node are smaller and larger blocks."
parent := 0.
child := freeLists at: 0.
[ child ~= 0 ] whileTrue: [
childBytes := self bytesInObject: child.
"check for overlap; could write this as self oop: (self objectAfter: freeChunk) isLessThanOrEqualTo: child...
[child ~= 0] whileTrue:
[childBytes := self bytesInObject: child.
"check for overlap; could write this as self oop: (self objectAfter: freeChunk) isLessThanOrEqualTo: child...
but that relies on headers being correct, etc. So keep it clumsy..."
self assert: ((self
oop: freeChunk + chunkBytes - self baseHeaderSize
isLessThanOrEqualTo: child) or: [
self
oop: freeChunk
isGreaterThanOrEqualTo: child + childBytes + self baseHeaderSize ]).
childBytes = chunkBytes ifTrue: [ "size match; add to list at node."
self
setNextFreeChunkOf: freeChunk
withValue:
(self fetchPointer: self freeChunkNextIndex ofFreeChunk: child)
isLilliputianSize: false.
self
setNextFreeChunkOf: child
withValue: freeChunk
isLilliputianSize: false.
^ child ].
"walk down the tree"
parent := child.
child := self
fetchPointer: (childBytes > chunkBytes
ifTrue: [ self freeChunkSmallerIndex ]
ifFalse: [ self freeChunkLargerIndex ])
ofFreeChunk: child ].
parent = 0 ifTrue: [
self assert: (freeLists at: 0) = 0.
freeLists at: 0 put: freeChunk.
freeListsMask := freeListsMask bitOr: 1.
^ 0 ].
self assert: ((self oop: freeChunk + chunkBytes - self baseHeaderSize isLessThanOrEqualTo: child)
or: [self oop: freeChunk isGreaterThanOrEqualTo: child + childBytes - self baseHeaderSize]).
childBytes = chunkBytes ifTrue: "size match; add to list at node."
[self setNextFreeChunkOf: freeChunk withValue: (self fetchPointer: self freeChunkNextIndex ofFreeChunk: child) isLilliputianSize: false.
self setNextFreeChunkOf: child withValue: freeChunk isLilliputianSize: false.
^child].
"walk down the tree"
parent := child.
child := self fetchPointer: (childBytes > chunkBytes
ifTrue: [self freeChunkSmallerIndex]
ifFalse: [self freeChunkLargerIndex])
ofFreeChunk: child].
parent = 0 ifTrue:
[self assert: (freeLists at: 0) = 0.
freeLists at: 0 put: freeChunk.
freeListsMask := freeListsMask bitOr: 1.
^0].
self assert: (freeListsMask anyMask: 1).
"insert in tree"
self
storePointer: self freeChunkParentIndex
ofFreeChunk: freeChunk
withValue: parent.
self
storePointer: (childBytes > chunkBytes
ifTrue: [ self freeChunkSmallerIndex ]
ifFalse: [ self freeChunkLargerIndex ])
ofFreeChunk: parent
withValue: freeChunk.
^ 0
self storePointer: self freeChunkParentIndex
ofFreeChunk: freeChunk
withValue: parent.
self storePointer: (childBytes > chunkBytes
ifTrue: [self freeChunkSmallerIndex]
ifFalse: [self freeChunkLargerIndex])
ofFreeChunk: parent
withValue: freeChunk.
^0
]
{ #category : #'object enumeration' }
Expand Down

0 comments on commit 9c2e613

Please sign in to comment.