Skip to content

Commit

Permalink
Pass on assertions
Browse files Browse the repository at this point in the history
  • Loading branch information
guillep committed Aug 7, 2023
1 parent 842320f commit 287e371
Showing 1 changed file with 47 additions and 65 deletions.
112 changes: 47 additions & 65 deletions smalltalksrc/VMMaker/SpurGenerationScavenger.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -439,55 +439,36 @@ SpurGenerationScavenger >> fireEphemeronsInRememberedSet [
Fire them and scavenge their keys. Leave it to scavengeLoop
to remove any scavenged ephemerons that no longer have
new referents."
| i |

| i |
self assert: self noUnfiredEphemeronsAtEndOfRememberedSet.

i := 0.
[i < manager getFromOldSpaceRememberedSet numRememberedEphemerons] whileTrue:
[ | ephemeron key |
ephemeron := manager getFromOldSpaceRememberedSet objectAt: i.
self assert: (manager isEphemeron: ephemeron).
key := manager keyOfEphemeron: ephemeron.
(self isScavengeSurvivor: key) ifFalse:
[coInterpreter fireEphemeron: ephemeron.
manager
storePointerUnchecked: 0
ofObject: ephemeron
withValue: (self copyAndForward: key)].
"Fired ephemerons should have had their format changed."

self simulationOnly: [
self deny: ((self isScavengeSurvivor: key) and: [manager isEphemeron: ephemeron])].
[ i < manager getFromOldSpaceRememberedSet numRememberedEphemerons ]
whileTrue: [
| ephemeron key |
ephemeron := manager getFromOldSpaceRememberedSet objectAt: i.
self assert: (manager isEphemeron: ephemeron).
key := manager keyOfEphemeron: ephemeron.
(manager isForwarded: key) ifTrue: [
key := manager followForwarded: key ].

"Two cases may happen here:
- if the key did not survive, the ephemeron needs to be fired and the key copied to mark the ephemeron as surviving
- if the key already survived, it means a previous ephemeron in this ephemeron made our key survive. Scavenge it as a normal object then"
(self isScavengeSurvivor: key) ifFalse: [
coInterpreter fireEphemeron: ephemeron.
manager
storePointerUnchecked: 0
ofObject: ephemeron
withValue: (self copyAndForward: key) ].

(self scavengeReferentsOfFromOldSpace: ephemeron)
ifTrue: "keep in set"
[i := i + 1]
ifFalse:
[manager setIsRememberedOf: ephemeron to: false.
manager getFromOldSpaceRememberedSet removeLastEphemeronAndMoveTo: i.


"
""remove from set by overwriting with next-to-be scanned""
numRememberedEphemerons := numRememberedEphemerons - 1.
previousRememberedSetSize := previousRememberedSetSize - 1.
rememberedSetSize := rememberedSetSize - 1.
""First overwrite with last firable ephemeron (could be a noop if this is the last one).
Then overwrite last firable entry with next unscanned rememberedSet entry (could also be a noop).
Then overwrite next unscanned entry with last unscanned rememberedSet entry (could also be a noop).""
rememberedSet
at: i
put: (rememberedSet at: numRememberedEphemerons);
at: numRememberedEphemerons
put: (rememberedSet at: previousRememberedSetSize);
at: previousRememberedSetSize
put: (rememberedSet at: rememberedSetSize)
"



]].
(self scavengeReferentsOfFromOldSpace: ephemeron)
ifTrue: [ "keep in set" i := i + 1 ]
ifFalse: [
manager setIsRememberedOf: ephemeron to: false.
manager getFromOldSpaceRememberedSet
removeLastEphemeronAndMoveTo: i ] ].

"no more firable ephemerons in this cycle.
scavengeRememberedSetStartingAt: may find new ones."
Expand All @@ -499,37 +480,38 @@ SpurGenerationScavenger >> fireEphemeronsOnEphemeronList [
"There are ephemerons to be fired in the remembered set.
Fire them and scavenge their keys. Be careful since copyAndForward:
can remember ephemerons (ephemerons pointing to ephemerons)."
| ephemeron ephemeronCorpse key oldList oldCorpse | "old ones for debugging"
ephemeronList ifNil:
[^self].

| ephemeron ephemeronCorpse key oldList oldCorpse |
"old ones for debugging"
ephemeronList ifNil: [ ^ self ].
oldCorpse := nil.
ephemeronCorpse := self firstCorpse: ephemeronList.
"Reset the list head so that new ephemerons will get added
to a new list, not concatenated on the one we are scanning."
oldList := ephemeronList.
ephemeronList := nil.
[ephemeronCorpse notNil] whileTrue:
[
self simulationOnly: [
self assert: ((manager isYoung: ephemeronCorpse)
and: [manager isForwarded: ephemeronCorpse])].

ephemeron := manager followForwarded: ephemeronCorpse.
key := manager keyOfMaybeFiredEphemeron: ephemeron.
(self isScavengeSurvivor: key) ifFalse:
[coInterpreter fireEphemeron: ephemeron.
manager
[ ephemeronCorpse notNil ] whileTrue: [
self assert: ((manager isYoung: ephemeronCorpse) and: [
manager isForwarded: ephemeronCorpse ]).

ephemeron := manager followForwarded: ephemeronCorpse.
key := manager keyOfMaybeFiredEphemeron: ephemeron.
(self isScavengeSurvivor: key) ifFalse: [
coInterpreter fireEphemeron: ephemeron.
manager
storePointerUnchecked: 0
ofObject: ephemeron
withValue: (self copyAndForward: key).
"Fired ephemerons should have had their format changed."
self deny:
((self isScavengeSurvivor: key)
and: [manager isEphemeron: ephemeron])].

self cCoerceSimple: (self scavengeReferentsOfFromOldSpace: ephemeron) to: #void.
oldCorpse := ephemeronCorpse.
ephemeronCorpse := self nextCorpseOrNil: ephemeronCorpse]
self deny:
((self isScavengeSurvivor: key) and: [
manager isEphemeron: ephemeron ]) ].

self
cCoerceSimple: (self scavengeReferentsOfFromOldSpace: ephemeron)
to: #void.
oldCorpse := ephemeronCorpse.
ephemeronCorpse := self nextCorpseOrNil: ephemeronCorpse ]
]

{ #category : #'weakness and ephemerality' }
Expand Down

0 comments on commit 287e371

Please sign in to comment.