[squeak-dev] Interception messages in Squeak

Yann-Gaël Guéhéneuc yann-gael.gueheneuc at polymtl.ca
Mon Apr 15 10:34:51 UTC 2013


PS. Stéphane also mentioned Reflectivity and Bifröst, I will look at 
them.

On 15/04/2013 17:41, Yann-Gaël Guéhéneuc wrote:
>
> 	Hello Dave,
>
> 	Thank you for your answer! But the solution that you suggested does
> not show the use of reflection as I would like it to:
>
> 	o withArgs: theArguments executeMethod: theCompiledMethod.
>
> I must make an explicit use of "withArgs:executeMethod" while I would
> like to make this use "transparent" to illustrate the "overriding" of
> the method invocation, any other suggestion?
>
> 	My purpose is to illustrate the use of reflection and differences
> between C++, Java, and Smalltalk with that respect.  I kind of
> remember that in some version/flavor of Smalltalk, you could
> "override" the VM mechanism to invoke method, typically by overriding
> some "withArgs:executeMethod:" when---and only when---using
> reflection so that performance would not be horrible but that you
> could still change the behaviour of invocations (at the risk of
> breaking the whole image if something silly was done, such as not
> "forwarding" the invocation to the VM after interception). Do I
> remember wrong?
> 	
> 	Yann
>
> On 15/04/2013 13:59, David T. Lewis wrote:
>> On Mon, Apr 15, 2013 at 01:17:40PM +0900, Yann-Ga?l Gu?h?neuc wrote:
>>>
>>> 	Dear all,
>>>
>>> I am trying to understand better reflection in Smalltalk. I am using
>>> the latest version of Squeak (v4.3). I want to intercept every
>>> message sent to instances of one of my classes. I assumed that I
>>> could override the method `ProtoObject>>withArgs:executeMethod` but
>>> St?phane (Ducasse) explained me that for performance reason, this
>>> method is not used (this is my own summary of his answer). Which
>>> method should I override / how could intercept sent messages?
>>>
>>> Here is the code of my attempt:
>>>
>>>       Object subclass: #C
>>>       	instanceVariableNames: 'i'
>>>       	classVariableNames: ''
>>>       	poolDictionaries: ''
>>>       	category: 'CSE3009'.
>>>
>>>       C class compile: 'newWithi: anInt
>>>       	^(self new) i: anInt ; yourself.'.
>>>
>>>       C compile: 'withArgs: someArgs executeMethod: aMethod
>>>       	Transcript show: ''Caught: ''.
>>>       	^ super withArgs: someArgs executeMethod aMethod.'.
>>>
>>>       C compile: 'foo: aText
>>>       	Transcript show: aText.
>>>       	Transcript show: i.
>>>       	Transcript cr.'.
>>>
>>>       C compile: 'i: anInt
>>>       	i := anInt.'.
>>>
>>>       o := C newWithi: 42.
>>>       o foo: 'This is foo: '.
>>>
>>> Executing this entire piece of code yields:
>>>
>>>       This is foo: 42
>>>
>>> When I would like to have:
>>>
>>>       Caught: This is foo: 42
>>>
>>> 	I was told about wrapper objects and MethodWrapper (see
>>> http://stackoverflow.com/questions/15975340/interception-messages-in-squeak)
>>> but in my quest to understand reflection, I would like to know if there
>>> would be something more "reflective", typically overriding a message :-)
>>>
>>> 	Thank you very much in advance!
>>> 	Yann
>>
>> Try this after compiling your code:
>>
>>     "Ask the class for the compiled method that you want to execute"
>>     theCompiledMethod := C compiledMethodAt: #foo: .
>>
>>     "Make an array of size one containing the argument, a string"
>>     theArguments := { 'This is foo: ' } .
>>
>>     "Execute the compiled method as if it was a message send to the object"
>>     o withArgs: theArguments executeMethod: theCompiledMethod.
>>
>>     ==> Caught: This is foo: 42
>>
>> Dave
>>
>>
>

-- 
Yann-Gaël Guéhéneuc
Ph.D. et ing. / Ph.D. and eng.
Professeur agrégé / Associate professor
DIRO, Université de Montréal    1-514-343-6111 47497 (Téléphone / Phone)
C.P. 6128, succ. Centre-Ville   1-514-343-5834       (Télécopie / Fax)
Montréal, QC, H3C 3J7, Canada   www.ptidej.net

-- 
Yann-Gaël Guéhéneuc
Ph.D. et ing. / Ph.D. and eng.
Professeur titulaire / Full professor
Chaire de recherche du Canada sur les Patrons (de) logiciels /
   Canada Research Chair on Software Patterns and Patterns of Software
DGIGL, École Polytechnique        1-514-340-4711 #7116 (Tél. / Phone)
C.P. 6079, succ. Centre-Ville     1-514-340-5139       (Téléc. / Fax)
Montréal, QC, H3C 3A7, Canada     www.ptidej.net


More information about the Squeak-dev mailing list