Redirecting messages on the VM

Alejandro F. Reimondo aleReimondo at smalltalking.net
Sun Nov 30 23:40:10 UTC 2003


Hi Javier,

> 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.
[...snip...]
> Is there a better way to do this?
> Where any of my ideas right? What was
> wrong in their implementation?

In some smalltalks you have the posibility to attach a method dictionary to
an object.
Then the method lookup starts in the object and then (if you linked the
mthdict of the object to it's class) go as usual...

It let you change dynamically the behavior of an object without change the
species.
And let you model instance based behavior without breaking the rules of
inheritance from species.

cheers,
Ale.


----- Original Message -----
From: "Javier Lanatta" <javier at lanatta.com.ar>
To: <squeak-dev at lists.squeakfoundation.org>
Sent: Sunday, November 30, 2003 8: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