<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<font size="4"><font face="monospace">This is a good first step. In
fact, I was just tinkering with a similar patch -- I'll send you
what I've got. More inline. <br>
</font></font><br>
<div class="moz-cite-prefix">On 3/22/2023 2:55 PM, Adam Sotona
wrote:<br>
</div>
<blockquote type="cite" cite="mid:CY4PR1001MB21503CBC6EBBFFD40D4334D98C869@CY4PR1001MB2150.namprd10.prod.outlook.com">
<meta name="Generator" content="Microsoft Word 15 (filtered
medium)">
<style>@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}@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:Consolas;
panose-1:2 11 6 9 2 2 4 3 2 4;}p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
font-size:10.0pt;
font-family:"Calibri",sans-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:10.0pt;
font-family:"Calibri",sans-serif;}.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;}div.WordSection1
{page:WordSection1;}ol
{margin-bottom:0cm;}ul
{margin-bottom:0cm;}</style>
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US">Based on the discussion in this thread I
propose to make a first step and adjust ClassHierarchy
factory methods following way:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US"><o:p> </o:p></span></p>
<ul style="margin-top:0cm" type="disc">
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l0 level1 lfo1"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US">ofCached(ClassHierarchyResolver resolver)</span></li>
</ul>
</div>
</blockquote>
<br>
Yes, caching should be something that is wrapped around a CHR, not
complected with resource parsing. The one thing we lose is the
optimization where we opportunistically infer that a class is an
interface if we discover it in the `implements` section of a
classfile -- but I don't mind saying goodbye to that optimization.
<br>
<br>
<blockquote type="cite" cite="mid:CY4PR1001MB21503CBC6EBBFFD40D4334D98C869@CY4PR1001MB2150.namprd10.prod.outlook.com">
<div class="WordSection1">
<ul style="margin-top:0cm" type="disc">
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l0 level1 lfo1"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US">ofClassLoading(ClassLoader loader)<o:p></o:p></span></li>
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l0 level1 lfo1"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US">ofResourceParsing(ClassLoader loader)<o:p></o:p></span></li>
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l0 level1 lfo1"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US">ofParsing(Function<ClassDesc,
InputStream> classStreamResolver)</span></li>
</ul>
</div>
</blockquote>
<br>
How do these last two differ? <br>
<br>
<blockquote type="cite" cite="mid:CY4PR1001MB21503CBC6EBBFFD40D4334D98C869@CY4PR1001MB2150.namprd10.prod.outlook.com">
<div class="WordSection1">
<ul style="margin-top:0cm" type="disc">
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l0 level1 lfo1"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US">of(MethodHandles.Lookup lookup)<o:p></o:p></span></li>
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l0 level1 lfo1"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US">of(Collection<ClassDesc> interfaces,
Map<ClassDesc, ClassDesc> classToSuperClass)<o:p></o:p></span></li>
</ul>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US">So the default can be defined as:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US">DEFAULT_CLASS_HIERARCHY_RESOLVER =
ofCached(ofResourceParsing(ClassLoader.getSystemClassLoader()).orElse(ofClassLoading(ClassLoader.getSystemClassLoader())));</span></p>
</div>
</blockquote>
<br>
I recommend making one more step: turn the static default field into
a factory:<br>
<div style="background-color:#ffffff;color:#000000;font-family:'JetBrains
Mono',monospace;font-size:11.3pt;">
<pre><span style="color:#000080;font-weight:bold;">static </span>ClassHierarchyResolver standardResolver() {
<span style="color:#000080;font-weight:bold;">return </span>ClassHierarchyResolver.<span style="font-style:italic;">ofCached</span>(ClassHierarchyResolver.<span style="font-style:italic;">ofResource</span>(
<span style="color:#000080;font-weight:bold;">new </span>Function<ClassDesc, InputStream>() {
<span style="color:#808000;">@Override
</span><span style="color:#808000;"> </span><span style="color:#000080;font-weight:bold;">public </span>InputStream apply(ClassDesc classDesc) {
<span style="color:#000080;font-weight:bold;">return </span>ClassLoader.<span style="font-style:italic;">getSystemResourceAsStream</span>(Util.<span style="font-style:italic;">toInternalName</span>(classDesc) + <span style="color:#008000;font-weight:bold;">".class"</span>);
}
}));
}
Also, I think ofCached() should optionally let you specify a Map factory; some users might prefer a bound LHM, or to forego
the synchronization if they know use will be single-threaded:
CHR ofCached(CHR)
CHR ofCached(CHR, Supplier<Map<ClassDesc, ClassHiearchyInfo>>)
</pre>
</div>
<br>
<br>
<blockquote type="cite" cite="mid:CY4PR1001MB21503CBC6EBBFFD40D4334D98C869@CY4PR1001MB2150.namprd10.prod.outlook.com">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US">Please help me to polish exact methods naming.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US">Thank you,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US">Adam<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
</div>
</blockquote>
<br>
</body>
</html>