diff --git a/smalltalksrc/VMMaker/SpurMemoryManager.class.st b/smalltalksrc/VMMaker/SpurMemoryManager.class.st index fa524e3056..d6cae225bb 100644 --- a/smalltalksrc/VMMaker/SpurMemoryManager.class.st +++ b/smalltalksrc/VMMaker/SpurMemoryManager.class.st @@ -8159,7 +8159,6 @@ SpurMemoryManager >> markAllUnscannedEphemerons [ { #category : #'gc - global' } SpurMemoryManager >> markAndShouldScan: objOop [ - "Helper for markAndTrace:. Mark the argument, and answer if its fields should be scanned now. Immediate objects don't need to be marked. @@ -8167,24 +8166,29 @@ SpurMemoryManager >> markAndShouldScan: objOop [ Pure bits objects don't need scanning, although their class does. Weak objects should be pushed on the weakling stack. Anything else need scanning." - - | format | - false ifTrue: [ ^ false ]. + + (self isImmediate: objOop) ifTrue: + [^false]. + "if markAndTrace: is to follow and eliminate forwarding pointers + in its scan it cannot be handed an r-value which is forwarded." self assert: (self isForwarded: objOop) not. - (self isMarked: objOop) ifTrue: [ ^ false ]. + (self isMarked: objOop) ifTrue: + [^false]. self setIsMarkedOf: objOop to: true. format := self formatOf: objOop. - (self isPureBitsFormat: format) ifTrue: [ "Avoid tracing classes of non-objects on the heap, e.g. IRC caches, Sista counters.""avoid pushing non-pointer objects on the markStack." - (self classIndexOf: objOop) > self lastClassIndexPun ifTrue: [ - self markAndTraceClassOf: objOop ]. - ^ false ]. - format = self weakArrayFormat ifTrue: [ "push weaklings on the weakling stack to scan later" - self push: objOop onObjStack: weaklingStack. - ^ false ]. - (format = self ephemeronFormat and: [ - self activeAndDeferredScan: objOop ]) ifTrue: [ ^ false ]. - ^ true + (self isPureBitsFormat: format) ifTrue: "avoid pushing non-pointer objects on the markStack." + ["Avoid tracing classes of non-objects on the heap, e.g. IRC caches, Sista counters." + (self classIndexOf: objOop) > self lastClassIndexPun ifTrue: + [self markAndTraceClassOf: objOop]. + ^false]. + format = self weakArrayFormat ifTrue: "push weaklings on the weakling stack to scan later" + [self push: objOop onObjStack: weaklingStack. + ^false]. + (format = self ephemeronFormat + and: [self activeAndDeferredScan: objOop]) ifTrue: + [^false]. + ^true ] { #category : #'gc - global' }