<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;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
font-size:10.0pt;
font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
{mso-style-priority:34;
mso-margin-top-alt:auto;
margin-right:0cm;
mso-margin-bottom-alt:auto;
margin-left:0cm;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
span.apple-converted-space
{mso-style-name:apple-converted-space;}
span.EmailStyle20
{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:603995217;
mso-list-template-ids:1184032332;}
@list l0: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 l0: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 l0: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 l0: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 l0: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 l0: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 l0: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 l0: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 l0: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 l1
{mso-list-id:1505776509;
mso-list-template-ids:1016365584;}
@list l1: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 l1: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 l1: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 l1: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 l1: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 l1: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 l1: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 l1: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 l1: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="blue" vlink="purple" style="word-wrap:break-word;-webkit-nbsp-mode: space;line-break:after-white-space">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;mso-fareast-language:EN-US">By failing symbols validation I mean when for example index points to correct ClassEntry pointing to correct Utf8Entry name, however the name is not valid class name
and ClassDesc construction throws IAE.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;mso-fareast-language:EN-US">Each such case must be individually safeguarded to do not prematurely terminate the whole javap.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;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>Thursday, 13 April 2023 17:46<br>
<b>To: </b>Adam Sotona <adam.sotona@oracle.com><br>
<b>Cc: </b>liangchenblue@gmail.com <liangchenblue@gmail.com>, classfile-api-dev@openjdk.org <classfile-api-dev@openjdk.org><br>
<b>Subject: </b>Re: Exceptions from invalid constant pool indices in the API<o:p></o:p></span></p>
</div>
<p class="MsoNormal"><span style="font-size:11.0pt">So, I think there are two reasons we might consider a more precise exception here. One is Chen’s concern of “what do I catch”, and the other is simply getting a more human-readable explanation of what went
wrong. Exceptions like AIOOBE and IAE are often not helpful in explaining what actually went wrong (what index? Into what? Where did the bad value come from?). <o:p></o:p></span></p>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">Part of this is the exception type (which helps both of these audiences), and part of this is the exception message (which helps only the latter.). We should probably do a pass and make sure we have informative
error text in all throw points. <o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">What do you mean “when the symbol fails validation”? <o:p></o:p></span></p>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"><br>
<br>
<o:p></o:p></span></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">On Apr 13, 2023, at 9:00 AM, Adam Sotona <<a href="mailto:adam.sotona@oracle.com">adam.sotona@oracle.com</a>> wrote:<o:p></o:p></span></p>
</div>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<div>
<div>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">I’ve tried to convert all CP related exceptions to a new ConstantPoolException, however<span class="apple-converted-space"> </span></span><span style="font-size:11.0pt">IllegalArgumentException<span class="apple-converted-space"> </span></span><span lang="EN-US" style="font-size:11.0pt">is
still in the game (in javap) as a secondary exception thrown during validation of symbols.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">For example printing of Signature attribute or any ClassDesc can now fail with:</span><o:p></o:p></p>
</div>
<ul style="margin-top:0cm" type="disc">
<li class="MsoListParagraph" style="margin-top:0cm;margin-bottom:0cm;mso-list:l0 level1 lfo1">
IndexOutOfBoundsException<span class="apple-converted-space"><span lang="EN-US"> </span></span><span lang="EN-US">when the index is invalid</span><span style="font-size:10.0pt"><o:p></o:p></span></li><li class="MsoListParagraph" style="margin-top:0cm;margin-bottom:0cm;mso-list:l0 level1 lfo1">
IllegalArgumentException<span class="apple-converted-space"> </span><span lang="EN-US">when the CP entry is invalid</span><span style="font-size:10.0pt"><o:p></o:p></span></li><li class="MsoListParagraph" style="margin-top:0cm;margin-bottom:0cm;mso-list:l0 level1 lfo1">
IllegalArgumentException<span class="apple-converted-space"><span lang="EN-US"> </span></span><span lang="EN-US">when the symbol is invalid</span><span style="font-size:10.0pt"><o:p></o:p></span></li></ul>
<div>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">After merge of CP-related<span class="apple-converted-space"> </span></span><span style="font-size:11.0pt">IndexOutOfBoundsException</span><span class="apple-converted-space"><span lang="EN-US" style="font-size:11.0pt"> </span></span><span lang="EN-US" style="font-size:11.0pt">and<span class="apple-converted-space"> </span></span><span style="font-size:11.0pt">IllegalArgumentException<span class="apple-converted-space"> </span></span><span lang="EN-US" style="font-size:11.0pt">into<span class="apple-converted-space"> </span>ConstantPoolException<span class="apple-converted-space"> </span>we
can get:</span><o:p></o:p></p>
</div>
<ul style="margin-top:0cm" type="disc">
<li class="MsoListParagraph" style="margin-top:0cm;margin-bottom:0cm;mso-list:l1 level1 lfo2">
<span lang="EN-US">ConstantPoolException<span class="apple-converted-space"> </span>when the index is invalid</span><span style="font-size:10.0pt"><o:p></o:p></span></li><li class="MsoListParagraph" style="margin-top:0cm;margin-bottom:0cm;mso-list:l1 level1 lfo2">
<span lang="EN-US">ConstantPoolException<span class="apple-converted-space"> </span>when the CP entry is invalid</span><span style="font-size:10.0pt"><o:p></o:p></span></li><li class="MsoListParagraph" style="margin-top:0cm;margin-bottom:0cm;mso-list:l1 level1 lfo2">
IllegalArgumentException<span class="apple-converted-space"><span lang="EN-US"> </span></span><span lang="EN-US">when the symbol fails validation</span><span style="font-size:10.0pt"><o:p></o:p></span></li></ul>
<div>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">Is it still worth to introduce a new exception when javap still must individually safeguard also<span class="apple-converted-space"> </span></span><span style="font-size:11.0pt">IllegalArgumentException</span><span lang="EN-US" style="font-size:11.0pt">s<span class="apple-converted-space"> </span>?</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">What about to replace CP-relate<span class="apple-converted-space"> </span></span><span style="font-size:11.0pt">IndexOutOfBoundsException</span><span class="apple-converted-space"><span lang="EN-US" style="font-size:11.0pt"> </span></span><span lang="EN-US" style="font-size:11.0pt">with<span class="apple-converted-space"> </span></span><span style="font-size:11.0pt">IllegalArgumentException</span><span class="apple-converted-space"><span lang="EN-US" style="font-size:11.0pt"> </span></span><span lang="EN-US" style="font-size:11.0pt">so
we will have one single type of exception to catch when class reading?</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">Or what if we make<span class="apple-converted-space"> </span>ConstantPoolException a sub-class of<span class="apple-converted-space"> </span></span><span style="font-size:11.0pt">IllegalArgumentException</span><span lang="EN-US" style="font-size:11.0pt">?</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">Thanks,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">Adam</span><o:p></o:p></p>
</div>
<div style="margin-left:36.0pt">
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt"> </span><o:p></o:p></p>
</div>
<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">From:<span class="apple-converted-space"> </span></span></b><span style="font-size:12.0pt">classfile-api-dev <<a href="mailto:classfile-api-dev-retn@openjdk.org">classfile-api-dev-retn@openjdk.org</a>>
on behalf of Brian Goetz <<a href="mailto:brian.goetz@oracle.com">brian.goetz@oracle.com</a>><br>
<b>Date:<span class="apple-converted-space"> </span></b>Tuesday, 11 April 2023 2:15<br>
<b>To:<span class="apple-converted-space"> </span></b><a href="mailto:liangchenblue@gmail.com">liangchenblue@gmail.com</a> <<a href="mailto:liangchenblue@gmail.com">liangchenblue@gmail.com</a>><br>
<b>Cc:<span class="apple-converted-space"> </span></b><a href="mailto:classfile-api-dev@openjdk.org">classfile-api-dev@openjdk.org</a> <<a href="mailto:classfile-api-dev@openjdk.org">classfile-api-dev@openjdk.org</a>><br>
<b>Subject:<span class="apple-converted-space"> </span></b>Re: Exceptions from invalid constant pool indices in the API</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><span style="font-size:11.0pt">Good suggestion!<br>
<br>
> On Apr 10, 2023, at 4:34 PM, <a href="mailto:liangchenblue@gmail.com">liangchenblue@gmail.com</a> wrote:<br>
><span class="apple-converted-space"> </span><br>
> When I was taking a peek at the conversion of javap to Classfile API,<br>
> I found that the old API has a feature that the API might be<br>
> interested in: a dedicated exception ConstantPoolException for invalid<br>
> constant pool indices, caused by incorrect types or out-of-bounds. We<br>
> currently throw IllegalArgumentException and IndexOutOfBoundsException<br>
> in the Classfile API, so it is a bit harder to catch such invalid<br>
> indices.<br>
><span class="apple-converted-space"> </span><br>
> Javap is tolerant to invalid class file formats while the reading part<br>
> of Classfile API is not so much; in general, Classfile API fails fast<br>
> if it encounters invalid constant pool entries; this I agree, that<br>
> invalid entries render a classfile invalid, but maybe we can unify the<br>
> reading exceptions from ConstantPoolReader into a common type like in<br>
> the old API, so we can more easily report constant pool errors or skip<br>
> invalid but optional entries.<br>
><span class="apple-converted-space"> </span><br>
> Chen Liang</span><o:p></o:p></p>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
</div>
</div>
</body>
</html>