<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;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:10.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.pl-en
        {mso-style-name:pl-en;}
.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;}
--></style>
</head>
<body lang="en-CZ" link="#0563C1" vlink="#954F72" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"><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">classfile-api-dev <classfile-api-dev-retn@openjdk.org> on behalf of liangchenblue@gmail.com <liangchenblue@gmail.com><br>
<b>Date: </b>Wednesday, 31 May 2023 8:26<br>
<b>To: </b>classfile-api-dev <classfile-api-dev@openjdk.org><br>
<b>Subject: </b>ClassHierarchyResolver changes for the Classfile object<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt">Hello,<br>
Since we are migrating to the Classfile object (8308899), which was<br>
initiated by our observation that Class hierarchy resolvers shouldn't<br>
always cache their results, I wonder what changes I should adapt to my<br>
current patch (8304425, PR #13082).<br>
<br>
We have already decided a few API changes for the resolver:<br>
1. Remove the default hierarchy resolver (at least change to static<br>
factories), caching is bound to Classfile lifetime<br>
<br>
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">Yes, but we need to check performance impact on existing use cases (where to extra hold Classfile instance with cache).<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt">2. Two new resolver factories: Bytecode/resource parsing and<br>
classloading/reflection from a given classloader (The goal of this<br>
patch)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">Yes.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt"><br>
3. The resolution result ClassHierarchyInfo will be converted into an<br>
interface; record is an implementation detail (TBD)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">This can go even further. To save footprint ClassHierarchyInfo does not need to expose anything, it does not need to carry thisClass and all interface infos can point to a singleton object, something
 like this:<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New",serif;color:black">   
</span><span style="font-family:"Courier New",serif;color:#969696">/**</span><span style="font-family:"Courier New",serif;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New",serif;color:#969696">     *
<b>Information</b></span><span style="font-family:"Courier New",serif;color:black">
</span><b><span style="font-family:"Courier New",serif;color:#969696">about</span></b><span style="font-family:"Courier New",serif;color:black">
</span><b><span style="font-family:"Courier New",serif;color:#969696">a</span></b><span style="font-family:"Courier New",serif;color:black">
</span><b><span style="font-family:"Courier New",serif;color:#969696">resolved</span></b><span style="font-family:"Courier New",serif;color:black">
</span><b><span style="font-family:"Courier New",serif;color:#969696">class</span></b><span style="font-family:"Courier New",serif;color:black">
</span><b><span style="font-family:"Courier New",serif;color:#969696">or</span></b><span style="font-family:"Courier New",serif;color:black">
</span><b><span style="font-family:"Courier New",serif;color:#969696">interface.</span></b><span style="font-family:"Courier New",serif;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New",serif;color:black">    
</span><span style="font-family:"Courier New",serif;color:#969696">*/</span><span style="font-family:"Courier New",serif;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New",serif;color:black">   
</span><span style="font-family:"Courier New",serif;color:#336BDD">sealed</span><span style="font-family:"Courier New",serif;color:black">
</span><span style="font-family:"Courier New",serif;color:#336BDD">interface</span><span style="font-family:"Courier New",serif;color:black">
<b><i>ClassHierarchyInfo</i></b><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New",serif;color:black">           
</span><span style="font-family:"Courier New",serif;color:#336BDD">permits</span><span style="font-family:"Courier New",serif;color:black"> ClassHierarchyImpl.<i>ClassHierarchyInfoImpl</i> {<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New",serif;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New",serif;color:black">       
</span><span style="font-family:"Courier New",serif;color:#969696">/**</span><span style="font-family:"Courier New",serif;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New",serif;color:#969696">         * {<b>@return</b></span><span style="font-family:"Courier New",serif;color:black">
</span><span style="font-family:"Courier New",serif;color:#969696">the {<b>@link</b></span><span style="font-family:"Courier New",serif;color:black">
</span><span style="font-family:"Courier New",serif;color:#969696">ClassHierarchyInfo} of</span><span style="font-family:"Courier New",serif;color:black">
</span><span style="font-family:"Courier New",serif;color:#969696">an</span><span style="font-family:"Courier New",serif;color:black">
</span><span style="font-family:"Courier New",serif;color:#969696">interface}</span><span style="font-family:"Courier New",serif;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New",serif;color:#969696">         * no</span><span style="font-family:"Courier New",serif;color:black">
</span><span style="font-family:"Courier New",serif;color:#969696">other</span><span style="font-family:"Courier New",serif;color:black">
</span><span style="font-family:"Courier New",serif;color:#969696">information</span><span style="font-family:"Courier New",serif;color:black">
</span><span style="font-family:"Courier New",serif;color:#969696">about</span><span style="font-family:"Courier New",serif;color:black">
</span><span style="font-family:"Courier New",serif;color:#969696">interface</span><span style="font-family:"Courier New",serif;color:black">
</span><span style="font-family:"Courier New",serif;color:#969696">is</span><span style="font-family:"Courier New",serif;color:black">
</span><span style="font-family:"Courier New",serif;color:#969696">required</span><span style="font-family:"Courier New",serif;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New",serif;color:black">        
</span><span style="font-family:"Courier New",serif;color:#969696">*/</span><span style="font-family:"Courier New",serif;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New",serif;color:black">       
</span><span style="font-family:"Courier New",serif;color:#336BDD">static</span><span style="font-family:"Courier New",serif;color:black">
<i>ClassHierarchyInfo</i> <b><i>ofInterface</i></b>() {<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New",serif;color:black">           
</span><span style="font-family:"Courier New",serif;color:#336BDD">return</span><span style="font-family:"Courier New",serif;color:black"> ClassHierarchyImpl.</span><i><span style="font-family:"Courier New",serif;color:#CE54B8">INTERFACE_INFO_INSTANCE</span></i><span style="font-family:"Courier New",serif;color:black">;<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New",serif;color:black">        }<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New",serif;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New",serif;color:black">       
</span><span style="font-family:"Courier New",serif;color:#969696">/**</span><span style="font-family:"Courier New",serif;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New",serif;color:#969696">         *
<b>@return</b></span><span style="font-family:"Courier New",serif;color:black"> </span>
<span style="font-family:"Courier New",serif;color:#969696">the {<b>@link</b></span><span style="font-family:"Courier New",serif;color:black">
</span><span style="font-family:"Courier New",serif;color:#969696">ClassHierarchyInfo} of</span><span style="font-family:"Courier New",serif;color:black">
</span><span style="font-family:"Courier New",serif;color:#969696">an</span><span style="font-family:"Courier New",serif;color:black">
</span><span style="font-family:"Courier New",serif;color:#969696">interface</span><span style="font-family:"Courier New",serif;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New",serif;color:#969696">         *
<b>@param</b></span><span style="font-family:"Courier New",serif;color:black"> superClass
</span><span style="font-family:"Courier New",serif;color:#969696">information</span><span style="font-family:"Courier New",serif;color:black">
</span><span style="font-family:"Courier New",serif;color:#969696">about</span><span style="font-family:"Courier New",serif;color:black">
</span><span style="font-family:"Courier New",serif;color:#969696">super</span><span style="font-family:"Courier New",serif;color:black">
</span><span style="font-family:"Courier New",serif;color:#969696">of</span><span style="font-family:"Courier New",serif;color:black">
</span><span style="font-family:"Courier New",serif;color:#969696">the</span><span style="font-family:"Courier New",serif;color:black">
</span><span style="font-family:"Courier New",serif;color:#969696">class</span><span style="font-family:"Courier New",serif;color:black">
</span><span style="font-family:"Courier New",serif;color:#969696">is</span><span style="font-family:"Courier New",serif;color:black">
</span><span style="font-family:"Courier New",serif;color:#969696">required</span><span style="font-family:"Courier New",serif;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New",serif;color:black">        
</span><span style="font-family:"Courier New",serif;color:#969696">*/</span><span style="font-family:"Courier New",serif;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New",serif;color:black">       
</span><span style="font-family:"Courier New",serif;color:#336BDD">static</span><span style="font-family:"Courier New",serif;color:black">
<i>ClassHierarchyInfo</i> <b><i>ofClass</i></b>(ClassDesc superClass) {<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New",serif;color:black">           
</span><span style="font-family:"Courier New",serif;color:#336BDD">return</span><span style="font-family:"Courier New",serif;color:black">
</span><span style="font-family:"Courier New",serif;color:#336BDD">new</span><span style="font-family:"Courier New",serif;color:black"> ClassHierarchyImpl.ClassHierarchyInfoImpl(superClass);<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New",serif;color:black">        }<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New",serif;color:black">    }<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt"><br>
<br>
What should I do with my patch? Should I drop the changes to default<br>
resolver (which adds security manager suppression) and move on with<br>
the current content, or should I expand it to address all 3 planned<br>
changes (despite some of them still in drafting phase) and accomodate<br>
to the Classfile object? (We still have to decide about the default<br>
resolver fo a Classfile object, esp. whether to have one or not)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">I’m not sure why the default class hierarchy resolver should call
</span><span style="font-size:11.0pt">AccessController.doPrivileged</span><span lang="EN-US" style="font-size:11.0pt">?<o:p></o:p></span></p>
<p class="MsoNormal"><span class="pl-en"><span lang="EN-US" style="font-size:9.0pt;font-family:Menlo"><o:p> </o:p></span></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><br>
</span><span lang="EN-US" style="font-size:11.0pt">Thanks,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">Adam<o:p></o:p></span></p>
</div>
</div>
</body>
</html>