<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=Windows-1252">
<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;}
@font-face
{font-family:Menlo;
panose-1:2 11 6 9 3 8 4 2 2 4;}
@font-face
{font-family:"Courier New \;color\:black";
panose-1:2 7 3 9 2 2 5 2 4 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:#0563C1;
text-decoration:underline;}
code
{mso-style-priority:99;
font-family:"Courier New",serif;}
pre
{mso-style-priority:99;
mso-style-link:"HTML Preformatted Char";
margin:0cm;
font-size:10.0pt;
font-family:"Courier New",serif;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
{mso-style-priority:34;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:36.0pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ligatures:standardcontextual;
mso-fareast-language:EN-US;}
span.HTMLPreformattedChar
{mso-style-name:"HTML Preformatted Char";
mso-style-priority:99;
mso-style-link:"HTML Preformatted";
font-family:"Courier New",serif;
mso-ligatures:none;
mso-fareast-language:EN-GB;}
span.apple-converted-space
{mso-style-name:apple-converted-space;}
span.literal
{mso-style-name:literal;}
span.EmailStyle25
{mso-style-type:personal-reply;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;
mso-ligatures:none;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
{page:WordSection1;}
/* List Definitions */
@list l0
{mso-list-id:224099950;
mso-list-template-ids:389327056;}
@list l0:level1
{mso-level-tab-stop:36.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level2
{mso-level-tab-stop:72.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level3
{mso-level-tab-stop:108.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level4
{mso-level-tab-stop:144.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level5
{mso-level-tab-stop:180.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level6
{mso-level-tab-stop:216.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level7
{mso-level-tab-stop:252.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level8
{mso-level-tab-stop:288.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level9
{mso-level-tab-stop:324.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l1
{mso-list-id:533275496;
mso-list-template-ids:76579304;}
@list l1:level1
{mso-level-tab-stop:36.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l1:level2
{mso-level-tab-stop:72.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l1:level3
{mso-level-tab-stop:108.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l1:level4
{mso-level-tab-stop:144.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l1:level5
{mso-level-tab-stop:180.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l1:level6
{mso-level-tab-stop:216.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l1:level7
{mso-level-tab-stop:252.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l1:level8
{mso-level-tab-stop:288.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l1:level9
{mso-level-tab-stop:324.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l2
{mso-list-id:993218423;
mso-list-template-ids:-1084447502;}
@list l2:level1
{mso-level-number-format:bullet;
mso-level-text:\F0B7 ;
mso-level-tab-stop:36.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l2:level2
{mso-level-number-format:bullet;
mso-level-text:\F0B7 ;
mso-level-tab-stop:72.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l2:level3
{mso-level-number-format:bullet;
mso-level-text:\F0B7 ;
mso-level-tab-stop:108.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l2:level4
{mso-level-number-format:bullet;
mso-level-text:\F0B7 ;
mso-level-tab-stop:144.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l2:level5
{mso-level-number-format:bullet;
mso-level-text:\F0B7 ;
mso-level-tab-stop:180.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l2:level6
{mso-level-number-format:bullet;
mso-level-text:\F0B7 ;
mso-level-tab-stop:216.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l2:level7
{mso-level-number-format:bullet;
mso-level-text:\F0B7 ;
mso-level-tab-stop:252.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l2:level8
{mso-level-number-format:bullet;
mso-level-text:\F0B7 ;
mso-level-tab-stop:288.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l2:level9
{mso-level-number-format:bullet;
mso-level-text:\F0B7 ;
mso-level-tab-stop:324.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l3
{mso-list-id:1417704995;
mso-list-template-ids:-216873916;}
@list l3:level1
{mso-level-tab-stop:36.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l3:level2
{mso-level-tab-stop:72.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l3:level3
{mso-level-tab-stop:108.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l3:level4
{mso-level-tab-stop:144.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l3:level5
{mso-level-tab-stop:180.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l3:level6
{mso-level-tab-stop:216.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l3:level7
{mso-level-tab-stop:252.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l3:level8
{mso-level-tab-stop:288.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l3:level9
{mso-level-tab-stop:324.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l4
{mso-list-id:1443719952;
mso-list-template-ids:493143954;}
@list l4:level1
{mso-level-number-format:bullet;
mso-level-text:\F0B7 ;
mso-level-tab-stop:36.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l4:level2
{mso-level-number-format:bullet;
mso-level-text:\F0B7 ;
mso-level-tab-stop:72.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l4:level3
{mso-level-number-format:bullet;
mso-level-text:\F0B7 ;
mso-level-tab-stop:108.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l4:level4
{mso-level-number-format:bullet;
mso-level-text:\F0B7 ;
mso-level-tab-stop:144.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l4:level5
{mso-level-number-format:bullet;
mso-level-text:\F0B7 ;
mso-level-tab-stop:180.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l4:level6
{mso-level-number-format:bullet;
mso-level-text:\F0B7 ;
mso-level-tab-stop:216.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l4:level7
{mso-level-number-format:bullet;
mso-level-text:\F0B7 ;
mso-level-tab-stop:252.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l4:level8
{mso-level-number-format:bullet;
mso-level-text:\F0B7 ;
mso-level-tab-stop:288.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l4:level9
{mso-level-number-format:bullet;
mso-level-text:\F0B7 ;
mso-level-tab-stop:324.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
--></style>
</head>
<body lang="en-CZ" link="#0563C1" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">OK, let’s postpone these.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal" style="margin-bottom:12.0pt"><b><span style="font-size:12.0pt;color:black">From:
</span></b><span style="font-size:12.0pt;color:black">Brian Goetz <brian.goetz@oracle.com><br>
<b>Date: </b>Friday, 19 May 2023 16:08<br>
<b>To: </b>Adam Sotona <adam.sotona@oracle.com>, classfile-api-dev@openjdk.org <classfile-api-dev@openjdk.org><br>
<b>Subject: </b>Re: Convenient methods to build switch and try/finally in Classfile API<o:p></o:p></span></p>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><span style="font-size:13.5pt;font-family:"Courier New",serif">As I mentioned to Chen Liang, I would really like to place a moratorium on "new convenience methods" for a while, and I'd like to stop doing them
one at a time. Instead, let's gather a list of areas that potentially need improvement, and come back in a more organized way for a subsequent preview.
<br>
<br>
I have no objection to eventually improving the API for both switches and try, but both of these areas have some risk in them, so I don't want to treat these as the same sort of convenience as `aload_0`. Switches have messy scoping (it's all one big scope,
which means we don't create a new locals context the way we do with if/else) and control flow (break, continue).
<br>
<br>
We have an existing trying() construct but it doesn't handle finally. Having two constructs that look like they correspond to the same language construct may be confusing. (Also, I'm not convinced that our trying() builder handles local variable slot allocation
correctly either -- I think the try block does, but I am pretty sure the cache handler doesn't. But we don't have tests that cover the interaction of the various convenience builders with local allocation.
<br>
<br>
So let's put this on the list of things that need improvement, and meanwhile, continue to shore up basics.</span><o:p></o:p></p>
<div>
<p class="MsoNormal">On 5/19/2023 5:12 AM, Adam Sotona wrote:<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><span lang="EN-US">Hi,</span><o:p></o:p></p>
<p style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm">
<span style="font-size:10.5pt">Classfile API provides convenient methods for if/then/else or try/catch, however similar methods to build switch or try/finally are missing</span><span lang="EN-US" style="font-size:10.5pt">.</span><o:p></o:p></p>
<p style="margin:0cm;box-sizing: border-box;caret-color: rgb(31,
35, 40);font-variant-caps: normal;orphans:
auto;text-align:start;widows: auto;-webkit-text-size-adjust:
auto;-webkit-text-stroke-width: 0px;word-spacing:0px">
<span style="font-size:10.5pt">Here I would like to propose new<span class="apple-converted-space"> </span></span><code><span style="font-size:9.0pt;font-family:Menlo;color:#1F2328">CodeBuilder</span></code><span class="apple-converted-space"><span style="font-size:10.5pt"> </span></span><span style="font-size:10.5pt">conveniences:<br>
<br>
<br>
</span><o:p></o:p></p>
<ol style="margin-top:0cm" start="1" type="1">
<li class="MsoNormal" style="color:#1F2328;mso-list:l0 level1 lfo3"><code><span style="font-size:9.0pt;font-family:Menlo">lookupswitch(Consumer<SwitchBuilder> switchHandler)</span></code><o:p></o:p></li><li class="MsoNormal" style="color:#1F2328;mso-list:l0 level1 lfo3"><code><span style="font-size:9.0pt;font-family:Menlo">tableswitch(Consumer<SwitchBuilder> switchHandler)</span></code><o:p></o:p></li><li class="MsoNormal" style="color:#1F2328;mso-list:l0 level1 lfo3"><code><span style="font-size:9.0pt;font-family:Menlo">tryWithFinalizer(Consumer<CodeBuilder> tryHandler, Consumer<CodeBuilder> finalizerHandler, Label... externalLabels)</span></code><o:p></o:p></li><li class="MsoNormal" style="mso-list:l0 level1 lfo3"><code><span style="font-size:9.0pt;font-family:Menlo;color:#1F2328">tryWithFinalizer(Consumer<CodeBuilder> tryHandler, Consumer<CodeBuilder> finalizerHandler, boolean compactForm, Label... externalLabels)</span></code><o:p></o:p></li></ol>
<p style="margin:0cm;box-sizing: border-box;caret-color: rgb(31,
35, 40);font-variant-caps: normal;orphans:
auto;text-align:start;widows: auto;-webkit-text-size-adjust:
auto;-webkit-text-stroke-width: 0px;word-spacing:0px">
<span style="font-size:10.5pt"> </span><o:p></o:p></p>
<p style="margin:0cm"><span style="font-size:10.5pt">and new<span class="apple-converted-space"> </span></span><code><span style="font-size:9.0pt;font-family:Menlo;color:#1F2328">CodeBuilder.SwitchBuilder</span></code><span class="apple-converted-space"><span style="font-size:10.5pt"> </span></span><span style="font-size:10.5pt">interface
with methods:<br>
<br>
<br>
</span><o:p></o:p></p>
<ol style="margin-top:0cm" start="1" type="1">
<li class="MsoNormal" style="color:#1F2328;mso-list:l3 level1 lfo6"><code><span style="font-size:9.0pt;font-family:Menlo">switchCase(int caseValue, Consumer<BlockCodeBuilder> caseHandler)</span></code><o:p></o:p></li><li class="MsoNormal" style="color:#1F2328;mso-list:l3 level1 lfo6"><code><span style="font-size:9.0pt;font-family:Menlo">switchCase(List<Integer> caseValues, Consumer<BlockCodeBuilder> caseHandler)</span></code><o:p></o:p></li><li class="MsoNormal" style="mso-list:l3 level1 lfo6"><code><span style="font-size:9.0pt;font-family:Menlo;color:#1F2328">defaultCase(Consumer<BlockCodeBuilder> defaultHandler)</span></code><o:p></o:p></li></ol>
<p class="MsoNormal"><span lang="EN-US"> </span><o:p></o:p></p>
<p class="MsoNormal"><span lang="EN-US">Sample use case (more can be seen in the tests at
<a href="https://github.com/openjdk/jdk/pull/14056/files">https://github.com/openjdk/jdk/pull/14056/files</a>):</span><o:p></o:p></p>
<p class="MsoNormal" style="background:white"><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New ;color:black",serif;color:black"> </span><o:p></o:p></p>
<p class="MsoNormal" style="background:white"><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New ;color:black",serif;color:black">cob</span><span style="font-size:10.0pt;font-family:"Courier New ;color:black",serif;color:black">.<i>lookupswitch</i>(swb
-> swb</span><o:p></o:p></p>
<p class="MsoNormal" style="background:white"><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New ;color:black",serif;color:black">
</span><span style="font-size:10.0pt;font-family:"Courier New ;color:black",serif;color:black">.<i>switchCase</i>(1, b -> b.<i>iinc</i>(0,1).<i>goto_</i>(b.<i>breakLabel</i>()))</span><o:p></o:p></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New ;color:black",serif;color:black"> .<i>switchCase</i>(2, b -> b.<i>iinc</i>(0,2).<i>goto_</i>(b.<i>breakLabel</i>()))</span><o:p></o:p></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New ;color:black",serif;color:black"> .<i>switchCase</i>(3, b -> b.<i>iinc</i>(0,3).<i>goto_</i>(b.<i>breakLabel</i>()))</span><o:p></o:p></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New ;color:black",serif;color:black"> .<i>defaultCase</i>(b -> b.<i>iinc</i>(0,100).<i>goto_</i>(b.<i>breakLabel</i>()))</span><o:p></o:p></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New ;color:black",serif;color:black"> .<i>switchCase</i>(4, b -> b.<i>iinc</i>(0,4).<i>goto_</i>(b.<i>breakLabel</i>()))</span><o:p></o:p></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New ;color:black",serif;color:black"> .<i>switchCase</i>(5, b -> b.<i>iinc</i>(0,5).<i>goto_</i>(b.<i>breakLabel</i>()))</span><o:p></o:p></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New ;color:black",serif;color:black"> .<i>switchCase</i>(6, b -> b.<i>iinc</i>(0,6).<i>goto_</i>(b.<i>breakLabel</i>())))</span><o:p></o:p></p>
<pre style="background:white"><span class="literal"><span style="color:#336BDD"> </span></span><o:p></o:p></pre>
<pre style="background:white"><span style="color:black">cob.tryWithFinalizer(</span><o:p></o:p></pre>
<pre style="background:white"><span style="color:black"> tryb -> tryb.goto_(externalLabel1),</span><o:p></o:p></pre>
<pre style="background:white"><span style="color:black"> finb -> finb.constantInstruction(42).ireturn(),</span><o:p></o:p></pre>
<pre style="background:white"><span style="color:black"> externalLabel1);</span><o:p></o:p></pre>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:"Courier New ;color:black",serif;color:black"> </span><o:p></o:p></p>
<p class="MsoNormal"><span lang="EN-US"> </span><o:p></o:p></p>
<p class="MsoNormal"><span lang="EN-US"> </span><o:p></o:p></p>
<p class="MsoNormal"><span lang="EN-US">The implementation work is in progress. I’m now fiddling with precise placing of finalizers in all possible situations. Trying to do not miss any exit from try block, do not produce dead code, do not fall to double finalizer
execution and all that with appropriate test coverage. </span><o:p></o:p></p>
<p class="MsoNormal"><span lang="EN-US">The implementation of finalizers now offers two possible modes:</span><o:p></o:p></p>
<ol style="margin-top:0cm" start="1" type="1">
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l1 level1 lfo8"><span lang="EN-US">expanded (as javac does now), where the code flow is unaffected and finalizer block is copied before each exit from the try block</span><o:p></o:p></li><li class="MsoListParagraph" style="margin-left:0cm;mso-list:l1 level1 lfo8"><span lang="EN-US">compact, where identical exits are joined to common copy of the finalizer block (for example all returns are merged into one finalizer and return).</span><o:p></o:p></li></ol>
<p class="MsoNormal"><span lang="EN-US"> </span><o:p></o:p></p>
<p class="MsoNormal"><span lang="EN-US"> </span><o:p></o:p></p>
<p class="MsoNormal"><span lang="EN-US">Please let me know your comments and suggestions.</span><o:p></o:p></p>
<p class="MsoNormal"><span lang="EN-US"> </span><o:p></o:p></p>
<p class="MsoNormal"><span lang="EN-US">Thanks,</span><o:p></o:p></p>
<p class="MsoNormal"><span lang="EN-US">Adam</span><o:p></o:p></p>
</blockquote>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>