Redirecting messages on the VM

Javier Lanatta javier at lanatta.com.ar
Mon Dec 1 02:45:40 UTC 2003


Robert,
	Thank you for the link (and also thanks to all the people that
answered). I've read about MethodWrappers when I was looking for what to use
for this research work; but after talking with my teacher he told that one
of the aims of the project was to do research on the Virtual Machine, and
that I should modify it in a way it can intercept the messages and sent them
to a centralized object, which later would handle them as needed.


> -----Original Message-----
> From: squeak-dev-bounces at lists.squeakfoundation.org [mailto:squeak-dev-
> bounces at lists.squeakfoundation.org] On Behalf Of Jim Benson
> Sent: Sunday, November 30, 2003 10:49 PM
> To: The general-purpose Squeak developers list
> Subject: Re: Redirecting messages on the VM
> 
> 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