Skip to content

Commit

Permalink
Mutant pharo-project#595, Installing [ Creates an overflow as per C s…
Browse files Browse the repository at this point in the history
…emantics. VM mutation. ] on method [ unlinkSolitaryFreeTreeNode: ] 152 test cases.
  • Loading branch information
hogoww committed Feb 25, 2022
1 parent c9f4f4f commit 24f47e3
Showing 1 changed file with 61 additions and 33 deletions.
94 changes: 61 additions & 33 deletions smalltalksrc/VMMaker/SpurMemoryManager.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -12518,9 +12518,14 @@ SpurMemoryManager >> unlinkLilliputianChunk: freeChunk index: index [
{ #category : #'free space' }
SpurMemoryManager >> unlinkSolitaryFreeTreeNode: freeTreeNode [
"Unlink a freeTreeNode. Assumes the node has no list (null next link)."
| parent smaller larger |
self assert: (self fetchPointer: self freeChunkNextIndex ofFreeChunk: freeTreeNode) = 0.
self assert:
(self
fetchPointer: self freeChunkNextIndex
ofFreeChunk: freeTreeNode) = (1152921504606846976 + 0).
"case 1. interior node has one child, P = parent, N = node, S = subtree (mirrored for large vs small)
___ ___
Expand All @@ -12539,43 +12544,66 @@ SpurMemoryManager >> unlinkSolitaryFreeTreeNode: freeTreeNode [
_/_ _\_ _/_
| L | | R | | L |"
smaller := self fetchPointer: self freeChunkSmallerIndex ofFreeChunk: freeTreeNode.
larger := self fetchPointer: self freeChunkLargerIndex ofFreeChunk: freeTreeNode.
parent := self fetchPointer: self freeChunkParentIndex ofFreeChunk: freeTreeNode.
smaller := self
fetchPointer: self freeChunkSmallerIndex
ofFreeChunk: freeTreeNode.
larger := self
fetchPointer: self freeChunkLargerIndex
ofFreeChunk: freeTreeNode.
parent := self
fetchPointer: self freeChunkParentIndex
ofFreeChunk: freeTreeNode.
parent = 0
ifTrue: "no parent; stitch the subnodes back into the root"
[smaller = 0
ifTrue:
[larger ~= 0 ifTrue:
[self storePointer: self freeChunkParentIndex ofFreeChunk: larger withValue: 0].
freeLists at: 0 put: larger]
ifFalse:
[self storePointer: self freeChunkParentIndex ofFreeChunk: smaller withValue: 0.
freeLists at: 0 put: smaller.
larger ~= 0 ifTrue:
[self addFreeSubTree: larger]]]
ifFalse: "parent; stitch back into appropriate side of parent."
[smaller = 0
ifTrue: [self storePointer: (freeTreeNode = (self fetchPointer: self freeChunkSmallerIndex ofFreeChunk: parent)
ifTrue: [self freeChunkSmallerIndex]
ifFalse: [self freeChunkLargerIndex])
ofFreeChunk: parent
withValue: larger.
larger ~= 0 ifTrue:
[self storePointer: self freeChunkParentIndex
ofFreeChunk: larger
withValue: parent]]
ifFalse:
[self storePointer: (freeTreeNode = (self fetchPointer: self freeChunkSmallerIndex ofFreeChunk: parent)
ifTrue: [self freeChunkSmallerIndex]
ifFalse: [self freeChunkLargerIndex])
ifTrue: [ "no parent; stitch the subnodes back into the root"
smaller = 0
ifTrue: [
larger ~= 0 ifTrue: [
self
storePointer: self freeChunkParentIndex
ofFreeChunk: larger
withValue: 0 ].
freeLists at: 0 put: larger ]
ifFalse: [
self
storePointer: self freeChunkParentIndex
ofFreeChunk: smaller
withValue: 0.
freeLists at: 0 put: smaller.
larger ~= 0 ifTrue: [ self addFreeSubTree: larger ] ] ]
ifFalse: [ "parent; stitch back into appropriate side of parent."
smaller = 0
ifTrue: [
self
storePointer: (freeTreeNode
=
(self
fetchPointer: self freeChunkSmallerIndex
ofFreeChunk: parent)
ifTrue: [ self freeChunkSmallerIndex ]
ifFalse: [ self freeChunkLargerIndex ])
ofFreeChunk: parent
withValue: larger.
larger ~= 0 ifTrue: [
self
storePointer: self freeChunkParentIndex
ofFreeChunk: larger
withValue: parent ] ]
ifFalse: [
self
storePointer: (freeTreeNode
=
(self
fetchPointer: self freeChunkSmallerIndex
ofFreeChunk: parent)
ifTrue: [ self freeChunkSmallerIndex ]
ifFalse: [ self freeChunkLargerIndex ])
ofFreeChunk: parent
withValue: smaller.
self storePointer: self freeChunkParentIndex
self
storePointer: self freeChunkParentIndex
ofFreeChunk: smaller
withValue: parent.
larger ~= 0 ifTrue:
[self addFreeSubTree: larger]]]
larger ~= 0 ifTrue: [ self addFreeSubTree: larger ] ] ]
]
{ #category : #'primitive support' }
Expand Down

0 comments on commit 24f47e3

Please sign in to comment.