< prev index next >

test/hotspot/jtreg/compiler/valhalla/valuetypes/TestUnloadedValueTypeField.java

Print this page

*** 25,52 **** * @test * @library /test/lib * @summary Test the handling of fields of unloaded value classes. * @compile -XDallowWithFieldOperator hack/GetUnresolvedValueFieldWrongSignature.java * @compile -XDallowWithFieldOperator TestUnloadedValueTypeField.java ! * @run main/othervm -XX:+EnableValhalla -Xcomp * -XX:CompileCommand=compileonly,TestUnloadedValueTypeField::test1 * -XX:CompileCommand=compileonly,TestUnloadedValueTypeField::test2 * -XX:CompileCommand=compileonly,GetUnresolvedValueFieldWrongSignature::test3 * -XX:CompileCommand=compileonly,TestUnloadedValueTypeField::test4 * -XX:CompileCommand=compileonly,TestUnloadedValueTypeField::test5 * TestUnloadedValueTypeField */ import jdk.test.lib.Asserts; public class TestUnloadedValueTypeField { static public void main(String[] args) { test1_verifier(); test2_verifier(); test3_verifier(); test4_verifier(); test5_verifier(); } // Test case 1: // The value type field class has been loaded, but the holder class has not been loaded. // --- 25,61 ---- * @test * @library /test/lib * @summary Test the handling of fields of unloaded value classes. * @compile -XDallowWithFieldOperator hack/GetUnresolvedValueFieldWrongSignature.java * @compile -XDallowWithFieldOperator TestUnloadedValueTypeField.java ! * @run main/othervm -XX:+EnableValhalla -Xcomp -XX:+Inline * -XX:CompileCommand=compileonly,TestUnloadedValueTypeField::test1 + * -XX:CompileCommand=print,TestUnloadedValueTypeField::test1 * -XX:CompileCommand=compileonly,TestUnloadedValueTypeField::test2 * -XX:CompileCommand=compileonly,GetUnresolvedValueFieldWrongSignature::test3 * -XX:CompileCommand=compileonly,TestUnloadedValueTypeField::test4 * -XX:CompileCommand=compileonly,TestUnloadedValueTypeField::test5 + * -XX:CompileCommand=compileonly,TestUnloadedValueTypeField::test11 + * -XX:CompileCommand=compileonly,TestUnloadedValueTypeField::test12 * TestUnloadedValueTypeField */ import jdk.test.lib.Asserts; public class TestUnloadedValueTypeField { + static final int WARMUP_LOOPS = 10000; static public void main(String[] args) { + // instance fields test1_verifier(); test2_verifier(); test3_verifier(); test4_verifier(); test5_verifier(); + + // static fields + test11_verifier(); + test12_verifier(); } // Test case 1: // The value type field class has been loaded, but the holder class has not been loaded. //
*** 83,109 **** return 0; } } static void test1_verifier() { ! for (int i=0; i<10000; i++) { // Make sure test1() is compiled for the first iteration of this loop, // while MyValue1Holder is yet to be loaded. test1(null); MyValue1Holder holder = new MyValue1Holder(); Asserts.assertEQ(test1(holder), 1235); } - } // Test case 2: // Both the value type field class, and the holder class have not been loaded. // // aload_0 // getfield MyValueHolder2.v:QMyValue2; // ^ not loaded ^ not loaded // ! // MyValue2 has already been loaded, because it is not explicitly referenced by // TestUnloadedValueTypeField. static value final class MyValue2 { final int foo = 0; static MyValue2 make(int n) { --- 92,118 ---- return 0; } } static void test1_verifier() { ! for (int i=0; i<WARMUP_LOOPS; i++) { // Make sure test1() is compiled for the first iteration of this loop, // while MyValue1Holder is yet to be loaded. test1(null); + } MyValue1Holder holder = new MyValue1Holder(); Asserts.assertEQ(test1(holder), 1235); } // Test case 2: // Both the value type field class, and the holder class have not been loaded. // // aload_0 // getfield MyValueHolder2.v:QMyValue2; // ^ not loaded ^ not loaded // ! // MyValue2 has not been loaded, because it is not explicitly referenced by // TestUnloadedValueTypeField. static value final class MyValue2 { final int foo = 0; static MyValue2 make(int n) {
*** 127,144 **** return 0; } } static void test2_verifier() { ! for (int i=0; i<10000; i++) { // Make sure test2() is compiled for the first iteration of this loop, // while MyValue2Holder2 and MyValue2 is yet to be loaded. test2(null); MyValue2Holder holder2 = new MyValue2Holder(); Asserts.assertEQ(test2(holder2), 1236); } - } // Test case 3: same as test1, except we are using an incorrect signature to // refer to the value class. // The value type field class has been loaded, but the holder class has not been loaded. // --- 136,153 ---- return 0; } } static void test2_verifier() { ! for (int i=0; i<WARMUP_LOOPS; i++) { // Make sure test2() is compiled for the first iteration of this loop, // while MyValue2Holder2 and MyValue2 is yet to be loaded. test2(null); + } MyValue2Holder holder2 = new MyValue2Holder(); Asserts.assertEQ(test2(holder2), 1236); } // Test case 3: same as test1, except we are using an incorrect signature to // refer to the value class. // The value type field class has been loaded, but the holder class has not been loaded. //
*** 174,196 **** static int test3(MyValue3Holder holder) { return GetUnresolvedValueFieldWrongSignature.test3(holder); } static void test3_verifier() { ! for (int i=0; i<10000; i++) { // Make sure test3() is compiled for the first iteration of this loop, // while MyValue3Holder is yet to be loaded. test3(null); MyValue3Holder holder = new MyValue3Holder(); try { test3(holder); Asserts.fail("Should have thrown NoSuchFieldError"); } catch (NoSuchFieldError e) { // OK } } - } // Test case 4: // Same as case 1, except we use putfield instead of getfield. static value final class MyValue4 { final int foo = 0; --- 183,206 ---- static int test3(MyValue3Holder holder) { return GetUnresolvedValueFieldWrongSignature.test3(holder); } static void test3_verifier() { ! for (int i=0; i<WARMUP_LOOPS; i++) { // Make sure test3() is compiled for the first iteration of this loop, // while MyValue3Holder is yet to be loaded. test3(null); + } + MyValue3Holder holder = new MyValue3Holder(); try { test3(holder); Asserts.fail("Should have thrown NoSuchFieldError"); } catch (NoSuchFieldError e) { // OK } } // Test case 4: // Same as case 1, except we use putfield instead of getfield. static value final class MyValue4 { final int foo = 0;
*** 218,236 **** } } static void test4_verifier() { MyValue4 v = MyValue4.make(5678); ! for (int i=0; i<10000; i++) { // Make sure test4() is compiled for the first iteration of this loop, // while MyValue4Holder is yet to be loaded. test4(null, v); MyValue4Holder holder = new MyValue4Holder(); test4(holder, v); Asserts.assertEQ(holder.v.foo, 5678); } - } // Test case 5: // Same as case 2, except we use putfield instead of getfield. static value final class MyValue5 { final int foo = 0; --- 228,246 ---- } } static void test4_verifier() { MyValue4 v = MyValue4.make(5678); ! for (int i=0; i<WARMUP_LOOPS; i++) { // Make sure test4() is compiled for the first iteration of this loop, // while MyValue4Holder is yet to be loaded. test4(null, v); + } MyValue4Holder holder = new MyValue4Holder(); test4(holder, v); Asserts.assertEQ(holder.v.foo, 5678); } // Test case 5: // Same as case 2, except we use putfield instead of getfield. static value final class MyValue5 { final int foo = 0;
*** 257,272 **** holder.v = v; } } static void test5_verifier() { ! for (int i=0; i<10000; i++) { // Make sure test5() is compiled for the first iteration of this loop, // while both MyValue5Holder and MyValye5 are yet to be loaded. test5(null, null); MyValue5Holder holder = new MyValue5Holder(); Object v = holder.make(5679); test5(holder, v); Asserts.assertEQ(holder.v.foo, 5679); } } } --- 267,363 ---- holder.v = v; } } static void test5_verifier() { ! for (int i=0; i<WARMUP_LOOPS; i++) { // Make sure test5() is compiled for the first iteration of this loop, // while both MyValue5Holder and MyValye5 are yet to be loaded. test5(null, null); + } + MyValue5Holder holder = new MyValue5Holder(); Object v = holder.make(5679); test5(holder, v); Asserts.assertEQ(holder.v.foo, 5679); } + + + // Test case 11: (same as test1, except we use getstatic instead of getfield) + // The value type field class has been loaded, but the holder class has not been loaded. + // + // getstatic MyValue11Holder.v:QMyValue1; + // ^ not loaded ^ already loaded + // + // MyValue11 has already been loaded, because it's in the ValueType attribute of + // TestUnloadedValueTypeField, due to TestUnloadedValueTypeField.test1_precondition(). + static value final class MyValue11 { + final int foo = 0; + + static MyValue11 make() { + return __WithField(MyValue11.default.foo, 1234); + } + } + + static class MyValue11Holder { + static MyValue11 v = MyValue11.make(); + } + + static MyValue11 test11_precondition() { + return MyValue11.make(); + } + + static int test11(int n) { + if (n == 0) { + return 0; + } else { + return MyValue11Holder.v.foo + n; + } + } + + static void test11_verifier() { + for (int i=0; i<WARMUP_LOOPS; i++) { + // Make sure test1() is compiled for the first iteration of this loop, + // while MyValue1Holder is yet to be loaded. + test11(0); + } + Asserts.assertEQ(test11(2), 1236); + } + + + // Test case 12: (same as test2, except we use getstatic instead of getfield) + // Both the value type field class, and the holder class have not been loaded. + // + // getstatic MyValueHolder12.v:QMyValue12; + // ^ not loaded ^ not loaded + // + // MyValue12 has not been loaded, because it is not explicitly referenced by + // TestUnloadedValueTypeField. + static value final class MyValue12 { + final int foo = 0; + + static MyValue12 make(int n) { + return __WithField(MyValue12.default.foo, n); + } + } + + static class MyValue12Holder { + static MyValue12 v = MyValue12.make(12); + } + + static int test12(int n) { + if (n == 0) { + return 0; + } else { + return MyValue12Holder.v.foo + n; + } + } + + static void test12_verifier() { + for (int i=0; i<WARMUP_LOOPS; i++) { + // Make sure test2() is compiled for the first iteration of this loop, + // while MyValue2Holder2 and MyValue2 is yet to be loaded. + test12(0); + } + Asserts.assertEQ(test12(1), 13); } }
< prev index next >