I'm now working on the implementation of transfers out of a
closure.  For example, a "return" statement inside a closure returns
from the enclosing method (rather than from the closure itself).&nbsp; While specification changes are outside the scope of this project, for those of you interested the motivation for having a single meaning for &quot;return&quot; (return from the enclosing method) rather than introducing a new meaning for &quot;return&quot; in a closure, the issue is discussed in <a href="http://gafter.blogspot.com/2006/08/tennents-correspondence-principle-and.html">http://gafter.blogspot.com/2006/08/tennents-correspondence-principle-and.html</a>. Similarly,
&quot;break&quot; and &quot;continue&quot; can flow from within a closure to an enclosing
loop, switch, etc.
<br><br>I have the following design constraints:<br><ul><li>The
&quot;normal&quot; case should be relatively fast. Specifically, there should be
no capturing of a stack trace when the transfer is successful.</li><li>The structure of the generated code should take advantage of existing hotspot optimizations and enable new ones.<br>
</li><li>Successful transfers should be transparent to intervening catch clauses (this will be discussed in a later message).<br></li><li>The failure case should capture a stack trace for debugging
and diagnosing the problem. This includes the case in which the
transfer is executed in the wrong thread, or when a transfer occurs too
late.</li><li>Transient object creation should be minimized.
<br>
</li><li>When a transfer fails because of being in the wrong thread,
there should be enough information for an underlying concurrent loop
implementation to shuttle the transfer to the correct thread to
complete it. See <a href="http://gafter.blogspot.com/2006/10/concurrent-loops-using-java-closures.html" target="_blank">
http://gafter.blogspot.com/2006/10/concurrent-loops-using-java-closures.html</a>,
where I suggested the proper treatment; the language should provide
enough information for a concurrent loop API to implement this:</li></ul>
<div style="margin-left: 80px;"> What should happen if you use <span style="font-family: Courier New;">continue</span>, <span style="font-family: Courier New;">break</span>, or <span style="font-family: Courier New;">return
</span> within the body of this loop, or <span style="font-family: Courier New;">throw</span> an exception? The <span style="font-family: Courier New;">continue</span>
case is easy: it just completes execution of that one iteration, and
the other iterations proceed on their merry way. The semantics of <span style="font-family: Courier New;">break</span>
are a bit subtle, but obvious once you realize this is supposed to act
like a loop: it completes the current iteration and cancels any other
iterations that have not completed, and control returns to the caller
of <span style="font-family: Courier New;">for eachConcurrently</span>. Handling a <span style="font-family: Courier New;">return</span> statement is similar: it cancels any uncompleted iterations and returns from the enclosing method, which in this case would be 
<span style="font-family: Courier New;">getAttendees</span>. Finally, any exception that propagates out of a loop iteration cancels uncompleted iterations and propagates from the loop.<br></div><br>I also carefully avoided the need for &quot;volatile&quot; in accurately (I think) distinguishing the failure from success cases.
<br><br>The planned implementation is as follows. First, we add two support classes:<br><br><div style="margin-left: 40px;"><span style="font-family: courier new,monospace;">/**</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp;* A class used to implement nonlocal transfer of control. This</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;* should only be thrown when the target of the transfer is on
</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;* the call stack of the current thread.</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
&nbsp;*/</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">public class Jump extends RuntimeException { // should really not be a subtype of Throwable</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp; /** Returns the thread in which the transfer should take place. */</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">

&nbsp; public Thread thread() { return Thread.currentThread(); }</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp; /** Causes the transfer to occur, typically by throwing this. */
</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
&nbsp; public void transfer() { throw this; }</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp; /** We suppress the stack trace for transfers. */</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">
&nbsp; @Override public Throwable fillInStackTrace() {}</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
}</span><br></div><br><div style="margin-left: 40px;"><span style="font-family: courier new,monospace;">/**</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;* Exception thrown when a transfer from within a lambda doesn&#39;t have<br>
&nbsp;* a matching frame on the stack of the current thread.<br></span><span style="font-family: courier new,monospace;">&nbsp;*/</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
class UnmatchedNonlocalTransfer extends RuntimeException {</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp; /** The Jump that would cause the transfer of control. */
</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
&nbsp; private Jump jump;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
&nbsp; public UnmatchedNonlocalTransfer(Jump jump) {</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
&nbsp;&nbsp;&nbsp; this.jump = jump;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
&nbsp; }</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp; /** Returns the thread containing the target of the transfer. */</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">
&nbsp; public Thread thread() { return jump.thread(); }</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp; /** Attempts to cause the transfer to occur. May throw UnmatchedNonlocalTransfer. */
</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
&nbsp; public Unreachable transfer() { jump.transfer(); }</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
}</span><br></div>
<br>Now, to translate our source code, consider a method<br><br><div style="margin-left: 40px;"><span style="font-family: courier new,monospace;">int method(...) {</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
&nbsp;&nbsp;&nbsp; ...</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b><span style="color: rgb(0, 153, 0);">return 3;</span></b> // original code inside some closure</span>
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; ...</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">}</span><br>

</div><br>this would be translated into something like this:<br><br><div style="margin-left: 40px;"><span style="font-family: courier new,monospace;">int method(...) {</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; static class Frame$ { // the promoted parts of the method call frame</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread thread; // track the thread executing the call</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean dead; // set to true when the method is not active
</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; }</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; final Frame$ frame$ = new Frame$();
</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; frame$.thread = Thread.currentThread();</span><span style="font-family: courier new,monospace;"></span><br style="font-family: courier new,monospace;">

<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp; &nbsp; // a synthetic class customized for handling nonlocal transfers from this method</span><br><span style="font-family: courier new,monospace;">
&nbsp;&nbsp;&nbsp; static class MyReturn extends Jump {</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Frame$ frame; // needed to detect correct frame in case there is recursion
</span><span style="font-family: courier new,monospace;"></span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final int value; // the returned value (can&#39;t be stored in the frame because of try-finally)
</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Override public Unreachable transfer() {</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw (Thread.currentThread() == frame.thread &amp;&amp; !</span><span style="font-family: courier new,monospace;">frame.dead</span><span style="font-family: courier new,monospace;">)</span><br><span style="font-family: courier new,monospace;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ? this : new UnmatchedNonlocalTransfer(this);</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Override public void thread() { return frame.thread; }</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyReturn(Frame frame, int value) {
</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super();</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.frame = frame;</span><span style="font-family: courier new,monospace;"></span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.value = value;
</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; }
</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; try { // wraps the whole body of the translated method</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b><span style="color: rgb(0, 153, 0);">new MyReturn(frame$, 3).transfer();</span></b> // translated code inside some closure
</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
&nbsp;&nbsp;&nbsp; } catch (MyReturn ex) {</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ex.frame == frame$)</span><span style="font-family: courier new,monospace;"> // allow support for recursion
</span><br><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ex.value;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw ex;</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; } finally {</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame$.dead = true; // allow detection of late return
</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; }</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">}</span>
<br style="font-family: courier new,monospace;"></div>It would be possible to eliminate the nested synthetic class <span style="font-family: courier new,monospace;">MyReturn</span>
by creating a fixed set of them in the language support libraries (one
for each possible non-object return type, and one generic one for
object types), and by adding an interface that <span style="font-family: courier new,monospace;">Frame</span> would
implement which exposes the thread and the &quot;dead&quot; flag. That improves
the startup time but may hurt the steady-state running speed.<br>