[Vm-dev] Re: Problem with the method lookup sending a message twice
Mariano Martinez Peck
marianopeck at gmail.com
Thu Mar 17 13:42:11 UTC 2011
Sorry guys. Forget this. I was being so stupid. It is working perfectly.
Cheers
Mariano
On Thu, Mar 17, 2011 at 10:16 AM, Mariano Martinez Peck <
marianopeck at gmail.com> wrote:
> Hi folks. I have a problem and I am completely clueless. I did one simple
> modification to the method lookup: I want to check whether the class of the
> receiver is a proxy and if true, send an special message. So I just modify
> the first lines of:
>
> lookupMethodInClass: class
> | currentClass dictionary found |
> <inline: false>
> self assert: class ~~ objectMemory nilObject.
> currentClass := class.
> [currentClass ~= objectMemory nilObject]
> whileTrue:
> [dictionary := objectMemory fetchPointer: MethodDictionaryIndex
> ofObject: currentClass.
>
>
> " THIS IS MY CHANGE "
> (currentClass = (objectMemory splObj: ProxyClass)) ifTrue: [
> self createActualMessageTo: currentClass.
> messageSelector := objectMemory splObj:
> SelectorHandleProxyInvocation.
> self sendBreak: messageSelector + BaseHeaderSize
> point: (objectMemory lengthOf: messageSelector)
> receiver: nil.
> ^self lookupMethodInClass: (self superclassOf: currentClass)
> ].
> " HERE FINISH MY CHANGE "
>
> dictionary = objectMemory nilObject ifTrue:
> ["MethodDict pointer is nil (hopefully due a swapped out stub)
> -- raise exception #cannotInterpret:."
> self createActualMessageTo: class.
> messageSelector := objectMemory splObj:
> SelectorCannotInterpret.
> self sendBreak: messageSelector + BaseHeaderSize
> point: (objectMemory lengthOf: messageSelector)
> receiver: nil.
> ^self lookupMethodInClass: (self superclassOf: currentClass)].
> found := self lookupMethodInDictionary: dictionary.
> found ifTrue: [^currentClass].
> currentClass := self superclassOf: currentClass].
>
> "Could not find #doesNotUnderstand: -- unrecoverable error."
> messageSelector = (objectMemory splObj: SelectorDoesNotUnderstand)
> ifTrue:
> [self error: 'Recursive not understood error encountered'].
>
> "Cound not find a normal message -- raise exception
> #doesNotUnderstand:"
> self createActualMessageTo: class.
> messageSelector := objectMemory splObj: SelectorDoesNotUnderstand.
> self sendBreak: messageSelector + BaseHeaderSize
> point: (objectMemory lengthOf: messageSelector)
> receiver: nil.
> ^self lookupMethodInClass: class
>
>
>
> Now, from the image side, I added ProxyClass and
> SelectorHandleProxyInvocation and:
>
> ClassProxy>> handleProxyInvocation: aMessage
> Transcript show: 'a message: '; aMessage selector, 'was sent'; cr.
>
>
> If I do ClassProxy new foo. I see TWO times the message in the Transcript.
> I mean, handleProxyInvocation: is being invoke twice per message.
>
> Thanks in advance for any help.
>
> Mariano
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20110317/ca5a2946/attachment.htm
More information about the Vm-dev
mailing list