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