On Tue, 20 Sep 2022 16:54:27 GMT, Paul Sandoz <[email protected]> wrote:
>> Parsing performance of `j.l.c.MethodTypeDescriptor::ofDescriptor` can be
>> significantly improved and add performance boost to intensive users.
>>
>> Two main reasons have been identified and fixed in this patch:
>>
>> First glitch is late insertion of return type to the first position of
>> `j.u.ArrayList`, causing all previously parsed parameter types to shift
>> using `System::arraycopy`.
>>
>> Proposed patch inserts a placeholder for the return type first and replaces
>> it with return type later.
>>
>> Second performance degradation is in
>> `MethodTypeDescriptor::skipOverFieldSignature`, where each identified class
>> descriptor is exactly located by `String::indexOf`, extracted by
>> `String::substring`, and passed for for the purpose of verification to
>> `ConstantUtils::verifyUnqualifiedClassName`.
>>
>> Proposed patch inlines the unqualified class name verification into
>> `ConstantUtils::skipOverFieldSignature` parsing loop and so eliminates calls
>> of `String::indexOf` and `String::substring`. Package private method
>> `ConstantUtils::verifyUnqualifiedClassName` has no other use within the
>> package, so it is removed.
>>
>> Please review proposed performance improving patch.
>>
>> Thanks,
>> Adam
>
> src/java.base/share/classes/java/lang/constant/ConstantUtils.java line 217:
>
>> 215: }
>> 216: case '/' -> {
>> 217: if (!legal) return 0;
>
> IIUC that works to reject `//` and trailing `/`, but does not reject leading
> `/`? which the previous code rejected.
`legal` is initially set to false, so leading `/` is also rejected
-------------
PR: https://git.openjdk.org/jdk/pull/10358