Oop, two facts: 1.- You are Jim, Robert is the one who wrote MethodWrappers 2.- When using Outlook, alt-s DOES NOT save a text, it sends mails :)
Thank you again Jim,
Following with the email I tried to save. As I should modify the VM, I was wondering if the solutions I presented in my first email, even though they do not work, where heading to a right point.
Javier
-----Original Message----- From: squeak-dev-bounces@lists.squeakfoundation.org [mailto:squeak-dev- bounces@lists.squeakfoundation.org] On Behalf Of Javier Lanatta Sent: Sunday, November 30, 2003 11:46 PM To: 'The general-purpose Squeak developers list' Subject: RE: Redirecting messages on the VM
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@lists.squeakfoundation.org [mailto:squeak-dev- bounces@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@lanatta.com.ar To: squeak-dev@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.
squeak-dev@lists.squeakfoundation.org