[MVT] Issues with VDEFAULT + VWITHFIELD

Remi Forax forax at univ-mlv.fr
Thu Aug 24 20:18:51 UTC 2017


With the following base code

@jvm/internal/value/ValueCapableClass
public final class Test {
  private final int value;

  public java.lang.String toString();
    Code:
       0: aload_0
       1: getfield      #11                 // Field value:I
       4: invokedynamic #23,  0             // InvokeDynamic #0:makeConcatWithConstants:(I)Ljava/lang/String;
       9: areturn

  public static void main(java.lang.String[]);
    Code:
       0: vdefault      #27                 // class ";QTest;"
       3: iconst_3
       4: vwithfield    #28                 // Field ";QTest;".value:I
       7: vstore        1
       9: getstatic     #34                 // Field java/lang/System.out:Ljava/io/PrintStream;
      12: vload         1
      14: vbox          #2                  // class Test
      17: invokevirtual #40                 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      20: return
}


for all the test, mvt/Test is the value capable class and ;Qmvt/Test$Value; is the corresponding value type.

1. using VDEFAULT with the clas ref and not the value type ref is allowed (at least with the product VM)
   VDEFAULT "mvt/Test" 

2. worst, you can then call VWITHFIELD, it works again !
   VDEFAULT "mvt/Test"
   ICONST_3
   VWITHFIELD, "mvt/Test", "value", "I")

3. if the field 'value' is private (final),
   the following code raises an IllegalAccessError
   VDEFAULT ;Qmvt/Test$Value;
   ICONST_3
   VWITHFIELD, ;Qmvt/Test$Value; value I

   Exception in thread "main" java.lang.IllegalAccessError: tried to access field mvt.Test$Value.value from class mvt.Test

   Does the MVT support nestmates ??   
   
4. same code as above, but with the field 'value' declared package private or public.
   Note that mvt/Test and ;Qmvt/Test$Value; should be in the same package.
   
   Exception in thread "main" java.lang.IllegalAccessError: Update to non-static final field mvt.Test$Value.value attempted from a different class (mvt.Test) than the field's declaring class
	at mvt.Test.main(Unknown Source)

   so i do not know how i can use VWITHFIELD ?

cheers,
Rémi



More information about the valhalla-dev mailing list