Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.585.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.585 Author: eem Time: 14 January 2014, 3:37:02.93 pm UUID: ffc9c619-e2b4-4432-977e-aba381f975ff Ancestors: VMMaker.oscog-eem.584
Fix become on compiled methods in Spur. followForwardedMethods must use isForwarded:/followForwarded: not shouldRemapObj: because the latter will confuse methods in newSpace for forwarded methods. Rename the interpreter followForwardedMethods' to followForwardedMethodsInMethodZone.
In General: Fix some comment typos. Better comment the closed PIC prototype.
Add CogMethodZone>>printCogYoungReferrers.
=============== Diff against VMMaker.oscog-eem.584 ===============
Item was removed: - ----- Method: CoInterpreter>>followForwardedMethods (in category 'object memory support') ----- - followForwardedMethods - <doNotGenerate> - cogit followForwardedMethods!
Item was added: + ----- Method: CoInterpreter>>followForwardedMethodsInMethodZone (in category 'object memory support') ----- + followForwardedMethodsInMethodZone + <inline: true> + cogit followForwardedMethods!
Item was added: + ----- Method: CogMethodZone>>printCogYoungReferrers (in category 'printing') ----- + printCogYoungReferrers + <api> + <returnTypeC: #void> + | pointer cogMethod | + <var: #cogMethod type: #'CogMethod *'> + pointer := youngReferrers. + [pointer < limitAddress] whileTrue: + [cogMethod := coInterpreter cCoerceSimple: (objectMemory longAt: pointer) to: #'CogMethod *'. + cogMethod cmRefersToYoung ifFalse: + [coInterpreter print: '* ']. + coInterpreter printCogMethod: cogMethod. + pointer := pointer + BytesPerWord]!
Item was changed: ----- Method: Cogit>>compileClosedPICPrototype (in category 'in-line cacheing') ----- compileClosedPICPrototype + "Compile the abstract instructions for a full closed PIC used to initialize closedPICSize. + The loads into SendNumArgsReg are those for optional method objects which may be + used in MNU cases." - "Compile the abstract instructions for a full closed PIC used to initialize closedPICSize" | numArgs jumpNext | <var: #jumpNext type: #'AbstractInstruction *'> numArgs := 0. self compilePICProlog: numArgs. jumpNext := self compileCPICEntry. self MoveCw: 16r5EAF00D R: SendNumArgsReg. self JumpLong: 16r5EEDCA5E. jumpNext jmpTarget: (endCPICCase0 := self Label). 1 to: numPICCases - 1 do: [:h| self CmpCw: 16rBABE1F15+h R: TempReg. self MoveCw: 16rBADA550 + h R: SendNumArgsReg. self JumpLongZero: 16rBEDCA5E0. h = 1 ifTrue: [endCPICCase1 := self Label]]. self MoveCw: 16rAB5CE55 R: ClassReg. self JumpLong: (self cPICMissTrampolineFor: numArgs). ^0!
Item was changed: ----- Method: Cogit>>followForwardedMethods (in category 'garbage collection') ----- followForwardedMethods <api> <option: #SpurObjectMemory> <var: #cogMethod type: #'CogMethod *'> | cogMethod freedPIC | <var: #cogMethod type: #'CogMethod *'> freedPIC := false. cogMethod := self cCoerceSimple: methodZoneBase to: #'CogMethod *'. [cogMethod < methodZone limitZony] whileTrue: [cogMethod cmType = CMMethod ifTrue: + [(objectMemory isForwarded: cogMethod methodObject) ifTrue: + [cogMethod methodObject: (objectMemory followForwarded: cogMethod methodObject). - [(objectMemory shouldRemapOop: cogMethod methodObject) ifTrue: - [cogMethod methodObject: (objectMemory remapObj: cogMethod methodObject). (cogMethod cmRefersToYoung not and: [objectMemory isYoungObject: cogMethod methodObject]) ifTrue: [methodZone addToYoungReferrers: cogMethod]]]. cogMethod cmType = CMClosedPIC ifTrue: + [(self followMethodReferencesInClosedPIC: cogMethod) ifTrue: - [(self mapObjectReferencesInClosedPIC: cogMethod) ifTrue: [freedPIC := true. methodZone freeMethod: cogMethod]]. cogMethod := methodZone methodAfter: cogMethod]. freedPIC ifTrue: [self unlinkSendsToFree. processor flushICacheFrom: codeBase to: methodZone limitZony asInteger]!
Item was added: + ----- Method: Cogit>>followMaybeObjRefAt: (in category 'garbage collection') ----- + followMaybeObjRefAt: mcpc + "Follow a potential object reference from a closed PIC. + This may be a method reference or null. + Answer if the followed literal is young." + | object subject | + object := backEnd literalBeforeFollowingAddress: mcpc. + (objectRepresentation couldBeObject: object) ifFalse: + [^false]. + (objectMemory isForwarded: object) ifFalse: + [^objectMemory isYoungObject: object]. + subject := objectMemory followForwarded: object. + backEnd storeLiteral: subject beforeFollowingAddress: mcpc. + codeModified := true. + ^objectMemory isYoungObject: subject!
Item was added: + ----- Method: Cogit>>followMethodReferencesInClosedPIC: (in category 'garbage collection') ----- + followMethodReferencesInClosedPIC: cPIC + "Remap all object references in the closed PIC. Answer if any references are young. + Set codeModified if any modifications are made." + <var: #cPIC type: #'CogMethod *'> + | pc refersToYoung | + pc := cPIC asInteger + firstCPICCaseOffset. + refersToYoung := self followMaybeObjRefAt: pc - backEnd jumpLongByteSize. + pc := pc + cPICCaseSize. + 2 to: cPIC cPICNumCases do: + [:i| + (self followMaybeObjRefAt: pc - backEnd jumpLongConditionalByteSize) ifTrue: + [refersToYoung := true]. + pc := pc + cPICCaseSize]. + ^refersToYoung!
Item was changed: ----- Method: Cogit>>updateMaybeObjRefAt: (in category 'garbage collection') ----- updateMaybeObjRefAt: mcpc + "Update a potential object reference from a closed PIC. - "Update a potential object reference form a closed PIC. This may be an object reference, an inline cache tag or null. Answer if the updated literal is young." | object subject | object := backEnd literalBeforeFollowingAddress: mcpc. (objectRepresentation couldBeObject: object) ifFalse: [^false]. subject := objectRepresentation remapOop: object. object ~= subject ifTrue: [backEnd storeLiteral: subject beforeFollowingAddress: mcpc. codeModified := true]. ^objectMemory isYoungObject: subject!
Item was changed: ----- Method: SpurMemoryManager>>followForwarded: (in category 'forwarding') ----- followForwarded: objOop "Follow a forwarding pointer. Alas we cannot prevent forwarders to forwarders being created by lazy become. Consider the following example by Igor Stasenko: array := { a. b. c }. - array at: 1 points to &a. array at: 2 points to &b. array at: 3 points to &c Ó a becomeForward: b - array at: 1 still points to &a. array at: 2 still points to &b. array at: 3 still points to &c b becomeForward: c. - array at: 1 still points to &a. array at: 2 still points to &b. array at: 3 still points to &c - when accessing array first one has to follow a forwarding chain: &a -> &b -> c" + <api> | referent | self assert: (self isForwarded: objOop). referent := self fetchPointer: 0 ofMaybeForwardedObject: objOop. [(self isOopForwarded: referent)] whileTrue: [referent := self fetchPointer: 0 ofMaybeForwardedObject: referent]. ^referent!
Item was removed: - ----- Method: StackInterpreter>>followForwardedMethods (in category 'object memory support') ----- - followForwardedMethods - "This is just a stub for the CoInterpreter"!
Item was added: + ----- Method: StackInterpreter>>followForwardedMethodsInMethodZone (in category 'object memory support') ----- + followForwardedMethodsInMethodZone + "This is just a stub for the CoInterpreter"!
Item was changed: ----- Method: StackInterpreter>>postBecomeAction: (in category 'object memory support') ----- postBecomeAction: theBecomeEffectsFlags theBecomeEffectsFlags ~= 0 ifTrue: [self followForwardingPointersInStackZone: theBecomeEffectsFlags. (theBecomeEffectsFlags anyMask: BecameCompiledMethodFlag) ifTrue: + [self followForwardedMethodsInMethodCache. + self followForwardedMethodsInMethodZone]. "for CoInterpreter" - [self followForwardedMethodsInMethodCache]. - self followForwardedMethods. "for CoInterpreter" self followForwardingPointersInScheduler]!
vm-dev@lists.squeakfoundation.org