Indirect specialized calls
Remi Forax
forax at univ-mlv.fr
Tue Sep 23 15:13:08 UTC 2014
On 09/23/2014 03:44 PM, Maurizio Cimadamore wrote:
> In itself, the bytecode looks good. This seems caused by the fact that
> the specializer is not specializing the static arguments in the
> bootstrap method. If you run the example with this useful option (thx
> Brian!):
>
> -Dvalhalla.dumpProxyClasses=path_to_specialized_classes
>
> The specializer will dump all classes on a given folder. I did that
> and javap'ed the specialized class SpecializationTest$Nested${0=I} and
> found the following code for 'call':
>
> public int call(SpecializationTest${0=I});
> descriptor: (LSpecializationTest${0=I};)I
> flags: ACC_PUBLIC
> Code:
> stack=1, locals=2, args_size=2
> 0: aload_1
> 1: invokedynamic #46, 0 // InvokeDynamic
> #0:get:(LSpecializationTest;)Ljava/lang/Object;
> 6: ireturn
> Signature: #29 //
> (LSpecializationTest${0=I};)I
> }
> BootstrapMethods:
> 0: #38 invokestatic
> java/lang/invoke/GenericMethodSpecializer.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
> Method arguments:
> #43 invokestatic
> SpecializationTest.get:(LSpecializationTest;)Ljava/lang/Object;
> #45 TTT;
>
> As yo can see, the BSM attribute in the specialized class has a bad
> method handle - it says get(LSpecializationTest) where it should
> probably say get(LSpecializationTest{0=I}) - hence the error. We are
> working towards hunting those bugs down.
>
> Thanks
> Maurizio
I think you have a similar issue with lambdas.
Rémi
>
> On 23/09/14 14:09, Jan Lahoda wrote:
>> Hello,
>>
>> While experimenting with accessors to private specialized fields, I
>> ran across a case where javac produces a classfile that crashes at
>> runtime (on a custom build from valhalla forest). I apologize if this
>> is a known problem, or if I am doing something wrong.
>>
>> The code is like this:
>> ---
>> public class SpecializationTest<any T> {
>>
>> public T i;
>>
>> public static <any TT> TT get(SpecializationTest<TT> t) {
>> return t.i;
>> }
>>
>> public static void main(String[] args) {
>> Nested.main(args);
>> }
>>
>> public static class Nested<any TT> {
>> public static void main(String[] args) {
>> SpecializationTest<int> v = new SpecializationTest<>();
>>
>> new Nested<int>().call(v);
>> }
>> public TT call(SpecializationTest<TT> v) {
>> return get(v);
>> }
>> }
>> }
>> ---
>>
>> The output of javap for the compiled classes is attached.
>>
>> Running the compiled class leads to:
>> ---
>> Specializing SpecializationTest${0=I}; searching for
>> SpecializationTest.class (not found)
>> Specializing SpecializationTest${0=I}; searching for
>> SpecializationTest.class (found)
>> Specializing SpecializationTest$Nested${0=I}; searching for
>> SpecializationTest$Nested.class (not found)
>> Specializing SpecializationTest$Nested${0=I}; searching for
>> SpecializationTest$Nested.class (found)
>> Specializing (LSpecializationTest;)Ljava/lang/Object; to
>> (LSpecializationTest${0=I};)I
>> Exception in thread "main" java.lang.VerifyError: Bad type on operand
>> stack
>> Exception Details:
>> Location:
>> SpecializationTest$Nested${0=I}.call(LSpecializationTest${0=I};)I @1:
>> invokedynamic
>> Reason:
>> Type 'SpecializationTest${0=I}' (current frame, stack[0]) is not
>> assignable to 'SpecializationTest'
>> Current Frame:
>> bci: @1
>> flags: { }
>> locals: { 'SpecializationTest$Nested${0=I}',
>> 'SpecializationTest${0=I}' }
>> stack: { 'SpecializationTest${0=I}' }
>> Bytecode:
>> 0000000: 2bba 002e 0000 ac
>>
>> at SpecializationTest$Nested.main(SpecializationTest.java:17)
>> at SpecializationTest.main(SpecializationTest.java:10)
>> ---
>>
>> Any idea what is wrong?
>>
>> Thanks,
>> Jan
>
More information about the valhalla-dev
mailing list