[Vm-dev] StackInterp/Cog>>transferTo: - assertValidExecutionPointe:r:s differences

Eliot Miranda eliot.miranda at gmail.com
Fri Jun 10 03:30:06 UTC 2016


Hi Ben,

> On Jun 9, 2016, at 6:46 PM, Ben Coman <btc at openinworld.com> wrote:
> 
> 
> Just curious about the difference in instructionPointer between these two...
> 
> StackInterpreter>>transferTo:
>     self assertValidExecutionPointe: instructionPointer + 1 r:
> framePointer s: stackPointer.
> 
> 
> CoIntepreter>>transferTo:from:
>    self assertValidExecutionPointe: instructionPointer r:
> framePointer s: stackPointer.

The difference is to support richer logging of process switch events in the Cog VM.

In the StackInterpreter context switches only occur in two contexts, within a primitive or checkForEventsMayContextSwitch:.

One might think that the Cog VM is similar but it's much more complicated because a primitive can be invoked in different ways.  One way is from the interpreter via slowPrimitiveResponse, just like the StackInterpreter.  Another way is from a jitted method containing a primitive.  Yet another way is in the attempt to lookup and link a send from machine code that binds to a method with a primitive.  Yet another way is in invoking a primitive in a method that should be interpreted (because it has more literals than the limit for jitting) from machine code.  The VM optimises this transition by using a PIC which can have entries that speed up invoking interpreted methods or MNUs, not just polymorphic sends.

To debug context switch in these contexts (and one more historical context that I think no longer occurs) I needed the richer logging that the from: argument gave me to discover the actual path taken to a process switch.

HTH

> 
> cheers -ben


More information about the Vm-dev mailing list