[squeak-dev] What are mirror primitives?
Chris Muller
asqueaker at gmail.com
Fri Dec 24 22:24:06 UTC 2010
Great explanation, thank you.
On Thu, Dec 23, 2010 at 3:33 PM, Eliot Miranda <eliot.miranda at gmail.com> wrote:
> Hi Chris,
> the mirror primitives are basic object access and testing primitives that
> take the objects they operate upon as arguments. Compare these with the
> basic object access and testing primitives that operate on their receiver:
> ContextPart>>#object:basicAt: Object>>#basicAt:
> ContextPart>>#object:basicAt:put: Object>>#basicAt:put:
> ContextPart>>#object:eqeq: Object>>#==
> ContextPart>>#object:instVarAt: Object>>#instVarAt:
> ContextPart>>#object:instVarAt:put: Object>>#instVarAt:put:
> ContextPart>>#object:perform:withArguments:inClass:
> Object>>#perform:withArguments:inClass:
> ContextPart>>#objectClass: Object>>#class
> ContextPart>>#objectSize: Object>>#basicSize
> The execution machinery needs just these primitives to simulate bytecodes
> correctly (it needs to use primitives in the VM to evaluate primitives in
> general). If the execution simulation machinery /doesn't/ use these
> primitives and uses the Object ones instead then code involving proxies will
> not simulate correctly because instead of operating on the receiver they may
> be forwarded to some other object through a doesNotUnderstand:
> implementation. e.g. if you have some instance of a class that doesn't
> understand any messages, say a forwarder, and you try and simulate
> execution, then any attempt to access an inst var of the instance via
> instVarAt: is doomed to fail and will access the inst var of the object
> being forwarded to, rendering the debugger useless for debugging proxies.
> If the system uses the mirror primitives on the other hand simulation is
> correct because these primitives operate on their arguments instead of their
> receiver and so in being sent to a context they are always received as
> intended.
> As soon as the standard VM implements these primitives correctly we can
> upgrade the execution simulation machinery in ContextPart and MethodContext
> to use them. We've been using these at Teleplace for quite a while now, and
> they've been in VisualWorks for a long time.
> But as I understand your issue with Magma I don't think these solve your
> problem. Instead I guess all you'd need is to wrap all your primitives and
> put the send of yourself in the wrappers.
> HTH
> Eliot
>
> On Thu, Dec 23, 2010 at 12:51 PM, Chris Muller <ma.chris.m at gmail.com> wrote:
>>
>> In going through all of the package versions for the 4.2
>> release-notes, I came across this:
>>
>> --------------
>> Name: Kernel-eem.501
>> Author: eem
>> Time: 25 September 2010, 7:55:34.708 pm
>> UUID: 5b55eae3-594b-4416-9d47-5a4ebaabb238
>> Ancestors: Kernel-ul.500
>>
>> Add mirror primitives which can be used for accurate
>> execution simulation (a.k.a. debugging) of proxies.
>> ---------------
>>
>> One of the things that concerns Magma applications are instances of
>> its own proxies being sent as an argument to a primitive. I'm able to
>> rectify most cases with a simple #yourself to the argument in the
>> _sender_ (unfortunately I cannot do it in the top of the primitive
>> method itself, which would be ideal).
>>
>> It's an unfortunate piercing of the transparency and so this made me
>> wonder whether there isn't a more general solution to this problem to
>> handle all cases.
>>
>> - Chris
>>
>
>
>
>
>
More information about the Squeak-dev
mailing list
|