hg: jdk8/tl/jdk: 7194897: JSR 292: Cannot create more than 16 instances of an anonymous class; ...

Peter Levart peter.levart at gmail.com
Wed Nov 6 19:30:25 UTC 2013


On 11/05/2013 10:10 AM, Brian Goetz wrote:
> Ineexof(char) sounds like as fast and simpler?

Well, indexOf(char) or lastIndexOf(char) searches for a single char. We 
can do better searching backwards for two chars at the same time.

If the "name" of VM-anonymous class is always ending with pattern: 
"slash followed by some decimal digits" then the following would be even 
faster:

     public static boolean isVMAnonymousClassFAST(Class<?> cls) {
         String name = cls.getName();
         for (int i = name.length() - 1; i >= 0; i--) {
             char c = name.charAt(i);
             if (c == '/') return true;
             if (c < '0' || c > '9') return false;
         }
         return false;
     }

Regards, Peter

>
> Sent from my iPhone
>
> On Nov 5, 2013, at 8:55 AM, Peter Levart <peter.levart at gmail.com 
> <mailto:peter.levart at gmail.com>> wrote:
>
>> On 11/04/2013 07:12 PM, robert.field at oracle.com wrote:
>>> Changeset: 51b002381b35
>>> Author:    rfield
>>> Date:      2013-11-04 10:12 -0800
>>> URL:http://hg.openjdk.java.net/jdk8/tl/jdk/rev/51b002381b35
>>>
>>> 7194897: JSR 292: Cannot create more than 16 instances of an anonymous class
>>> 8027681: Lambda serialization fails once reflection proxy generation kicks in
>>> Reviewed-by: ksrini, briangoetz, jfranck
>>> Contributed-by:joel.franck at oracle.com,brian.goetz at oracle.com,robert.field at oracle.com
>>>
>>> ! src/share/classes/sun/reflect/NativeConstructorAccessorImpl.java
>>> ! src/share/classes/sun/reflect/NativeMethodAccessorImpl.java
>>> ! src/share/classes/sun/reflect/misc/ReflectUtil.java
>>> + test/java/lang/invoke/lambda/RepetitiveLambdaSerialization.java
>>> ! test/java/util/stream/test/org/openjdk/tests/java/lang/invoke/SerializedLambdaTest.java
>>> + test/sun/reflect/AnonymousNewInstance/ManyNewInstanceAnonTest.java
>>>
>> Hi Robert,
>>
>> I also propose a much faster variant of:
>>
>> + /**
>> + * Checks if {@code Class cls} is a VM-anonymous class
>> + * as defined by {@link sun.misc.Unsafe#defineAnonymousClass}
>> + * (not to be confused with a Java Language anonymous inner class).
>> + */
>> + public static boolean isVMAnonymousClass(Class<?> cls) {
>> + return cls.getSimpleName().contains("/");
>> + }
>>
>>
>> The following:
>>
>>     public static boolean isVMAnonymousClassFAST(Class<?> cls) {
>>         String name = cls.getName();
>>         for (int i = name.length() - 1; i >= 0; i--) {
>>             char c = name.charAt(i);
>>             if (c == '.') return false;
>>             if (c == '/') return true;
>>         }
>>         return false; // root package
>>     }
>>
>> It's about 12..25x faster for typical class names and doesn't produce 
>> any garbage.
>>
>>
>> Regards, Peter
>>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/security-dev/attachments/20131106/af56a34a/attachment.htm>


More information about the security-dev mailing list