[Pharo-project] Ideas for CompiledMethod proxies?

Igor Stasenko siguctua at gmail.com
Tue Nov 30 17:47:01 CET 2010


On 30 November 2010 14:53, Mariano Martinez Peck <marianopeck at gmail.com> wrote:
>
>
> On Tue, Nov 30, 2010 at 12:52 PM, Levente Uzonyi <leves at elte.hu> wrote:
>>
>> On Tue, 30 Nov 2010, Mariano Martinez Peck wrote:
>>
>>> On Sun, Nov 21, 2010 at 5:31 PM, Igor Stasenko <siguctua at gmail.com>
>>> wrote:
>>>
>>>> Obviously you can't having a single object representation (a tagged
>>>> machine word with lowest bit set)
>>>> and have two different classes for it.
>>>>
>>>>
>>> Yes, that's true. The thing is that I have a big problem using
>>> SmallInteger
>>> as proxies....So far I always used a subclass of ProtoObject for the
>>> proxies. This is cool because most of the messages are not understood by
>>> ProtoObject, thus I can intercept most messages. Now, the problem using
>>> SmallInteger as proxies is that there are several methods that ARE
>>> understood by both. This is a big problem because the original
>>> CompiledMethod is not installed, and the method answers but with a
>>> different
>>> value.
>>>
>>> For example, suppose I do something like this:
>>>
>>> MyClass methodDict at: #foo put: 5.
>>> (MyClass >> #foo) size
>>>
>>> In this case, I would like that size is NOT understood by the proxy and
>>> that
>>> loads back the original compiled method. But this is not the case since
>>> SmallIngeger DOES understand the message #size. Thus, it answers...and
>>> something different than the size of the compiled method...
>>
>>
>> That's why you should change MethodDictionary >> #at:ifAbsent: to load the
>> CompiledMethod and return that instead of the integer.
>>
>
> Uffff sorry Levente. You are totally right. I forgot we already discussed
> this...
> Even more, now I checked my MethodDictionary #at:ifAbsent:  and I have:
>
>
> at: key ifAbsent: aBlock
>
>     | index value |
>     index := self findElementOrNil: key.
>     (self basicAt: index) == nil ifTrue: [ ^ aBlock value ].
>     value := array at: index.
>     "(value isProxy) ifTrue: [value mareaUninstall]."
>     ^ array at: index
>
.. and then you need to change #do: , #associationsDo: etc etc..

>
> notice the comment ;)
>
> Thanks!!!
>
> Mariano
>
>
>>
>> Levente
>>
>>>
>>> So in summary I have problems with all methods that are understood by
>>> both,
>>> even all those in Object I think...
>>>
>>> Best regards,
>>>
>>> Mariano
>>>
>>>
>>>
>>>> On 21 November 2010 16:51, Mariano Martinez Peck <marianopeck at gmail.com>
>>>> wrote:
>>>>>
>>>>>
>>>>> On Sun, Nov 21, 2010 at 12:13 AM, Levente Uzonyi <leves at elte.hu> wrote:
>>>>>>
>>>>>> On Sat, 20 Nov 2010, Mariano Martinez Peck wrote:
>>>>>>
>>>>>>> On Sat, Nov 20, 2010 at 5:41 PM, Levente Uzonyi <leves at elte.hu>
>>>>>>> wrote:
>>>>>>>>
>>>>>>>> The only problem is that you can't swap-out a method that's used by
>>>>
>>>> the
>>>>>>>>
>>>>>>>> swap-in code.
>>>>>>>>
>>>>>>>>
>>>>>>> Yes, but that's easy to solve. Before swapping everything, I
>>>>>>> "simulate"
>>>>>>> the
>>>>>>> swapping of a dummy CompiledMethod. During that, I mark all the
>>>>>>> CompiledMethods that were used to perform that. And then, I exclude
>>>>
>>>> those
>>>>>>>
>>>>>>> objects from being swapped :)
>>>>>>
>>>>>> That won't work, because during the simulation you'll only try a
>>>>>> single
>>>>>> execution path. Swapping in a real method may invoke methods that
>>>>
>>>> weren't
>>>>>>
>>>>>> used during the simulation. For example my implementation uses
>>>>
>>>> #storeString
>>>>>>
>>>>>> to serialize the methods and Compiler >> #evaluate: to deserialize
>>>>>> them.
>>>>
>>>> So
>>>>>>
>>>>>> during deserialization a lot of different methods may be invoked.
>>>>>
>>>>> Ahhh I got it....
>>>>>
>>>>> Are you using Cog?  because with the SmallInteger I have the problem I
>>>>> described with #run:with:in:
>>>>>
>>>>> Last question....to use SmallIntegers, I need to put some methods in
>>>>> SmallInteger, like #run:with:in:  , #doesNotUnderstand: ,  and all the
>>>>> methods related to writing and loading back the original
>>>>> compiledMethod.
>>>>
>>>> Of
>>>>>
>>>>> course I can put all those methods under a category  *MyProxyPackage
>>>>>  ...
>>>>> but I was thinking if there is another way. I would love to have
>>>>> MySmallIntegerProxy that extends from ProtoObject (because I want my
>>>>
>>>> proxy
>>>>>
>>>>> to understand as less messages as possible) and that is threated by the
>>>>
>>>> VM
>>>>>
>>>>> like a SmallInetger, I mean, that it directly stores the number value
>>>>> in
>>>>
>>>> the
>>>>>
>>>>> address, and put the last bit in 1.
>>>>>
>>>>> Is this possible? how much work can it be?
>>>>>
>>>>> Thanks in advance,
>>>>>
>>>>> Mariano
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Best regards,
>>>> Igor Stasenko AKA sig.
>>>>
>>>>
>>>
>>
>
>



-- 
Best regards,
Igor Stasenko AKA sig.




More information about the Pharo-project mailing list