[ping] RFR(L): 8221470: Print methods in exception messages in java-like Syntax.

David Holmes david.holmes at oracle.com
Tue Apr 2 01:41:33 UTC 2019


Hi Goetz,

Your new test fails to compile on some systems:

error: error while writing Strange\u20ac\u00a3Named: bad filename 
RelativeFile[test/Strange\u20ac\u00a3Named.class]
class Strange\u20ac\u00a3Named {
^
1 error
result: Failed. Compilation failed: Compilation failed

This was linux-x64 - only seems to occur on Oracle Linux Server 7.1.

We also have some closed tests that also need updating so I'll need to 
coordinate with you on the push.

Thanks,
David
-----

On 2/04/2019 10:33 am, David Holmes wrote:
> Hi Goetz,
> 
> Overall this looks good to me - a few minor nits/comments below.
> 
> I've applied the patch and am running it through our internal build and 
> test system (tiers 1-3 initially).
> 
> I have a suspicion there will be other tests that need to be updated - 
> possibly even JCK tests. Discovering those a-priori will be difficult 
> (simply running all the tests would take an extremely long time). Will 
> have a discussion about how best to handle those internally.
> 
> ---
> 
> src/hotspot/share/oops/method.cpp
> 
> Please put a blank line after each new method.
> 
> ---
> 
> src/hotspot/share/oops/symbol.cpp
> 
> +       os->print(".");
> +     } else {
> +       os->print("%c", start[i]);
> 
> Please use os->put(char c) for individual characters.
> 
> -- 
> 
> The "start" name would seem better as "buf" to me.
> 
> -- 
> 
> +     } else if (start[i] == 'L') {
> +       print_class(os, start+i+1, len-i-2);
> 
> Can you insert a comment that help explains the -2:
> 
>       } else if (start[i] == 'L') {
> +      // Expected format: L<type name>;
>         print_class(os, start+i+1, len-i-2);
> 
> -- 
> 
> +   for(SignatureStream ss(this); !ss.is_done(); ss.next()) {
> 
> space after for (2 occurrences)
> 
> ---
> 
> 
> test/hotspot/jtreg/runtime/exceptionMsgs/methodPrinting/TestPrintingMethods.java 
> 
> 
> Not sure the special characters can be used directly in the sources. Can 
> they not be put in as unicode escapes at all places?
> 
> ---
> 
> Thanks,
> David
> -------
> 
> 
> On 1/04/2019 12:32 pm, David Holmes wrote:
>> Hi Goetz,
>>
>> I'm looking at this ...
>>
>> On 29/03/2019 8:26 pm, Lindenmaier, Goetz wrote:
>>> Hi,
>>>
>>> Any interest in this change?
>>
>> I'm personally of two minds here because these VM generated exceptions 
>> are not only delivered to Java source code. I'd like to know how other 
>> language developers using the JVM runtime would view this.
>>
>> That aside if you're going to make a change like this then I think the 
>> full signature string has to be quoted in some way to delineate it 
>> within the larger message.
>>
>>> Should I split it to adapt the exceptions separately one-by-one to
>>> make the change smaller and simplify the review?
>>
>> I don't think that is necessary.
>>
>> Thanks,
>> David
>> -----
>>
>>> I would propose to start out with AbstractMethodError only.
>>>
>>> Best regards,
>>>    Goetz.
>>>
>>>
>>>
>>> From: Lindenmaier, Goetz
>>> Sent: Tuesday, March 26, 2019 1:06 PM
>>> To: hotspot-runtime-dev at openjdk.java.net
>>> Subject: RFR(L): 8221470: Print methods in exception messages in 
>>> java-like Syntax.
>>>
>>> Hi,
>>>
>>> A row of exceptions are thrown from the hotspot runtime.
>>> They print methods with their JNI signatures. To increase
>>> readability and resemblance to source code, this change proposes
>>> to print them in a Java-like syntax.
>>>
>>> Some examples:
>>> current method printouts:
>>>
>>> test.TeMe3_B.ma()V
>>> test.TeMe3_B.ma(IZ[[BF)[[D
>>> test.TeMe3_B.ma([[[Ljava/lang/Object;)[[Ltest/TeMe3_B;
>>>
>>> improved format:
>>>
>>> void test.TeMe3_B.ma()
>>> double[][] test.TeMe3_B.ma(int, boolean, byte[][], float)
>>> test.TeMe3_B[][] test.TeMe3_B.ma(java.lang.Object[][][])
>>>
>>> So far, Method::name_and_sig_as_C_string() is used to print
>>> these messages.
>>>
>>> This change implements function Method::external_name() that prints 
>>> the better
>>> format.
>>> external_name() is chosen according to Klass::external_name().
>>>
>>> Printing the better format requires parsing the signature
>>> Symbol. This is implemented in
>>> void Symbol::print_as_signature_external_return_type(outputStream *os);
>>> void Symbol::print_as_signature_external_parameters(outputStream *os);
>>> These method names are chosen according to 
>>> Symbol::as_class_external_name().
>>>
>>> See this partial webrev for the new functions:
>>> http://cr.openjdk.java.net/~goetz/wr19/8221470-exMsg-signature/01-new_methods/ 
>>>
>>>
>>> Also, I changed a lot of exception messages to use the new format.
>>> This required to adapt a row of tests. I added a test to check
>>> the signature printing does not regress.  For all these changes, see
>>> the full webrev:
>>> http://cr.openjdk.java.net/~goetz/wr19/8221470-exMsg-signature/01/
>>>
>>> I hope I detected all places where method signatures are printed to
>>> exception messages.
>>>
>>> Best regards,
>>>    Goetz.
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>


More information about the hotspot-runtime-dev mailing list