Skip to content

Commit

Permalink
Fixing the comparison to detect forwarders and valid objects
Browse files Browse the repository at this point in the history
  • Loading branch information
tesonep committed Jul 8, 2022
1 parent 52e2409 commit 6f7a710
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 8 deletions.
24 changes: 16 additions & 8 deletions smalltalksrc/VMMaker/SpurMemoryManager.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -8834,15 +8834,23 @@ SpurMemoryManager >> moveToPermSpace: objOop [
0 to: numSlots - 1 do: [ :i | | referenced |
referenced := self fetchPointer: i ofObject: objOop.
((self isNonImmediate: referenced) and: [self isForwarded: referenced])
ifTrue: [ referenced := self followForwarded: referenced ].
"We check only if the object has not be already detected and only for the pointer slots."
((shouldBeRememberedInOldSpace not and: [ i <= numPointerSlots ])
and: [ (((self isFixedKnownObject: referenced) not
and: [ (self isNonImmediate: referenced) and: [ referenced >= self getMemoryMap newSpaceStart ]])
and: [(self getMemoryMap isYoungObject: referenced) or: [ self getMemoryMap isOldObject: referenced ]])])
ifTrue: [ shouldBeRememberedInOldSpace := true ].
"We check if we have an object in the pointer slots of objOop"
(i < numPointerSlots
and: [(self isNonImmediate: referenced)
and: [self isInObjectMemory: referenced ]])
ifTrue: [
(self isForwarded: referenced)
ifTrue: [ referenced := self followForwarded: referenced ].
(shouldBeRememberedInOldSpace not
and: [ (self isFixedKnownObject: referenced) not
and: [(self getMemoryMap isYoungObject: referenced) or: [
self getMemoryMap isOldObject: referenced ]]])
ifTrue: [ shouldBeRememberedInOldSpace := true ]].
"We check only if the object has not be already detected."
self
storePointerUnchecked: i
Expand Down
18 changes: 18 additions & 0 deletions smalltalksrc/VMMakerTests/VMPermanentSpaceMemoryTest.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,24 @@ VMPermanentSpaceMemoryTest >> testNextObjectIsReturningAGoodValue [

]

{ #category : #'test - moving' }
VMPermanentSpaceMemoryTest >> testObjectWithForwarderIsCorrectlyResolved [


| oldObject1 oldObject2 permanentObject1 permanentObject2 |
oldObject1 := self newOldSpaceObjectWithSlots: 1.
oldObject2 := self newOldSpaceObjectWithSlots: 1.

memory storePointer: 0 ofObject: oldObject2 withValue: oldObject1.

permanentObject1 := memory moveToPermSpace: oldObject1.
permanentObject2 := memory moveToPermSpace: oldObject2.

self assert: (memory fetchPointer: 0 ofObject: permanentObject2) equals: permanentObject1.
self deny: (memory isForwarded: (memory fetchPointer: 0 ofObject: permanentObject2)).

]

{ #category : #'test - moving' }
VMPermanentSpaceMemoryTest >> testPassingTwoObjectsToPermSpaceIsRemovedFromRememberedSet [

Expand Down

0 comments on commit 6f7a710

Please sign in to comment.