Hi,

I think i am missing something.

For example in the following code (took from the tests):

    | victim virus actual |
    virus := GHObjectVirus behaviour: GHGhostBehaviourStub new.
    
    victim := 0@0 corner: 3@4.
    virus infect: victim.
    victim corner

The evaluation is trapped by the send:to: method in the behavior (i've put a halt there). However if i replace the "corner" message by an inspect of the victim, and if i evaluate "self corner", then the message is processed without going through the send:to: method of the behavior. It is not halted and the victim responds immediately to the message. I have also tried to add a new method in the Rectangle class that calls "self corner". When called in the playground, my new message is trapped but not the "corner" sent to self.

From what i understand it could be related to the behavior i use, but i don't see what's missing.   

 

Le 2016-07-28 11:35, Denis Kudriashov a écrit :

I think I not understood second part of "self problem" in this paper. But self sends are covered by virus as I described.

2016-07-28 11:30 GMT+02:00 Denis Kudriashov <dionisiydk@gmail.com>:
Hi

2016-07-27 22:19 GMT+02:00 Steven Costiou <steven.costiou@kloum.io>:

Hi,

I use virus from Ghost to intercept messages sent to a given object and adapt methods behaviors for this particular object only. However it would seems that doing interception this way is subject to the "self problem" described in this paper from Stéphane (DUCASSE, Stéphane. Evaluating message passing control techniques in Smalltalk. JOURNAL OF OBJECT ORIENTED PROGRAMMING, 1999, vol. 12, p. 39-50).

I understand i could do instance based adaptation using an other technique, but i wonder if there is any way with Ghost to deal with this "self problem" problem ?

I think "self problem" is only related to classic proxies when objects stay behind them. But ObjectVirus is not proxy in this meaning. When you infect your object by virus it is not replaced by somebody else. It is same original instance but with overridden behaviour. That's why I call it virus without any relation to proxies.
Any message to infected object is processed by your behaviour. All self sends are intercepted. But there are few exceptions:
- special messages like ==,ifTrue/ifNil are not intercepted
- meta messages are not intercepted. They processed by Ghost mechanics but they not passed to your behaviour. Meta messages defined by #currentMetaLevel of your behaviour. You could implement it like:
 
YourGhostBehaviour>>currentMetaLevel
^GHMetaLevel empty
 
Empty meta level means that all messages will be passed to your behaviour. There is also "GHMetaLevel standard" which is default one. It makes most of "tool messages" not interceptable. For example #printString, #class, #instVarAt: will be not intercepted. It's messages which are usually used by tools like inspector and debugger. 
Standard meta level simplifies debugging of new behaviours. If you make mistake somewhere standard messages will be not broken and you could debug error by tools.