[Vm-dev] Re: [Pharo-project] BlockClosure>>ensure: implementation
eliot.miranda at gmail.com
Tue Oct 23 22:57:15 UTC 2012
On Mon, Oct 22, 2012 at 2:17 AM, Clément Bera <clement.bera at inria.fr> wrote:
> I don't understand something on BlockClosure>>ensure:. Why does it use
> 'self valueNoContextSwitch' and not 'self value' ? In which case is there
> an issue ?
Prior to my closure implementation BlockContext>>value[:value:*] was not a
context switch point. So to preserve the threading semantics of ensure: we
implemented ensure: in terms of BlockClosure>>valueNoContextSwitch, which
is not a context-switch point, as opposed to BlockClosure>>value[:value:*].
The context switch points in the VM are non-primitive sends (or failing
primitives, i.e. full method activation), backward branches, the Process
primitives suspend, resume, signal and wait (and CrtiticalSection/Mutex
enter and exit) and block evaluation.
> Thank you for any answers
> BlockClosure>>ensure: is implemented this way :
> ensure: aBlock
> "Evaluate a termination block after evaluating the receiver, regardless of
> whether the receiver's evaluation completes. N.B. This method is *not*
> implemented as a primitive. Primitive 198 always fails. The VM uses prim
> 198 in a context's method as the mark for an ensure:/ifCurtailed:
> | complete returnValue |
> <primitive: 198>
> returnValue := *self valueNoContextSwitch*.
> complete ifNil:[
> complete := true.
> aBlock value.
> ^ returnValue
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Vm-dev