> On 23 Nov 2018, at 14:59, Marcus Denker <marcus.den...@inria.fr> wrote:
> 
> 
> 
>> On 23 Nov 2018, at 13:40, Manuel Leuenberger <leuenber...@inf.unibe.ch> 
>> wrote:
>> 
>> Hi,
>> 
>> I stumbled upon another MetaLink scenario that I am unsure how to implement. 
>> I want to track method invocations, with receiver, arguments, selector, and 
>> return value (maybe even signaled exception). I can track the method input 
>> with a MetaLink installed on an RBMethodNode like this:
>> 
>> MetaLink new
>>   metaObject: [ :c | Transcript show: c receiver; show: c method selector; 
>> show: c arguments; cr ];
>>   selector: #value:;
>>   arguments: #(context).
>> 
>> and for returns with a MetaLink on RBReturnNodes like this:
>> 
>> MetaLink new
>>   metaObject: [ :v | Transcript show: v; cr ];
>>   selector: #value:;
>>   arguments: #(value)
>> 
>> The problem is though, that not all methods have explicit returns, and some 
>> mix explicit returns and self returns. I tried installed an #after MetaLink 
>> on a RBMethodNode, but this fails in many cases. Is there any way that I can 
>> instrument a method and track receiver, selector, arguments, and returned 
>> value (even if self) at the same time?
>> 
> 
> I am working now on making the #after work so that one can get with #value 
> the return of the method… 
> 
> I now have a version where it works for Message Sends correctly *and* were 
> #after on Method works better (the compilation errors should be fixed).
> 
> But  #value for #after on Method needs some more work… soon!
> 
> I will commit this intermediate step now.
> 

Here is the first step:

https://github.com/pharo-project/pharo/pull/2011

        • #operation for send after
        • #operation and value for {} arrays
        • #after hooks: preamble now executed before the operation
        • #after hooks: added concept of postamble, executed just before hook

Next I need to look into #value for #after on methods. This got broken because 
we wrap the whole method in an exception handler (as #after should be called 
even if
an exception happens).

But this adds too much complexity… especially how it is done now. I think I 
will simplify that in a next step.

        Marcus



Reply via email to