RFR: 8298065: Provide more information in message of NoSuchFieldError [v4]

Matias Saavedra Silva matsaave at openjdk.org
Fri Dec 23 21:39:49 UTC 2022


On Fri, 23 Dec 2022 18:17:12 GMT, Matias Saavedra Silva <matsaave at openjdk.org> wrote:

>> src/hotspot/share/runtime/signature.cpp line 455:
>> 
>>> 453:       strncat(buf, "[]", strlen(buf));
>>> 454:       buf[strlen(buf)] = '\0';
>>> 455:     }
>> 
>> Java array dimensions can be up to 255, so the `buf` is not long enough.
>> 
>> Anyway, I think we already have code that can translate a signature like `[I` to the source code form of `int []`. Try this:
>> 
>> 
>> super class Foofoo
>> 	version 63:0
>> {
>>   public static Method main:"([Ljava/lang/String;)V"
>> 	stack 30 locals 3
>>   {
>>                 iconst_0;
>>                 iconst_0;
>>                 aconst_null;
>> 		invokestatic	Method "xxx":"(II[I)V";
>> 		return;
>>   }
>> } 
>> 
>> $ java -cp . Foofoo
>> Exception in thread "main" java.lang.NoSuchMethodError: 'void Foofoo.xxx(int, int, int[])'
>> 	at Foofoo.main(Foofoo.jasm)
>> 
>> 
>> Writing such conversion is very difficult. You should try to use the existing code (refactoring it as necessary).
>
> After a while of searching I was unable to find anything that could easily provide this type of information. The closest example is Signature::print_as_signature_external_return_type, but this does not work with fields.

Ignore my above comment, I found a way to rework a method in symbol.cpp to accomplish the same task more safely. Thank you for this!

-------------

PR: https://git.openjdk.org/jdk/pull/11745


More information about the hotspot-runtime-dev mailing list