ClementBera uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-cb.1894.mcz
==================== Summary ====================
Name: VMMaker.oscog-cb.1894 Author: cb Time: 30 June 2016, 2:02:37.049787 pm UUID: b3c32cc0-576b-4a14-9572-b5323dfa774f Ancestors: VMMaker.oscog-eem.1893
Accesses on remote instance variables can't be done on forwarders: to happen, the method with the inst var access needs to be inlined hence there's either a guard ensuring the object is not a forwarder or the type of the object is known (immutable literal, inlined object allocation such as Array, FullBlockClosure, immediate rcvr, etc.)
=============== Diff against VMMaker.oscog-eem.1893 ===============
Item was added: + ----- Method: StackToRegisterMappingCogit>>genLoadTemp:in: (in category 'bytecode generator support') ----- + genLoadTemp: objectIndex in: destReg + destReg = ReceiverResultReg ifTrue: [ optStatus isReceiverResultRegLive: false ]. + self ssAllocateRequiredReg: destReg. + self MoveMw: (self frameOffsetOfTemporary: objectIndex) r: FPReg R: destReg.!
Item was removed: - ----- Method: StackToRegisterMappingCogit>>genLoadUnFwdTemp:in: (in category 'bytecode generator support') ----- - genLoadUnFwdTemp: objectIndex in: destReg - destReg = ReceiverResultReg ifTrue: [ optStatus isReceiverResultRegLive: false ]. - self ssAllocateRequiredReg: destReg. - self MoveMw: (self frameOffsetOfTemporary: objectIndex) r: FPReg R: destReg. - objectRepresentation - genEnsureOopInRegNotForwarded: destReg - scratchReg: TempReg.!
Item was changed: ----- Method: StackToRegisterMappingCogit>>genPushMaybeContextRemoteInstVar:inObjectAt: (in category 'bytecode generator support') ----- genPushMaybeContextRemoteInstVar: slotIndex inObjectAt: index <inline: false> self ssAllocateCallReg: ReceiverResultReg and: SendNumArgsReg. + self genLoadTemp: index in: ReceiverResultReg. - self genLoadUnFwdTemp: index in: ReceiverResultReg. ^ self genPushMaybeContextSlotIndex: slotIndex!
Item was changed: ----- Method: StackToRegisterMappingCogit>>genPushRemoteInstVar:inObjectAt: (in category 'bytecode generator support') ----- genPushRemoteInstVar: index inObjectAt: objectIndex <inline: false> | objectReg resultReg | self assert: needsFrame. objectReg := self allocateRegNotConflictingWith: 0. + self genLoadTemp: objectIndex in: objectReg. - self genLoadUnFwdTemp: objectIndex in: objectReg. resultReg := self availableRegOrNoneNotConflictingWith: (self registerMaskFor: objectReg). resultReg = NoReg ifTrue: [resultReg := objectReg]. objectRepresentation genLoadSlot: byte1 sourceReg: objectReg destReg: resultReg. ^self ssPushRegister: resultReg!
Item was changed: ----- Method: StackToRegisterMappingCogit>>genStorePop:MaybeContextRemoteInstVar:ofObjectAt:needsStoreCheck: (in category 'bytecode generator support') ----- genStorePop: popBoolean MaybeContextRemoteInstVar: slotIndex ofObjectAt: objectIndex needsStoreCheck: needsStoreCheck <inline: false> "The reason we need a frame here is that assigning to an inst var of a context may involve wholesale reorganization of stack pages, and the only way to preserve the execution state of an activation in that case is if it has a frame." self assert: needsFrame. + self genLoadTemp: objectIndex in: ReceiverResultReg. - self genLoadUnFwdTemp: objectIndex in: ReceiverResultReg. self genStorePop: popBoolean MaybeContextSlotIndex: slotIndex needsStoreCheck: needsStoreCheck. ^ 0!
Item was changed: ----- Method: StackToRegisterMappingCogit>>genStorePop:RemoteInstVar:ofObjectAt:needsStoreCheck: (in category 'bytecode generator support') ----- genStorePop: popBoolean RemoteInstVar: slotIndex ofObjectAt: objectIndex needsStoreCheck: needsStoreCheck <inline: false> self assert: needsFrame. + self genLoadTemp: objectIndex in: ReceiverResultReg. - self genLoadUnFwdTemp: objectIndex in: ReceiverResultReg. self genStorePop: popBoolean slotIndex: slotIndex destReg: ReceiverResultReg needsStoreCheck: needsStoreCheck needsRestoreRcvr: false. ^ 0!
vm-dev@lists.squeakfoundation.org