Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.886.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.886 Author: eem Time: 25 September 2014, 3:54:29.308 pm UUID: fb69945a-ff92-425c-9f6e-e2d9bba462ac Ancestors: VMMaker.oscog-eem.882
Fix regression in youngReferrers management in V3 become introduced in VMMaker.oscog-eem.882. We /must/ priune young referrers if mapObjectReferencesInMachineCodeForBecome removes a cog method from youngReferrers because it may get added back and youngReferrers cannot contain duplicates.
Commit this separate from VMMaker.oscog-eem.885 to have it separate from the flush caches on Spur become changes from VMMaker.oscog-eem.883/884.
To be clear, this is a branch. The head is 885.
=============== Diff against VMMaker.oscog-eem.882 ===============
Item was changed: ----- Method: Cogit>>mapObjectReferencesInMachineCodeForBecome (in category 'garbage collection') ----- mapObjectReferencesInMachineCodeForBecome "Update all references to objects in machine code for a become. Unlike incrementalGC or fullGC a method that does not refer to young may refer to young as a result of the become operation. Unlike incrementalGC or fullGC the reference from a Cog method to its methodObject *must not* change since the two are two halves of the same object." | cogMethod hasYoungObj hasYoungObjPtr freedPIC | <var: #cogMethod type: #'CogMethod *'> hasYoungObj := false. hasYoungObjPtr := (self addressOf: hasYoungObj put: [:val| hasYoungObj := val]) asInteger. codeModified := freedPIC := false. self mapObjectReferencesInGeneratedRuntime. cogMethod := self cCoerceSimple: methodZoneBase to: #'CogMethod *'. [cogMethod < methodZone limitZony] whileTrue: [self assert: hasYoungObj not. cogMethod cmType ~= CMFree ifTrue: [self assert: (self cogMethodDoesntLookKosher: cogMethod) = 0. cogMethod selector: (objectRepresentation remapOop: cogMethod selector). cogMethod cmType = CMClosedPIC ifTrue: [((objectMemory isYoung: cogMethod selector) or: [self mapObjectReferencesInClosedPIC: cogMethod]) ifTrue: [freedPIC := true. methodZone freeMethod: cogMethod]] ifFalse: [(objectMemory isYoung: cogMethod selector) ifTrue: [hasYoungObj := true]. cogMethod cmType = CMMethod ifTrue: [| remappedMethod | self assert: cogMethod objectHeader = objectMemory nullHeaderForMachineCodeMethod. remappedMethod := objectRepresentation remapOop: cogMethod methodObject. remappedMethod ~= cogMethod methodObject ifTrue: [(coInterpreter methodHasCogMethod: remappedMethod) ifTrue: [self error: 'attempt to become two cogged methods']. (objectMemory withoutForwardingOn: cogMethod methodObject and: remappedMethod with: cogMethod cmUsesPenultimateLit sendToCogit: #method:hasSameCodeAs:checkPenultimate:) ifFalse: [self error: 'attempt to become cogged method into different method']. "For non-Newspeak there should ne a one-to-one mapping between bytecoded and cog methods. For Newspeak not necessarily, but only for anonymous accessors." "Only reset the method object's header if it is referring to this CogMethod." (coInterpreter rawHeaderOf: cogMethod methodObject) = cogMethod asInteger ifTrue: [coInterpreter rawHeaderOf: cogMethod methodObject put: cogMethod methodHeader. cogMethod methodHeader: (coInterpreter rawHeaderOf: remappedMethod); methodObject: remappedMethod. coInterpreter rawHeaderOf: remappedMethod put: cogMethod asInteger] ifFalse: [self assert: (self noAssertMethodClassAssociationOf: cogMethod methodObject) = objectMemory nilObject. cogMethod methodHeader: (coInterpreter rawHeaderOf: remappedMethod); methodObject: remappedMethod]]. (objectMemory isYoung: cogMethod methodObject) ifTrue: [hasYoungObj := true]]. self mapFor: cogMethod performUntil: #remapIfObjectRef:pc:hasYoung: arg: hasYoungObjPtr. hasYoungObj ifTrue: [methodZone ensureInYoungReferrers: cogMethod. hasYoungObj := false] ifFalse: [cogMethod cmRefersToYoung: false]]]. cogMethod := methodZone methodAfter: cogMethod]. + "we /must/ prune youngReferrers here because a) the [cogMethod cmRefersToYoung: false] + block could have removed a method and subsequently it could be added back, and b) we + can not tolerate duplicates in the youngReferrers list." + methodZone pruneYoungReferrers. freedPIC ifTrue: [self unlinkSendsToFree]. codeModified ifTrue: "After updating oops in inline caches we need to flush the icache." [processor flushICacheFrom: codeBase to: methodZone limitZony asInteger]!
vm-dev@lists.squeakfoundation.org