[Pharo-users] "self problem" with Ghost (virus)

Denis Kudriashov dionisiydk at gmail.com
Thu Jul 28 08:20:17 EDT 2016


And stable version 2.2.2 is done

2016-07-28 14:05 GMT+02:00 Denis Kudriashov <dionisiydk at gmail.com>:

> Steven, I fixed it.
> Load development version (or just this:
> Ghost-ObjectVirus-DenisKudryashov.12).
>
> I will update stable soon
>
> 2016-07-28 13:46 GMT+02:00 Steven Costiou <steven.costiou at kloum.io>:
>
>> Ok by digging a bit, i found that it was a problem in my behavior though
>> i don't understand it.
>>
>> When sending message to self, the #isMetaMessage: returns always true
>> when evaluating the first test condition GHCurrentMetaLevelDepth value > 0
>> ifTrue: [ ^true ]. The value returns something higher than 0 and my "self
>> messages" are considered to be meta-messages. It is very sensible to
>> modifications, as just removing this test or try to bend it can freezes the
>> image (just tried to see what would happen).
>>
>> I'm a bit lost, what should i do to consider "self messages" not "meta"
>> in the behavior ?
>>
>>
>>
>>
>>
>> Le 2016-07-28 12:33, Steven Costiou a écrit :
>>
>> 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 at 0 corner: 3 at 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 at gmail.com>:
>>
>>> Hi
>>>
>>> 2016-07-27 22:19 GMT+02:00 Steven Costiou <steven.costiou at 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.
>>>
>>>
>>
>> --
>> kloum.io
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.pharo.org/pipermail/pharo-users_lists.pharo.org/attachments/20160728/5eee4565/attachment.html>


More information about the Pharo-users mailing list