Problem with the method lookup sending a message twice

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Problem with the method lookup sending a message twice

Mariano Martinez Peck
 
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
Reply | Threaded
Open this post in threaded view
|

Re: Problem with the method lookup sending a message twice

Mariano Martinez Peck
 
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 <[hidden email]> 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