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:10:10 UTC 2013
On 11/06/2013 11:37 AM, Remi Forax wrote:
> On 11/05/2013 11:11 AM, Joel Borggrén-Franck wrote:
>> On 5 nov 2013, at 10:51, Peter Levart <peter.levart at gmail.com> wrote:
>>
>>> On 11/05/2013 10:33 AM, Joel Borggrén-Franck wrote:
>>>>>> I would also restructure the Method/Constructor accessor logic
>>>>>> differently. The check for ReflectUtil.isVMAnonymousClass() can
>>>>>> be performed just once (in the
>>>>>> newMethodAccessor/newConstructorAccessor methods) and based on
>>>>>> this check, create accessor:
>>>>>>
>>>>>> - for classic declaring class - as is / unchanged
>>>>>> - for anonymous declaring class - just create and return
>>>>>> NativeMethodAccessorImpl without a parent
>>>>>>
>>>>>> Then in NativeMethodAccessorImpl (and same for constructor),
>>>>>> modify the inflation checking logic:
>>>>>>
>>>>>> if (parent != null && ++numInvocations >
>>>>>> ReflectionFactory.inflationThreshold()) {
>>>>>> MethodAccessorImpl acc = (MethodAccessorImpl)
>>>>>> new MethodAccessorGenerator().
>>>>>> generateMethod(method.getDeclaringClass(),
>>>>>> method.getName(),
>>>>>> method.getParameterTypes(),
>>>>>> method.getReturnType(),
>>>>>> method.getExceptionTypes(),
>>>>>> method.getModifiers());
>>>>>> parent.setDelegate(acc);
>>>>>> }
>>>> I don't like adding even more special cases to this check. IMHO a
>>>> better way that we discussed and rejected, opting for a smaller
>>>> change, is to create a NonInflatingMethodAccessor and just drop in
>>>> one of those without a delegate for when creating the accessor for
>>>> methods/ctors on anonymous classes.
>>> Even better. I would name the new class NativeMethodAccessorImpl and
>>> the one doing inflation InflatingNativeMethodAccessorImpl which
>>> would extend NativeMethodAccessorImpl, override invoke() and call
>>> super.invoke()... This way, no native methods duplication is needed.
>>> invoke() is already an interface method with 2 implementations. Now
>>> it will have 3. Does this present any difference for dispatch
>>> optimization?
>>>
>> FWIW i think the magic number is 4, but I don't know where I got
>> that. Anyhow, this might be slightly controversial, but for all code
>> I care about (reflective invocation of methods/ctors on
>> non-VM-anonymous classes) the check happens exactly once as is.
>
> No, the magic number is 2 (by default),
> you can look for TypeProfileWidth in the vm code.
I forgot that each generated method accessor is a separate class with a
separate method. So the number of implementations is already much more
than 2 today...
Regards, Peter
>
> regards,
> Rémi
>
More information about the core-libs-dev
mailing list