<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<font size="4" face="monospace">In addition, we should look into
making the error mode more obvious; an IAE like this one looks
very much like an internal bug. It would be good if the exception
was (a) a more specific type of exception, and (b) had more detail
of the sort "I needed class hierarchy information for X but it
wasn't provided."</font><br>
<br>
<div class="moz-cite-prefix">On 4/29/2024 3:54 AM, Adam Sotona
wrote:<br>
</div>
<blockquote type="cite" cite="mid:DS0PR10MB6847ACBEEC8652CF7B897DDD8C1B2@DS0PR10MB6847.namprd10.prod.outlook.com">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style>@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}@font-face
{font-family:Aptos;
panose-1:2 11 0 4 2 2 2 2 2 4;}p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
font-size:12.0pt;
font-family:"Aptos",sans-serif;}a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#467886;
text-decoration:underline;}span.EmailStyle18
{mso-style-type:personal-reply;
font-family:"Aptos",sans-serif;
color:windowtext;}.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;
mso-ligatures:none;}div.WordSection1
{page:WordSection1;}</style>
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt">Your
compiler reached the complexity where you reference
generated classes from other generated classes.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">Class-File
API in certain circumstances needs to know some information
about the classes referenced from the generated bytecode.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">Such
information is provided in
<a href="https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/lang/classfile/ClassHierarchyResolver.ClassHierarchyInfo.html" moz-do-not-send="true">
ClassHierarchyInfo</a> using functional interface <a href="https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/lang/classfile/ClassHierarchyResolver.html" moz-do-not-send="true">
ClassHierarchyResolver</a>.<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">By <a href="https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/lang/classfile/ClassHierarchyResolver.html#defaultResolver()" moz-do-not-send="true">
default</a> is the information obtained from system class
loader. However, the classes you generate are probably not
yet known to the system class loader.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">You should
specify a custom <a href="https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/lang/classfile/ClassHierarchyResolver.html" moz-do-not-send="true">
ClassHierarchyResolver</a> for your compiler as a
Class-File API option
`ClassFile.of(ClassFile.ClassHierarchyResolverOption.of(...))`.<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">Here you
have multiple options how to provide the missing information
using combinations of ClassHierarchyResolver factory methods
and custom code:<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">For example,
if the required classes have been already generated and you
can provide a physical access to them, you can compose the
ClassHierarchyResolver this way:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">`ClassHierarchyResolver.defaultResolver().orElse(ClassHierarchyResolver.</span>
<span style="font-size:11.0pt">ofResourceParsing(Function<ClassDesc,
InputStream>).cached())`<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">Or if you
know all the generated classes in advance, you can provide
the missing info about the generated classes in a set and
map form:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">`ClassHierarchyResolver.defaultResolver().orElse(ClassHierarchyResolver.</span>
<span style="font-size:11.0pt">of(Collection<ClassDesc>
interfaces, Map<ClassDesc, ClassDesc>
classToSuperClass))`
<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">Or in a form
of dynamic direct implementation of the
ClassHierarchyResolver:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">`ClassHierarchyResolver.defaultResolver().orElse(classDesc
-> isInterface ? : ClassHierarchyInfo.ofInterface() :
ClassHierarchyInfo.ofClass(ClassDesc superClass))`<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"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<div id="mail-editor-reference-message-container">
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" style="margin-bottom:12.0pt"><b><span style="color:black">From:
</span></b><span style="color:black">classfile-api-dev
<a class="moz-txt-link-rfc2396E" href="mailto:classfile-api-dev-retn@openjdk.org"><classfile-api-dev-retn@openjdk.org></a> on behalf
of Øystein Myhre Andersen <a class="moz-txt-link-rfc2396E" href="mailto:o.myhre@gmail.com"><o.myhre@gmail.com></a><br>
<b>Date: </b>Sunday, 28 April 2024 at 12:53<br>
<b>To: </b><a class="moz-txt-link-abbreviated" href="mailto:classfile-api-dev@openjdk.org">classfile-api-dev@openjdk.org</a>
<a class="moz-txt-link-rfc2396E" href="mailto:classfile-api-dev@openjdk.org"><classfile-api-dev@openjdk.org></a><br>
<b>Subject: </b>Got: IllegalArgumentException: Could
not resolve class<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal">I'm writing a compiler for Simula
(the very first oo language).<br>
Simula is block-oriented with nested blocks and each
block is compiled into a classFile.<br>
At a certain level in the hierarchy I get an exception
at the end of the classfile building.<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Exception in thread "main"
java.lang.IllegalArgumentException:<br>
Could not resolve class
adHoc000_adHoc000_PBLK39_Floor_activateIdleLift<br>
<br>
at
java.base/jdk.internal.classfile.impl.ClassHierarchyImpl.resolve(ClassHierarchyImpl.java:75)<br>
at
java.base/jdk.internal.classfile.impl.ClassHierarchyImpl.isInterface(ClassHierarchyImpl.java:85)<br>
at
java.base/jdk.internal.classfile.impl.StackMapGenerator$Type.mergeReferenceFrom(StackMapGenerator.java:1363)<br>
at
java.base/jdk.internal.classfile.impl.StackMapGenerator$Type.mergeFrom(StackMapGenerator.java:1331)<br>
at
java.base/jdk.internal.classfile.impl.StackMapGenerator$Frame.merge(StackMapGenerator.java:1193)<br>
at
java.base/jdk.internal.classfile.impl.StackMapGenerator$Frame.checkAssignableTo(StackMapGenerator.java:1135)<br>
at
java.base/jdk.internal.classfile.impl.StackMapGenerator.checkJumpTarget(StackMapGenerator.java:280)<br>
at
java.base/jdk.internal.classfile.impl.StackMapGenerator.processExceptionHandlerTargets(StackMapGenerator.java:678)<br>
at
java.base/jdk.internal.classfile.impl.StackMapGenerator.processBlock(StackMapGenerator.java:667)<br>
at
java.base/jdk.internal.classfile.impl.StackMapGenerator.processMethod(StackMapGenerator.java:440)<br>
at
java.base/jdk.internal.classfile.impl.StackMapGenerator.generate(StackMapGenerator.java:317)<br>
at
java.base/jdk.internal.classfile.impl.StackMapGenerator.<init>(StackMapGenerator.java:243)<br>
at
java.base/jdk.internal.classfile.impl.StackMapGenerator.of(StackMapGenerator.java:156)<br>
at
java.base/jdk.internal.classfile.impl.DirectCodeBuilder$4.generateStackMaps(DirectCodeBuilder.java:331)<br>
at
java.base/jdk.internal.classfile.impl.DirectCodeBuilder$4.tryGenerateStackMaps(DirectCodeBuilder.java:340)<br>
at
java.base/jdk.internal.classfile.impl.DirectCodeBuilder$4.writeBody(DirectCodeBuilder.java:382)<br>
at
java.base/jdk.internal.classfile.impl.UnboundAttribute$AdHocAttribute.writeTo(UnboundAttribute.java:914)<br>
at
java.base/jdk.internal.classfile.impl.AttributeHolder.writeTo(AttributeHolder.java:56)<br>
at
java.base/jdk.internal.classfile.impl.DirectMethodBuilder.writeTo(DirectMethodBuilder.java:156)<br>
at
java.base/jdk.internal.classfile.impl.BufWriterImpl.writeList(BufWriterImpl.java:207)<br>
at
java.base/jdk.internal.classfile.impl.DirectClassBuilder.build(DirectClassBuilder.java:181)<br>
at
java.base/jdk.internal.classfile.impl.ClassFileImpl.build(ClassFileImpl.java:114)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">... ...<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><br>
Is this a known problem?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">What am I doing wrong?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I am attaching a file with an
edited trace leading up to the exception.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">- Øystein Myhre Andersen<o:p></o:p></p>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
</body>
</html>