Array initializer aastores missing BMAs
Brian Goetz
brian.goetz at oracle.com
Sat Jan 10 20:46:02 UTC 2015
Good catch. The specialized *should* be ready to act on these if they
are present, so hopefully this is a compiler-only fix.
On 1/10/2015 12:50 PM, Peter Levart wrote:
> Hi,
>
> The following:
>
> public class Pair<any A> {
>
> A[] array;
>
> public Pair(A v1, A v2) {
> array = new A[]{v1, v2};
> }
> }
>
> vs.
>
> public class Pair<any A> {
>
> A[] array;
>
> public Pair(A v1, A v2) {
> array = new A[2];
> array[0] = v1;
> array[1] = v2;
> }
> }
>
> Produces the following constructor:
>
> public Pair(A, A);
> descriptor: (Ljava/lang/Object;Ljava/lang/Object;)V
> flags: ACC_PUBLIC
> Code:
> stack=5, locals=3, args_size=3
> 0: aload_0
> 1: invokespecial #1 // Method
> java/lang/Object."<init>":()V
> 4: aload_0
> 5: iconst_2
> 6: anewarray #2 // class java/lang/Object
> 9: dup
> 10: iconst_0
> 11: aload_1
> 12: aastore
> 13: dup
> 14: iconst_1
> 15: aload_2
> 16: aastore
> 17: putfield #3 // Field
> array:[Ljava/lang/Object;
> 20: return
> LineNumberTable:
> line 8: 0
> line 9: 4
> line 10: 20
> BytecodeMapping:
> Code_idx Signature
> 6: [TA;
> 11: TA;
> 15: TA;
> 17: LPair<TA;>;::[TA;
> Signature: #25 // (TA;TA;)V
>
> vs.
>
> public Pair(A, A);
> descriptor: (Ljava/lang/Object;Ljava/lang/Object;)V
> flags: ACC_PUBLIC
> Code:
> stack=3, locals=3, args_size=3
> 0: aload_0
> 1: invokespecial #1 // Method
> java/lang/Object."<init>":()V
> 4: aload_0
> 5: iconst_2
> 6: anewarray #2 // class java/lang/Object
> 9: putfield #3 // Field
> array:[Ljava/lang/Object;
> 12: aload_0
> 13: getfield #3 // Field
> array:[Ljava/lang/Object;
> 16: iconst_0
> 17: aload_1
> 18: aastore
> 19: aload_0
> 20: getfield #3 // Field
> array:[Ljava/lang/Object;
> 23: iconst_1
> 24: aload_2
> 25: aastore
> 26: return
> LineNumberTable:
> line 8: 0
> line 9: 4
> line 10: 12
> line 11: 19
> line 12: 26
> BytecodeMapping:
> Code_idx Signature
> 6: [TA;
> 9: LPair<TA;>;::[TA;
> 13: LPair<TA;>;::[TA;
> 17: TA;
> 18: TA;
> 20: LPair<TA;>;::[TA;
> 24: TA;
> 25: TA;
> Signature: #25 // (TA;TA;)V
>
>
>
> Seems like aastore(s) at BCI(s) 12 & 16 are missing BMA(s) in the
> variant using array initializer...
>
>
> Regards, Peter
>
> On 01/10/2015 03:20 PM, Peter Levart wrote:
>>
>> On 01/09/2015 10:44 PM, brian.goetz at oracle.com wrote:
>>> Changeset: 7a3e4270521d
>>> Author: briangoetz
>>> Date: 2015-01-09 16:44 -0500
>>> URL:http://hg.openjdk.java.net/valhalla/valhalla/jdk/rev/7a3e4270521d
>>>
>>> Fix specializer bug reported by Peter Levart related to improper handling of not-fully-instantiated class literals
>>>
>>> ! src/java.base/share/classes/valhalla/specializer/Specializer.java
>>> ! test/valhalla/test/valhalla/specializer/GenericMethodsTest.java
>>>
>>
>> Thanks, I have another one. This time I think there's a problem with
>> array initializer in specialized code:
>>
>> public class Pair<any T> {
>>
>> T[] array;
>>
>> public Pair(T v1, T v2) {
>> array = new T[]{v1, v2};
>> System.out.println("Ok for " + getClass());
>> }
>>
>> public static void main(String[] args) {
>> new Pair<String>("aaa", "bbb");
>> new Pair<int>(1, 2);
>> new Pair<float>(1.1f, 2.2f);
>> }
>> }
>>
>>
>> This is the runtime failure:
>>
>> Ok for class Pair
>> Specializing Pair${0=I}; searching for Pair.class (not found)
>> Specializing Pair${0=I}; searching for Pair.class (found)
>> Exception in thread "main" java.lang.VerifyError: Bad type on operand
>> stack
>> Exception Details:
>> Location:
>> Pair${0=I}.<init>(II)V @11: aastore
>> Reason:
>> Type integer (current frame, stack[4]) is not assignable to
>> 'java/lang/Object'
>> Current Frame:
>> bci: @11
>> flags: { }
>> locals: { 'Pair${0=I}', integer, integer }
>> stack: { 'Pair${0=I}', '[I', '[I', integer, integer }
>> Bytecode:
>> 0000000: 2ab7 000d 2a05 bc0a 5903 1b53 5904 1c53
>> 0000010: b500 0fb2 0015 bb00 1759 b700 1812 1ab6
>> 0000020: 001e 2ab6 0022 b600 25b6 0029 b600 2fb1
>> 0000030:
>>
>> at Pair.main(Pair.java:15)
>>
>>
>> Regards, Peter
>>
>
More information about the valhalla-dev
mailing list