Redirecting messages from the VM
Javier Lanatta
javier.lanatta at fibertel.com.ar
Sun Nov 30 23:14:47 UTC 2003
Hi everybody,
I'm doing a research work for my OOD class at university and I'm a
little lost... So I come here looking for your help :) I'm sorry to tell you
that this email is gonna be kinda long, anyway I will try to write only the
most relevant things.
For this research work I have to write a set of tools that allows
the user to define what should be done when a given object receives a given
message.
These are examples of what the tools must do:
- When a given instance of RectangleMorph receives #addMorph: this
should be logged and then the instance finally receives the #addMorph:
- When any instance of Array receives #add: this message should be
sent to the instance only if the add's argument belongs to a given class.
I have most of the model finished. But I have problems intercepting
the messages.
By now I'm only trying to redirect every message to an object of a
fixed class to another fixed object. Both the class of the first object and
the second object are stored in the Special Objects Array. Later I will
replace the receiver with a fixed object that will act as an entry point and
it will redirect the message inside the "object's world" to other objects
that will do all the work.
I have tried two approaches without luck.
1.- Replace the receiver @ Interpreter>>internalActivateNewMethod
I overwrote the receiver after the real receiver and its arguments are
stored:
...
...
"Copy the reciever and arguments..."
argCount2 _ argumentCount.
0 to: argCount2 do:
[:i | self storePointerUnchecked: ReceiverIndex+i ofObject:
newContext
withValue: (self internalStackValue: argCount2-i)].
"here comes my code"
rcvr _ self internalStackValue: argumentCount.
self assertClassOf: rcvr is: (self splObj: MRFAux1).
successFlag ifTrue:
[
self print: 'Intercepting...';cr.
self storePointerUnchecked: ReceiverIndex+argumentCount ofObject:
newContext withValue: (self splObj: MRFAux2).
].
"and here it ends"
...
...
MRFAux1: Contains the class of the object I want to intercept.
MRFAux2: Contains the receiver.
I guess I'm storing it in the wrong position... I have tried several indexes
without any good result.
2.- Send the message the same way a #doesNotUnderstand is sent @
Interpreter>>lookupMethodInClass: class
When the method is found in the dictionary I just send the message to the
other object creating a message in the doesNotUnderstand fashion:
....
....
found _ self lookupMethodInDictionary: dictionary.
found ifTrue: [
rcvr _ self internalStackValue: argumentCount.
self assertClassOf: rcvr is: (self splObj: MRFAux1).
successFlag ifTrue:
self print: 'Intercepting @ lookupMethodInClass...';cr.
self pushRemappableOop: (self splObj: MRFEntryPoint).
self createActualMessageTo: (self splObj: MRFEntryPoint).
rclass _ self popRemappableOop.
messageSelector _ self splObj: MRFAux2.
^ self lookupMethodInClass: rclass
] ifFalse: [
^ methodClass _ currentClass
].
].
....
....
MRFAux1: Contains the class of the object I want to intercept.
MRFEntryPoint: Contains the receiver.
MRFAux2: Contains the selector I want to send to the new receiver.
In this case I cant compile the generated code :/
./release/gnu-interp.o: In function `findNewMethodInClass':
//D/J4V13R/SqueakImages/TP/src/3.5.1/win32/gnu-interp.c:3388: undefined
reference to `lookupMethodInClass'
./release/gnu-interp.o: In function `interpret':
//D/J4V13R/SqueakImages/TP/src/3.5.1/win32/gnu-interp.c:6756: undefined
reference to `lookupMethodInClass'
I browse the gnu-interp.c file and the function lookupMethodInClass is
missiong, if I remove the lines I added the code is ok... I have no clue of
what's going on.
Is there a better way to do this? Where any of my ideas right? What was
wrong in their implementation?
Thanks in advance,
Javier
Some background information:
Squeak Version: 3.6
Virtual Machine: 3.5.1/Tea 1.9 VM (release) from June 21 2003
I've been using Squeak for about 9 months.
More information about the Squeak-dev
mailing list
|