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 |
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: |
Free forum by Nabble | Edit this page |