[Vm-dev] #flushCache with MethoWrappers in CogVM

Mariano Martinez Peck marianopeck at gmail.com
Wed Mar 16 10:20:26 UTC 2011


Hi Eliot. I am implementing some kind of MethodWrappes/ObjectsAsMethod,
whihc basically use the #run:with:in trick.
My question is that I am not sure how to implement #flushCache in my
wrappers. This method is called by MethodDictionary>>#at:put:  when I want
to put back the original CompiledMethod.

MyClass methodDict at: #foo put: MyWrapper withMethod: (MyClass>>#foo).
...
MyClass methodDict at: #foo put:  wrapper wrappedMethod
->  here it sends #flushCache to my wrapper instance.

In the StandardVM, I realised that at that moment, there is an entry in the
cache that has selector: #foo, method:  my wrapped instance, class: MyClass,
etc...

So, to flush this, I have to options:

MyWrappers>>flushCache
self wrappedMethod selector flushCache

or....

MyWrappers>>flushCache
  <primitive: 116>

this is because "self" will be found in the entry as "method" in the cache
table...

So, first, are my assumptions correct?

Now, in cog I am not sure if both solutions are still valid. If I see
CoInterpreterPrimitives>> primitiveFlushCacheByMethod

you do at the end:

(self methodHasCogMethod: oldMethod) ifTrue:
        [cogit unlinkSendsTo: (self cogMethodOf: oldMethod)]

and

methodHasCogMethod: aMethodOop
    <api>
    self assert: (objectMemory isNonIntegerObject: aMethodOop).
    ^self isCogMethodReference: (self rawHeaderOf: aMethodOop)


So, it is not safe if the method is something different than a compiled
method.

Is that correct? should I flush the cache entering by selector instead?
which is the safe way to clean the cache in this case?

thanks

Mariano
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20110316/11529b59/attachment.htm


More information about the Vm-dev mailing list