Redirecting messages on the VM

Jim Benson jb at speed.net
Mon Dec 1 01:48:50 UTC 2003


Hi Javier,

Robert Hirschfeld maintains several Squeak packages which are in the problem
domain you describe. These are MethodWrappers, AspectS and PerspectiveS.
Rather than shortchange them and gloss over them here with a description,
I'll point you at:
http://www-ia.tu-ilmenau.de/~hirsch/Projects/Squeak/Squeak.html . From what
you describe, you should find MethodWrappers particularly useful.

Hope this helps,

Jim Benson



----- Original Message ----- 
From: "Javier Lanatta" <javier at lanatta.com.ar>
To: <squeak-dev at lists.squeakfoundation.org>
Sent: Sunday, November 30, 2003 3:15 PM
Subject: Redirecting messages on the VM


> 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