Array initializer aastores missing BMAs
Peter Levart
peter.levart at gmail.com
Sat Jan 10 17:50:46 UTC 2015
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