On Tue, Nov 30, 2010 at 2:55 PM, Mariano Martinez Peck <
[email protected]> wrote:

>
>
> On Tue, Nov 30, 2010 at 11:45 PM, Eliot Miranda 
> <[email protected]>wrote:
>
>>
>>
>> On Tue, Nov 30, 2010 at 2:33 PM, Mariano Martinez Peck <
>> [email protected]> wrote:
>>
>>> Thanks to both for answering me.
>>> Now, I have very very newbie question.
>>> In my case, JUST BECAUSE i am testing, I directly access the
>>> CompiledMethod using MethodDictionary >> #at:ifAbsent:
>>> thus, I can intercept and load back the original proxy.
>>>
>>> Now, if I understood well, when you send a simple message to an object,
>>> the method lookup is done at VM side, and there is no call to
>>> MethodDictionary >> #at:ifAbsent:
>>>
>>> So, what I am saying is that someone (the system) can send messages to a
>>> SmallInteger that acts as a compiled methods, without accessing it by
>>> MethodDictionary >> #at:ifAbsent:.
>>> If that message is understood by the SmallInetger, then it will probably
>>> answer something different than the original method.
>>>
>>
>> You're forgetting that the VM executes the methods it finds in a method
>> dictionary, except if the VM finds other than a CompiledMethod in a method
>> dictionary, in which case it sends run:with:in: to it.  So the VM won't send
>> anything to the SmallInteger method proxy other than run:with:in:.  If it
>> didn't send run:with:in: it would crash trying to execute the SmallInteger.
>>
>>
> I think we are confusing exatly like we were confusing yesterday with my
> supervisors.
>
> Eliot, one thing is to do this:
>
>
> MyClass methodDict at: #foo put: 5.
> MyClass new foo.
>
> Here I am SURE the VM will send #run:with:in to SmallInteger.
>
> Now, my question is when I send a MESSAGE to the CompiledMethod, and NOT to
> the object which class has installed the compiled method.
>
> Suppose I do:  (MyClass methodDict at: #foo) size.   and that I don't
> change the implementation of MethodDictionary >> #at:ifAbsent:
>
> In this case, the VM will just try to send the message size to that
> whatever is there. Both, SmallInteger and CompiledMethod understand #size,
> but both answer different things...
> I cannot intercept this, and I cannot load back the original object.
>
> This is why with Levento we thought about modifying MethodDictionary >>
> #at:ifAbsent:  to something like this:
>
>
> at: key ifAbsent: aBlock
>
>     | index value |
>     index := self findElementOrNil: key.
>     (self basicAt: index) == nil ifTrue: [ ^ aBlock value ].
>     value := array at: index.
>     (value mareaIsProxy) ifTrue: [value mareaUninstall].
>     ^ array at: index
>
>
> But then, my question is if the system may access by another way than that
> one. Ok, I should also modify some other methods in MethodDictionary like
> #valuesDo:  etc,,,
> but if I do that, is that enough?   or the system can still send messages
> without passing there?
>
> Thanks a lot!
>

AFAIA there are no other ways than in the VM or explicitly, except in the VM
simulator ;).


best,
Eliot

>
> mariano
>
>
>
>
>
>> best
>> Eliot
>>
>>>
>>> Now, maybe what I am thinking cannot happen.
>>>
>>> Thanks once again
>>>
>>> Mariano
>>>
>>>
>>>
>>> On Tue, Nov 30, 2010 at 10:23 PM, Levente Uzonyi <[email protected]> wrote:
>>>
>>>> On Tue, 30 Nov 2010, Igor Stasenko wrote:
>>>>
>>>>  .. and then you need to change #do: , #associationsDo: etc etc..
>>>>>
>>>>
>>>> Or he can subclass MethodDictionary and override those methods.
>>>>
>>>>
>>>> Levente
>>>>
>>>>
>>>
>>
>

Reply via email to