<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style>
</head>
<body lang="en-CZ" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:13.5pt;color:black">From: Michael van Acken <</span><a href="mailto:michael.van.acken@gmail.com" target="_blank" title="mailto:michael.van.acken@gmail.com"><span style="color:#0078D4">michael.van.acken@gmail.com</span></a><span style="font-size:13.5pt;color:black">><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:36.0pt"><o:p> </o:p></p>
<p class="MsoNormal" style="margin-left:36.0pt">I have a single use of CodeBuilder.labelToBci(): decide whether the labels marking</p>
<p class="MsoNormal" style="margin-left:36.0pt">the start and end of a try block refer to the same position, as a proxy for "enclosed<br>
region is empty".  If this is the case, then no exceptionCatch can be installed and
<br>
all exception handlers become unreachable.<br>
<br>
How can this scenario still be supported?<br>
<br>
-- mva</p>
<p class="MsoNormal" style="margin-left:36.0pt"><o:p> </o:p></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">It is not guaranteed to get the right bytecode indexes from CodeBuilder::labelToBci, the method is really an exposure of internal implementation.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">Frequent common cases (like for example dropping exception handler when try block is empty) can be solved with CodeBuilder::trying support.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">CodeBuilder::trying uses CodeBuilder::block and before further actions asks CodeBuilder.BlockCodeBuilder::isEmpty.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">Now it throws an exception in case of an empty try block, however I can imagine it might skip all handlers instead:<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black">   
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">/**</span><span style="font-size:10.0pt;font-family:"Courier New";color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">     *
<b>Adds</b></span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">a "try-catch" block</span></b><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">comprising</span></b><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">one</span></b><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">try</span></b><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">block</span></b><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">and</span></b><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">zero</span></b><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">or</span></b><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">more</span></b><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">catch</span></b><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><b><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">blocks.</span></b><span style="font-size:10.0pt;font-family:"Courier New";color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">     * Exceptions</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">thrown</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">by</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">instructions</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">in</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">the</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">try</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">block</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">may</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">be</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">caught</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">by</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">catch</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">blocks.</span><span style="font-size:10.0pt;font-family:"Courier New";color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">     *</span><span style="font-size:10.0pt;font-family:"Courier New";color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">     *
<b>@param</b></span><span style="font-size:10.0pt;font-family:"Courier New";color:black"> tryHandler
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">handler</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">that</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">receives</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">a {<b>@linkplain</b></span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">CodeBuilder} to</span><span style="font-size:10.0pt;font-family:"Courier New";color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">     *                   generate</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">the</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">body</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">of</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">the</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">try</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">block.</span><span style="font-size:10.0pt;font-family:"Courier New";color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">     *
<b>@param</b></span><span style="font-size:10.0pt;font-family:"Courier New";color:black"> catchesHandler
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">a</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">handler</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">that</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">receives</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">a {<b>@linkplain</b></span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">CatchBuilder}</span><span style="font-size:10.0pt;font-family:"Courier New";color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">     *                       to</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">generate</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">bodies</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">of</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">catch</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">blocks.</span><span style="font-size:10.0pt;font-family:"Courier New";color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">     *
<b>@return</b></span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">this</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">builder</span><span style="font-size:10.0pt;font-family:"Courier New";color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">     *
<b>@see</b></span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">CatchBuilder</span><span style="font-size:10.0pt;font-family:"Courier New";color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black">    
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">*/</span><span style="font-size:10.0pt;font-family:"Courier New";color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black">   
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#336BDD">default</span><span style="font-size:10.0pt;font-family:"Courier New";color:black"> CodeBuilder
<b>trying</b>(Consumer<<i>BlockCodeBuilder</i>> tryHandler,<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black">                               Consumer<<i>CatchBuilder</i>> catchesHandler) {<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black">        Label tryCatchEnd = newLabel();<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black">       
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">// @@@ the tryHandler does not have access to tryCatchEnd</span><span style="font-size:10.0pt;font-family:"Courier New";color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black">        BlockCodeBuilderImpl tryBlock =
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#336BDD">new</span><span style="font-size:10.0pt;font-family:"Courier New";color:black"> BlockCodeBuilderImpl(</span><span style="font-size:10.0pt;font-family:"Courier New";color:#336BDD">this</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">,
 tryCatchEnd);<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black">        tryBlock.start();<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black">        tryHandler.accept(tryBlock);<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black">        tryBlock.end();<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black">       
</span><b><i><span style="font-size:10.0pt;font-family:"Courier New";color:#969696">// Check for empty try block</span></i></b><b><i><span style="font-size:10.0pt;font-family:"Courier New";color:black"><o:p></o:p></span></i></b></p>
<p class="MsoNormal" style="background:white"><b><i><span style="font-size:10.0pt;font-family:"Courier New";color:black">       
</span></i></b><b><i><span style="font-size:10.0pt;font-family:"Courier New";color:#336BDD">if</span></i></b><b><i><span style="font-size:10.0pt;font-family:"Courier New";color:black"> (</span></i></b><b><i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">!</span></i></b><b><i><span style="font-size:10.0pt;font-family:"Courier New";color:black">tryBlock.isEmpty())
 {<o:p></o:p></span></i></b></p>
<p class="MsoNormal" style="background:white"><b><i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">   
</span></i></b><b><i><span style="font-size:10.0pt;font-family:"Courier New";color:black">        </span></i></b><b><i><span style="font-size:10.0pt;font-family:"Courier New";color:#336BDD">var</span></i></b><b><i><span style="font-size:10.0pt;font-family:"Courier New";color:black">
 catchBuilder = </span></i></b><b><i><span style="font-size:10.0pt;font-family:"Courier New";color:#336BDD">new</span></i></b><b><i><span style="font-size:10.0pt;font-family:"Courier New";color:black"> CatchBuilderImpl(</span></i></b><b><i><span style="font-size:10.0pt;font-family:"Courier New";color:#336BDD">this</span></i></b><b><i><span style="font-size:10.0pt;font-family:"Courier New";color:black">,
 tryBlock, tryCatchEnd);<o:p></o:p></span></i></b></p>
<p class="MsoNormal" style="background:white"><b><i><span style="font-size:10.0pt;font-family:"Courier New";color:black">   
</span></i></b><b><i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">    </span></i></b><b><i><span style="font-size:10.0pt;font-family:"Courier New";color:black">    catchesHandler.accept(catchBuilder);<o:p></o:p></span></i></b></p>
<p class="MsoNormal" style="background:white"><b><i><span style="font-size:10.0pt;font-family:"Courier New";color:black">       
</span></i></b><b><i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">    </span></i></b><b><i><span style="font-size:10.0pt;font-family:"Courier New";color:black">catchBuilder.finish();<o:p></o:p></span></i></b></p>
<p class="MsoNormal" style="background:white"><b><i><span style="font-size:10.0pt;font-family:"Courier New";color:black">        }<o:p></o:p></span></i></b></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black">       
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#336BDD">return</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#336BDD">this</span><span style="font-size:10.0pt;font-family:"Courier New";color:black">;<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New";color:black">    }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
</div>
</body>
</html>