Ryan Macnak uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-rmacnak.1442.mcz
==================== Summary ====================
Name: VMMaker.oscog-rmacnak.1442 Author: rmacnak Time: 22 August 2015, 4:28:54.585 pm UUID: f34e246e-855a-4049-bcc7-76440e7a5e54 Ancestors: VMMaker.oscog-eem.1441
The actual receiver of an MNU from an outer send is not necessarily the method receiver.
=============== Diff against VMMaker.oscog-eem.1441 ===============
Item was changed: ----- Method: CoInterpreter>>ceOuterSend:receiver: (in category 'trampolines') ----- ceOuterSend: cacheAddress receiver: methodReceiver "An outer send cache missed." | nsSendCache depth methodReceiverClassTag cogMethod errSelIdx | <api> <option: #NewspeakVM> <inline: false> <var: #nsSendCache type: #'NSSendCache *'> <var: #cogMethod type: #'CogMethod *'>
cogit assertCStackWellAligned. self assert: (objectMemory addressCouldBeOop: methodReceiver). self deny: (objectMemory isOopForwarded: methodReceiver).
nsSendCache := self cCoerceSimple: cacheAddress to: #'NSSendCache *'. messageSelector := nsSendCache selector. argumentCount := nsSendCache numArgs. depth := nsSendCache depth. method := (self mframeHomeMethod: framePointer) methodObject.
self assert: (self stackValue: argumentCount + 1 "ret addr") = methodReceiver.
methodReceiverClassTag := objectMemory fetchClassTagOf: methodReceiver.
(self inlineLookupInNSMethodCacheSel: messageSelector classTag: methodReceiverClassTag method: method lookupRule: depth) ifTrue: [localAbsentReceiverOrZero = 0 ifTrue: [localAbsentReceiver := methodReceiver] ifFalse: [localAbsentReceiver := localAbsentReceiverOrZero]. "check for coggability because method is in the cache" self ifAppropriateCompileToNativeCode: newMethod selector: messageSelector] ifFalse: [self deny: (objectMemory isOopForwarded: messageSelector). self deny: (objectMemory isForwardedClassTag: methodReceiverClassTag). + lkupClassTag := methodReceiverClassTag. "Successful lookup cached under the sender's class" - lkupClassTag := methodReceiverClassTag. errSelIdx := self lookupOuterSendNoMNU: methodReceiver depth: depth. errSelIdx ~= 0 ifTrue: [self assert: errSelIdx == SelectorDoesNotUnderstand. + "Fix stacked receiver." + self stackValue: argumentCount + 1 "ret addr" put: localAbsentReceiver. + "Failed lookup continues with the enclosing object's class" + lkupClassTag := objectMemory classForClassTag: localAbsentReceiver. self handleMNU: errSelIdx + InMachineCodeTo: localAbsentReceiver + classForMessage: lkupClassTag. - InMachineCodeTo: methodReceiver - classForMessage: (objectMemory classForClassTag: methodReceiverClassTag). self unreachable]. self addNewMethodToNSCache: depth].
"Fix stacked receiver." self stackValue: argumentCount + 1 "ret addr" put: localAbsentReceiver.
(self maybeMethodHasCogMethod: newMethod) ifTrue: [ cogMethod := self cogMethodOf: newMethod. cogMethod selector = objectMemory nilObject ifTrue: [cogit setSelectorOf: cogMethod to: messageSelector] ifFalse: ["Deal with anonymous accessors, e.g. in Newspeak. The cogMethod may not have the correct selector. If not, try and compile a new method with the correct selector." cogMethod selector ~= messageSelector ifTrue: [ (cogit cog: newMethod selector: messageSelector) ifNotNil: [:newCogMethod | cogMethod := newCogMethod]]]. cogMethod selector = messageSelector ifTrue: [cogit linkNSSendCache: nsSendCache classTag: methodReceiverClassTag enclosingObject: localAbsentReceiverOrZero target: cogMethod caller: self mframeHomeMethodExport] ifFalse: ["Out of code memory. Fall through to interpret."]. instructionPointer := self popStack. self executeNewMethod. self unreachable]. instructionPointer := self popStack. self interpretMethodFromMachineCode. self unreachable.!
vm-dev@lists.squeakfoundation.org