RFR: 8338532: Speed up the ClassFile API MethodTypeDesc#ofDescriptor

Chen Liang liach at openjdk.org
Mon Aug 19 06:32:25 UTC 2024


On Sat, 17 Aug 2024 12:25:58 GMT, Shaojin Wen <duke at openjdk.org> wrote:

>> src/java.base/share/classes/jdk/internal/constant/MethodTypeDescImpl.java line 113:
>> 
>>> 111:                 || (rightBracket = (descriptor.charAt(1) == ')' ? 1 : descriptor.lastIndexOf(')'))) <= 0
>>> 112:                 || (len = descriptor.length() - rightBracket - 1) == 0
>>> 113:                 || (len != 1 && len != ConstantUtils.skipOverFieldSignature(descriptor, rightBracket + 1, descriptor.length()))
>> 
>> Has this be tested against input values like `()A`? I would prefer to fail explicitly with `descriptor.charAt(rightBracket + 1) == 'V'` instead of using `len != 1` and relying on `Wrapper.forBasicType`.
>
> I have tested that `()A` will report an error. If length == 1, rely on Wrapper.forBasicType to detect illegal input.

We just exposed an internal exception behavior to public. Might add in wrapper.forBasicType that this IAE is part of public API.

>> src/java.base/share/classes/jdk/internal/constant/MethodTypeDescImpl.java line 158:
>> 
>>> 156:             }
>>> 157:             if (len == 0) {
>>> 158:                 len = ConstantUtils.skipOverFieldSignature(descriptor, cur, end);
>> 
>> This can use a simpler version of skip that doesn't validate, like:
>> 
>> int start = cur;
>> while (descriptor.charAt(cur) == '[') {
>>     cur++;
>> }
>> if (descriptor.charAt(cur++) == 'L') {
>>     cur = descriptor.indexOf(';', cur) + 1;
>> }
>> paramTypes[paramIndex++] = ConstantUtils.resolveClassDesc(descriptor, start, cur - start);
>
> Now this version merges the loops, your suggestion doesn't handle paramIndex >= 8, and it won't be faster, the current version of skipOverFieldSignature performs well enough.

Hmm? I mean this block can be a new method (the cur pointer moving part) and replace existing skipOver call that does extra validation

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

PR Review Comment: https://git.openjdk.org/jdk/pull/20611#discussion_r1720770934
PR Review Comment: https://git.openjdk.org/jdk/pull/20611#discussion_r1720771392


More information about the core-libs-dev mailing list