[squeak-dev] Do we need to provide the mirror primitive on Context (only)?

Eliot Miranda eliot.miranda at gmail.com
Thu Jan 13 22:58:37 UTC 2022


Hi Christoph,

> On Jan 11, 2022, at 1:52 PM, Thiede, Christoph <Christoph.Thiede at student.hpi.uni-potsdam.de> wrote:
> 
> Hi Eliot, hi all,
> 
> as I have learned from your great explanation about stack frame states and marriage last year, using "thisContext" in your code is more expensive than one might assume naively when thinking of it as a simple variable. This also means that using "thisContext" for invoking a mirror primitive is (unnecessarily?) slow:
> 
> 
> 
> [thisContext object: World eqeq: World] bench. '28,000,000 per second. 35.8 nanoseconds per run. 19.13235 % GC time.' 
> 
> versus:
> 
> 
> TestObject >> object: anObject eqeq: anOtherObject 
> <primitive: 110>
> self primitiveFailed
> 
> obj := TestObject new.
> [obj object: World eqeq: World] bench '58,900,000 per second. 17 nanoseconds per run. 0 % GC time.' 
> 
> Twice as fast!

Quite so.

> I am wondering whether it would be useful to copy or move the mirror primitive protocol to another place, maybe on the class-side of Context, given the number of senders to some mirror primitive methods which are different from Context. In particular, SimulationStudio makes heavy use of them, but the BasicInspector, Squot, and some other tools use it, too. :-)

I suppose so. I would tolerate the slow down.  This is protocol that completely sidesteps encapsulation so its use should be as encapsulated as possible, and IMO putting the protocol on a class makes it a little too public.  It’s also unnecessary; see below.

> So here are my questions:
> Would this be a legitimate use of the mirror primitives or is the (implicit) contract that the receiver must be a context instance or even a context instance on the current stack?

For me it makes sense that the protocol is on the instance side of Context.  Both conceptually (in the VM) and in execution simulation it is Contexts that obey (execute) bytecode and in doing so sidestep encapsulation.

> Do you consider the mirror primitive protocol a public protocol or are all senders from different classes actually abusing the protocol?

No; the mirror protocol is provided to allow Context to implement execution simulation correctly.  As we know, relying on messages to objects results in completely broken results when using proxies.
 
> How would you think about moving this protocol to a static place such as Context class?

I think it’s neither desirable nor necessary.  If Simulation Studio needs to avoid the overhead of Context creation if can surely simply instantiate a Context and use it throughout to invoke the mirror protocol.  Nothing says that one has to use thisContext; “Context basicNew objectClass: nil” also works, hence (eg in Simulation Studio)
    initialize
        myMirror := Context receiver: … 

    someMethod: someThing
         | actualClass |
         actualClass := myMirror objectClass: someThing

will work just fine.

> 
> Thanks in advance!

HTH

> 
> Best,
> Christoph

Eliot
_,,,^..^,,,_ (phone)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20220113/110bb29b/attachment.html>


More information about the Squeak-dev mailing list