On Mon, Oct 22, 2012 at 2:17 AM, Cl�ment Bera
<clement.bera@inria.fr> wrote:
Hello,
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: activation."
| complete returnValue |
<primitive: 198>
returnValue := self valueNoContextSwitch.
complete ifNil:[
complete := true.
aBlock value.
].
^ returnValue