[Pharo-project] Ideas for CompiledMethod proxies?

Levente Uzonyi leves at elte.hu
Tue Nov 30 12:52:36 CET 2010


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.


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.
>>
>>
>




More information about the Pharo-project mailing list