<div dir="ltr">This issue caught my eye: <a class="gmail-issue-link" href="https://bugs.openjdk.org/browse/JDK-8308023" id="gmail-key-val" rel="5100833">JDK-8308023</a> - Javac generates exponentially large class file with nested try catch statements<div><br></div><div>In a nutshell, since JSR/RET is no longer allowed/used, we now compile <span style="font-family:monospace">try { X } finally { Y }</span> into this:<br></div><div><br></div><div><span style="font-family:monospace">    X</span></div><div><span style="font-family:monospace">  </span><span style="font-family:monospace">  </span><span style="font-family:monospace">Y</span></div><div><span style="font-family:monospace">  </span><span style="font-family:monospace">  goto L2<br></span></div><div><span style="font-family:monospace">L1:</span><span style="font-family:monospace"> </span><span style="font-family:monospace">Store</span><span style="font-family:monospace"> exception in local e1<br></span></div><div><span style="font-family:monospace">  </span><span style="font-family:monospace">  </span><span style="font-family:monospace">Y</span></div><div><span style="font-family:monospace">    Load exception from local e1<br></span></div><div><span style="font-family:monospace">  </span><span style="font-family:monospace">  Throw exception</span></div><div><span style="font-family:monospace">L2: ...<br></span></div><div><br></div><div>The<span style="font-family:monospace"> L1 </span><span style="font-family:arial,sans-serif">label is the</span> target for the exception range surrounding <span style="font-family:monospace">X</span>.</div><div><br></div><div>Note that the finally block <span style="font-family:monospace">Y</span> is duplicated.</div><div><br></div><div>This means that if we hare N nested finally's:<br></div><div><br></div><div><span style="font-family:monospace">    try {<br>      X0<br>    } finally {<br>      try {<br>        X1<br>      } finally {<br>        try {<br>          X2<br>        } finally {<br>          .... try {<br>                XN<br>              } finally {<br>                // done<br>          ... }<br>          }<br>        }<br>      }<br>    }</span><br></div><div><br></div><div>then each block <span style="font-family:monospace">Xi</span> will be replicated 2^i times in the classfile.<br></div><div><br></div><div>Question: Can we solve this problem simply by avoiding the duplication of finally blocks?<br></div><div><br></div><div>What if we compiled <span style="font-family:monospace">try { X } finally { Y }</span> into this:</div><div><br></div><div><div><span style="font-family:monospace">    X</span></div><div><span style="font-family:monospace">    Store null in local e1         // new instruction<br></span></div><div><span style="font-family:monospace">  </span><span style="font-family:monospace">  goto L2<br></span></div>L1:<span style="font-family:monospace"> Store exception in local e1<br></span><div><span style="font-family:monospace">L2:</span><span style="font-family:monospace"> </span><span style="font-family:monospace">Y</span></div><div><span style="font-family:monospace">    Load exception from local e1<br></span></div><div><span style="font-family:monospace">    If null, goto L3               </span><span style="font-family:monospace">// new instruction</span></div><div><div><span style="font-family:monospace">    Load exception from local e1</span><span style="font-family:monospace">   </span><span style="font-family:monospace">// new instruction</span></div><span style="font-family:monospace">  </span><span style="font-family:monospace">  Throw exception</span></div><div><span style="font-family:monospace">L3: ...<br></span></div><div><br></div><div>There are three new instructions, so in trivial cases this would make the classfile larger. But in the highly nested cases it would change the classfile growth from exponential to linear.</div><div><br></div><div>Thoughts? What am I missing?<br></div><div><br></div><div>-Archie<br></div><br><span class="gmail_signature_prefix">-- </span><br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature">Archie L. Cobbs<br></div></div></div>