Hi Denis, On Thu, Jan 7, 2016 at 7:54 AM, Denis Kudriashov <dionisiydk@gmail.com> wrote:
Look at example:
methodA | result | result := false. [result := self methodB] ensure: [result ifTrue: [...]]
methodB result := 1 < 2.
^result
Imagine now that methodB starts execution in context of call inside methodA. Is it possible to terminate process at point of methodB return (^result)? In that case ensure block in methodA will perform wrong logic.
Returns are not suspension points, so no. In the Cog and Stack VMs the only suspension points are backward jumps (at the end of while loops) and method activations. Note that invocations of methods with primitives (including quick methods, e.g. ^true or ^instVar) are not suspension points, unless their primitives fail, or unless the primitives are suspend, wait et al. In the interpreter VM (incorrectly IMO) primitive invocation in the context of a perform:, tryPrimitive:, executeMethod: primitive is also a suspension point. i.e. /any/ primitive including a quick primitive invoked via primitives 83, 84, 100, 188, 188 & 189, could potentially be a suspension point, in which case the process would be suspended immediately following the send that invoked the primitive. _,,,^..^,,,_ best, Eliot