test/compiler/stable/TestStableObject.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Sdiff test/compiler/stable

test/compiler/stable/TestStableObject.java

Print this page




  72  *                   -XX:+TieredCompilation -XX:TieredStopAtLevel=1
  73  *                   -XX:+FoldStableValues
  74  *                   -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  75  *                   java.lang.invoke.TestStableObject
  76  * @run main/othervm -Xbootclasspath/a:.
  77  *                   -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  78  *                   -XX:+TieredCompilation -XX:TieredStopAtLevel=1
  79  *                   -XX:-FoldStableValues
  80  *                   -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  81  *                   java.lang.invoke.TestStableObject
  82  *
  83  */
  84 package java.lang.invoke;
  85 
  86 import jdk.internal.vm.annotation.Stable;
  87 
  88 import java.lang.reflect.InvocationTargetException;
  89 
  90 public class TestStableObject {
  91     static final boolean isStableEnabled    = StableConfiguration.isStableEnabled;
  92     static final boolean isServerWithStable = StableConfiguration.isServerWithStable;
  93 
  94     public static void main(String[] args) throws Exception {
  95         run(DefaultValue.class);
  96         run(ObjectStable.class);
  97         run(DefaultStaticValue.class);
  98         run(StaticObjectStable.class);
  99         run(VolatileObjectStable.class);
 100 
 101         // @Stable arrays: Dim 1-4
 102         run(ObjectArrayDim1.class);
 103         run(ObjectArrayDim2.class);
 104         run(ObjectArrayDim3.class);
 105         run(ObjectArrayDim4.class);
 106 
 107         // @Stable Object field: dynamic arrays
 108         run(ObjectArrayLowerDim0.class);
 109         run(ObjectArrayLowerDim1.class);
 110         run(ObjectArrayLowerDim2.class);
 111 
 112         // Nested @Stable fields


 195             assertEquals(val1, Values.A);
 196             assertEquals(val2, (isStableEnabled ? Values.A : Values.B));
 197         }
 198     }
 199 
 200     /* ==================================================== */
 201     // @Stable array == field && all components are stable
 202 
 203     static class ObjectArrayDim1 {
 204         public @Stable Object[] v;
 205 
 206         public static final ObjectArrayDim1 c = new ObjectArrayDim1();
 207         public static Object get() { return c.v[0]; }
 208         public static Object get1() { return c.v[10]; }
 209         public static Object[] get2() { return c.v; }
 210         public static void test() throws Exception {
 211             {
 212                 c.v = new Object[1]; c.v[0] = Values.A; Object val1 = get();
 213                                      c.v[0] = Values.B; Object val2 = get();
 214                 assertEquals(val1, Values.A);
 215                 assertEquals(val2, (isServerWithStable ? Values.A : Values.B));
 216 
 217                 c.v = new Object[1]; c.v[0] = Values.C; Object val3 = get();
 218                 assertEquals(val3, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B)
 219                                                     : Values.C));
 220             }
 221 
 222             {
 223                 c.v = new Object[20]; c.v[10] = Values.A; Object val1 = get1();
 224                                       c.v[10] = Values.B; Object val2 = get1();
 225                 assertEquals(val1, Values.A);
 226                 assertEquals(val2, (isServerWithStable ? Values.A : Values.B));
 227 
 228                 c.v = new Object[20]; c.v[10] = Values.C; Object val3 = get1();
 229                 assertEquals(val3, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B)
 230                                                     : Values.C));
 231             }
 232 
 233             {
 234                 c.v = new Object[1]; Object[] val1 = get2();
 235                 c.v = new Object[1]; Object[] val2 = get2();
 236                 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
 237             }
 238         }
 239     }
 240 
 241     /* ==================================================== */
 242 
 243     static class ObjectArrayDim2 {
 244         public @Stable Object[][] v;
 245 
 246         public static final ObjectArrayDim2 c = new ObjectArrayDim2();
 247         public static Object get() { return c.v[0][0]; }
 248         public static Object[] get1() { return c.v[0]; }
 249         public static Object[][] get2() { return c.v; }
 250         public static void test() throws Exception {
 251             {
 252                 c.v = new Object[1][1]; c.v[0][0] = Values.A; Object val1 = get();
 253                                         c.v[0][0] = Values.B; Object val2 = get();
 254                 assertEquals(val1, Values.A);
 255                 assertEquals(val2, (isServerWithStable ? Values.A : Values.B));
 256 
 257                 c.v = new Object[1][1]; c.v[0][0] = Values.C; Object val3 = get();
 258                 assertEquals(val3, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B)
 259                                                     : Values.C));
 260 
 261                 c.v[0] = new Object[1]; c.v[0][0] = Values.D; Object val4 = get();
 262                 assertEquals(val4, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B)
 263                                                     : Values.D));
 264             }
 265 
 266             {
 267                 c.v = new Object[1][1]; Object[] val1 = get1();
 268                 c.v[0] = new Object[1]; Object[] val2 = get1();
 269                 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2)));
 270             }
 271 
 272             {
 273                 c.v = new Object[1][1]; Object[][] val1 = get2();
 274                 c.v = new Object[1][1]; Object[][] val2 = get2();
 275                 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
 276             }
 277         }
 278     }
 279 
 280     /* ==================================================== */
 281 
 282     static class ObjectArrayDim3 {
 283         public @Stable Object[][][] v;
 284 
 285         public static final ObjectArrayDim3 c = new ObjectArrayDim3();
 286         public static Object get() { return c.v[0][0][0]; }
 287         public static Object[] get1() { return c.v[0][0]; }
 288         public static Object[][] get2() { return c.v[0]; }
 289         public static Object[][][] get3() { return c.v; }
 290         public static void test() throws Exception {
 291             {
 292                 c.v = new Object[1][1][1]; c.v[0][0][0] = Values.A; Object val1 = get();
 293                                            c.v[0][0][0] = Values.B; Object val2 = get();
 294                 assertEquals(val1, Values.A);
 295                 assertEquals(val2, (isServerWithStable ? Values.A : Values.B));
 296 
 297                 c.v = new Object[1][1][1]; c.v[0][0][0] = Values.C; Object val3 = get();
 298                 assertEquals(val3, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B)
 299                                                     : Values.C));
 300 
 301                 c.v[0] = new Object[1][1]; c.v[0][0][0] = Values.D; Object val4 = get();
 302                 assertEquals(val4, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B)
 303                                                     : Values.D));
 304 
 305                 c.v[0][0] = new Object[1]; c.v[0][0][0] = Values.E; Object val5 = get();
 306                 assertEquals(val5, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B)
 307                                                     : Values.E));
 308             }
 309 
 310             {
 311                 c.v = new Object[1][1][1]; Object[] val1 = get1();
 312                 c.v[0][0] = new Object[1]; Object[] val2 = get1();
 313                 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2)));
 314             }
 315 
 316             {
 317                 c.v = new Object[1][1][1]; Object[][] val1 = get2();
 318                 c.v[0] = new Object[1][1]; Object[][] val2 = get2();
 319                 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2)));
 320             }
 321 
 322             {
 323                 c.v = new Object[1][1][1]; Object[][][] val1 = get3();
 324                 c.v = new Object[1][1][1]; Object[][][] val2 = get3();
 325                 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
 326             }
 327         }
 328     }
 329 
 330     /* ==================================================== */
 331 
 332     static class ObjectArrayDim4 {
 333         public @Stable Object[][][][] v;
 334 
 335         public static final ObjectArrayDim4 c = new ObjectArrayDim4();
 336         public static Object get() { return c.v[0][0][0][0]; }
 337         public static Object[] get1() { return c.v[0][0][0]; }
 338         public static Object[][] get2() { return c.v[0][0]; }
 339         public static Object[][][] get3() { return c.v[0]; }
 340         public static Object[][][][] get4() { return c.v; }
 341         public static void test() throws Exception {
 342             {
 343                 c.v = new Object[1][1][1][1]; c.v[0][0][0][0] = Values.A; Object val1 = get();
 344                                               c.v[0][0][0][0] = Values.B; Object val2 = get();
 345                 assertEquals(val1, Values.A);
 346                 assertEquals(val2, (isServerWithStable ? Values.A : Values.B));
 347 
 348                 c.v = new Object[1][1][1][1]; c.v[0][0][0][0] = Values.C; Object val3 = get();
 349                 assertEquals(val3, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B)
 350                                                     : Values.C));
 351 
 352                 c.v[0] = new Object[1][1][1]; c.v[0][0][0][0] = Values.D; Object val4 = get();
 353                 assertEquals(val4, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B)
 354                                                     : Values.D));
 355 
 356                 c.v[0][0] = new Object[1][1]; c.v[0][0][0][0] = Values.E; Object val5 = get();
 357                 assertEquals(val5, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B)
 358                                                     : Values.E));
 359 
 360                 c.v[0][0][0] = new Object[1]; c.v[0][0][0][0] = Values.F; Object val6 = get();
 361                 assertEquals(val6, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B)
 362                                                     : Values.F));
 363             }
 364 
 365             {
 366                 c.v = new Object[1][1][1][1]; Object[] val1 = get1();
 367                 c.v[0][0][0] = new Object[1]; Object[] val2 = get1();
 368                 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2)));
 369             }
 370 
 371             {
 372                 c.v = new Object[1][1][1][1]; Object[][] val1 = get2();
 373                 c.v[0][0] = new Object[1][1]; Object[][] val2 = get2();
 374                 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2)));
 375             }
 376 
 377             {
 378                 c.v = new Object[1][1][1][1]; Object[][][] val1 = get3();
 379                 c.v[0] = new Object[1][1][1]; Object[][][] val2 = get3();
 380                 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2)));
 381             }
 382 
 383             {
 384                 c.v = new Object[1][1][1][1]; Object[][][][] val1 = get4();
 385                 c.v = new Object[1][1][1][1]; Object[][][][] val2 = get4();
 386                 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
 387             }
 388         }
 389     }
 390 
 391     /* ==================================================== */
 392     // Dynamic Dim is higher than static
 393     static class ObjectArrayLowerDim0 {
 394         public @Stable Object v;
 395 
 396         public static final ObjectArrayLowerDim0 c = new ObjectArrayLowerDim0();
 397         public static Object get() { return ((Object[])c.v)[0]; }
 398         public static Object[] get1() { return (Object[])c.v; }
 399 
 400         public static void test() throws Exception {


 420         public @Stable Object[] v;
 421 
 422         public static final ObjectArrayLowerDim1 c = new ObjectArrayLowerDim1();
 423         public static Object get() { return ((Object[][])c.v)[0][0]; }
 424         public static Object[] get1() { return (Object[])(c.v[0]); }
 425         public static Object[] get2() { return c.v; }
 426 
 427         public static void test() throws Exception {
 428             {
 429                 c.v = new Object[1][1]; ((Object[][])c.v)[0][0] = Values.A; Object val1 = get();
 430                                         ((Object[][])c.v)[0][0] = Values.B; Object val2 = get();
 431 
 432                 assertEquals(val1, Values.A);
 433                 assertEquals(val2, Values.B);
 434             }
 435 
 436             {
 437                 c.v = new Object[1][1]; c.v[0] = new Object[0]; Object[] val1 = get1();
 438                                      c.v[0] = new Object[0]; Object[] val2 = get1();
 439 
 440                 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2)));
 441             }
 442 
 443             {
 444                 c.v = new Object[0][0]; Object[] val1 = get2();
 445                 c.v = new Object[0][0]; Object[] val2 = get2();
 446 
 447                 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
 448             }
 449         }
 450     }
 451 
 452     /* ==================================================== */
 453 
 454     static class ObjectArrayLowerDim2 {
 455         public @Stable Object[][] v;
 456 
 457         public static final ObjectArrayLowerDim2 c = new ObjectArrayLowerDim2();
 458         public static Object get() { return ((Object[][][])c.v)[0][0][0]; }
 459         public static Object[] get1() { return (Object[])(c.v[0][0]); }
 460         public static Object[][] get2() { return (Object[][])(c.v[0]); }
 461         public static Object[][] get3() { return c.v; }
 462 
 463         public static void test() throws Exception {
 464             {
 465                 c.v = new Object[1][1][1]; ((Object[][][])c.v)[0][0][0] = Values.A; Object val1 = get();
 466                                            ((Object[][][])c.v)[0][0][0] = Values.B; Object val2 = get();
 467 
 468                 assertEquals(val1, Values.A);
 469                 assertEquals(val2, Values.B);
 470             }
 471 
 472             {
 473                 c.v = new Object[1][1][1]; c.v[0][0] = new Object[0]; Object[] val1 = get1();
 474                                            c.v[0][0] = new Object[0]; Object[] val2 = get1();
 475 
 476                 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2)));
 477             }
 478 
 479             {
 480                 c.v = new Object[1][1][1]; c.v[0] = new Object[0][0]; Object[][] val1 = get2();
 481                                            c.v[0] = new Object[0][0]; Object[][] val2 = get2();
 482 
 483                 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2)));
 484             }
 485 
 486             {
 487                 c.v = new Object[0][0][0]; Object[][] val1 = get3();
 488                 c.v = new Object[0][0][0]; Object[][] val2 = get3();
 489 
 490                 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
 491             }
 492         }
 493     }
 494 
 495     /* ==================================================== */
 496 
 497     static class NestedStableField {
 498         static class A {
 499             public @Stable Object a;
 500 
 501         }
 502         public @Stable A v;
 503 


 598         static class A {
 599             public @Stable Object a;
 600             public @Stable A[] left;
 601             public         A[] right;
 602         }
 603 
 604         public @Stable A[] v;
 605 
 606         public static final NestedStableField3 c = new NestedStableField3();
 607         public static Object get() { return c.v[0].left[1].left[0].left[1].a; }
 608         public static Object get1() { return c.v[1].left[0].left[1].right[0].left[1].a; }
 609 
 610         public static void test() throws Exception {
 611             {
 612                 A elem = new A();
 613                 c.v = new A[] { elem, elem }; c.v[0].left = c.v[0].right = c.v;
 614                                elem.a = Values.A; Object val1 = get(); Object val2 = get1();
 615                                elem.a = Values.B; Object val3 = get(); Object val4 = get1();
 616 
 617                 assertEquals(val1, Values.A);
 618                 assertEquals(val3, (isServerWithStable ? Values.A : Values.B));
 619 
 620                 assertEquals(val2, Values.A);
 621                 assertEquals(val4, Values.B);
 622             }
 623         }
 624     }
 625 
 626     /* ==================================================== */
 627     // Auxiliary methods
 628     static void assertEquals(Object i, Object j) { if (i != j)  throw new AssertionError(i + " != " + j); }
 629     static void assertTrue(boolean b) { if (!b)  throw new AssertionError(); }
 630 
 631     static boolean failed = false;
 632 
 633     public static void run(Class<?> test) {
 634         Throwable ex = null;
 635         System.out.print(test.getName()+": ");
 636         try {
 637             test.getMethod("test").invoke(null);
 638         } catch (InvocationTargetException e) {


  72  *                   -XX:+TieredCompilation -XX:TieredStopAtLevel=1
  73  *                   -XX:+FoldStableValues
  74  *                   -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  75  *                   java.lang.invoke.TestStableObject
  76  * @run main/othervm -Xbootclasspath/a:.
  77  *                   -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  78  *                   -XX:+TieredCompilation -XX:TieredStopAtLevel=1
  79  *                   -XX:-FoldStableValues
  80  *                   -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  81  *                   java.lang.invoke.TestStableObject
  82  *
  83  */
  84 package java.lang.invoke;
  85 
  86 import jdk.internal.vm.annotation.Stable;
  87 
  88 import java.lang.reflect.InvocationTargetException;
  89 
  90 public class TestStableObject {
  91     static final boolean isStableEnabled    = StableConfiguration.isStableEnabled;

  92 
  93     public static void main(String[] args) throws Exception {
  94         run(DefaultValue.class);
  95         run(ObjectStable.class);
  96         run(DefaultStaticValue.class);
  97         run(StaticObjectStable.class);
  98         run(VolatileObjectStable.class);
  99 
 100         // @Stable arrays: Dim 1-4
 101         run(ObjectArrayDim1.class);
 102         run(ObjectArrayDim2.class);
 103         run(ObjectArrayDim3.class);
 104         run(ObjectArrayDim4.class);
 105 
 106         // @Stable Object field: dynamic arrays
 107         run(ObjectArrayLowerDim0.class);
 108         run(ObjectArrayLowerDim1.class);
 109         run(ObjectArrayLowerDim2.class);
 110 
 111         // Nested @Stable fields


 194             assertEquals(val1, Values.A);
 195             assertEquals(val2, (isStableEnabled ? Values.A : Values.B));
 196         }
 197     }
 198 
 199     /* ==================================================== */
 200     // @Stable array == field && all components are stable
 201 
 202     static class ObjectArrayDim1 {
 203         public @Stable Object[] v;
 204 
 205         public static final ObjectArrayDim1 c = new ObjectArrayDim1();
 206         public static Object get() { return c.v[0]; }
 207         public static Object get1() { return c.v[10]; }
 208         public static Object[] get2() { return c.v; }
 209         public static void test() throws Exception {
 210             {
 211                 c.v = new Object[1]; c.v[0] = Values.A; Object val1 = get();
 212                                      c.v[0] = Values.B; Object val2 = get();
 213                 assertEquals(val1, Values.A);
 214                 assertEquals(val2, (isStableEnabled ? Values.A : Values.B));
 215 
 216                 c.v = new Object[1]; c.v[0] = Values.C; Object val3 = get();
 217                 assertEquals(val3, (isStableEnabled ? (isStableEnabled ? Values.A : Values.B)
 218                                                     : Values.C));
 219             }
 220 
 221             {
 222                 c.v = new Object[20]; c.v[10] = Values.A; Object val1 = get1();
 223                                       c.v[10] = Values.B; Object val2 = get1();
 224                 assertEquals(val1, Values.A);
 225                 assertEquals(val2, (isStableEnabled ? Values.A : Values.B));
 226 
 227                 c.v = new Object[20]; c.v[10] = Values.C; Object val3 = get1();
 228                 assertEquals(val3, (isStableEnabled ? (isStableEnabled ? Values.A : Values.B)
 229                                                     : Values.C));
 230             }
 231 
 232             {
 233                 c.v = new Object[1]; Object[] val1 = get2();
 234                 c.v = new Object[1]; Object[] val2 = get2();
 235                 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
 236             }
 237         }
 238     }
 239 
 240     /* ==================================================== */
 241 
 242     static class ObjectArrayDim2 {
 243         public @Stable Object[][] v;
 244 
 245         public static final ObjectArrayDim2 c = new ObjectArrayDim2();
 246         public static Object get() { return c.v[0][0]; }
 247         public static Object[] get1() { return c.v[0]; }
 248         public static Object[][] get2() { return c.v; }
 249         public static void test() throws Exception {
 250             {
 251                 c.v = new Object[1][1]; c.v[0][0] = Values.A; Object val1 = get();
 252                                         c.v[0][0] = Values.B; Object val2 = get();
 253                 assertEquals(val1, Values.A);
 254                 assertEquals(val2, (isStableEnabled ? Values.A : Values.B));
 255 
 256                 c.v = new Object[1][1]; c.v[0][0] = Values.C; Object val3 = get();
 257                 assertEquals(val3, (isStableEnabled ? (isStableEnabled ? Values.A : Values.B)
 258                                                     : Values.C));
 259 
 260                 c.v[0] = new Object[1]; c.v[0][0] = Values.D; Object val4 = get();
 261                 assertEquals(val4, (isStableEnabled ? (isStableEnabled ? Values.A : Values.B)
 262                                                     : Values.D));
 263             }
 264 
 265             {
 266                 c.v = new Object[1][1]; Object[] val1 = get1();
 267                 c.v[0] = new Object[1]; Object[] val2 = get1();
 268                 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
 269             }
 270 
 271             {
 272                 c.v = new Object[1][1]; Object[][] val1 = get2();
 273                 c.v = new Object[1][1]; Object[][] val2 = get2();
 274                 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
 275             }
 276         }
 277     }
 278 
 279     /* ==================================================== */
 280 
 281     static class ObjectArrayDim3 {
 282         public @Stable Object[][][] v;
 283 
 284         public static final ObjectArrayDim3 c = new ObjectArrayDim3();
 285         public static Object get() { return c.v[0][0][0]; }
 286         public static Object[] get1() { return c.v[0][0]; }
 287         public static Object[][] get2() { return c.v[0]; }
 288         public static Object[][][] get3() { return c.v; }
 289         public static void test() throws Exception {
 290             {
 291                 c.v = new Object[1][1][1]; c.v[0][0][0] = Values.A; Object val1 = get();
 292                                            c.v[0][0][0] = Values.B; Object val2 = get();
 293                 assertEquals(val1, Values.A);
 294                 assertEquals(val2, (isStableEnabled ? Values.A : Values.B));
 295 
 296                 c.v = new Object[1][1][1]; c.v[0][0][0] = Values.C; Object val3 = get();
 297                 assertEquals(val3, (isStableEnabled ? (isStableEnabled ? Values.A : Values.B)
 298                                                     : Values.C));
 299 
 300                 c.v[0] = new Object[1][1]; c.v[0][0][0] = Values.D; Object val4 = get();
 301                 assertEquals(val4, (isStableEnabled ? (isStableEnabled ? Values.A : Values.B)
 302                                                     : Values.D));
 303 
 304                 c.v[0][0] = new Object[1]; c.v[0][0][0] = Values.E; Object val5 = get();
 305                 assertEquals(val5, (isStableEnabled ? (isStableEnabled ? Values.A : Values.B)
 306                                                     : Values.E));
 307             }
 308 
 309             {
 310                 c.v = new Object[1][1][1]; Object[] val1 = get1();
 311                 c.v[0][0] = new Object[1]; Object[] val2 = get1();
 312                 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
 313             }
 314 
 315             {
 316                 c.v = new Object[1][1][1]; Object[][] val1 = get2();
 317                 c.v[0] = new Object[1][1]; Object[][] val2 = get2();
 318                 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
 319             }
 320 
 321             {
 322                 c.v = new Object[1][1][1]; Object[][][] val1 = get3();
 323                 c.v = new Object[1][1][1]; Object[][][] val2 = get3();
 324                 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
 325             }
 326         }
 327     }
 328 
 329     /* ==================================================== */
 330 
 331     static class ObjectArrayDim4 {
 332         public @Stable Object[][][][] v;
 333 
 334         public static final ObjectArrayDim4 c = new ObjectArrayDim4();
 335         public static Object get() { return c.v[0][0][0][0]; }
 336         public static Object[] get1() { return c.v[0][0][0]; }
 337         public static Object[][] get2() { return c.v[0][0]; }
 338         public static Object[][][] get3() { return c.v[0]; }
 339         public static Object[][][][] get4() { return c.v; }
 340         public static void test() throws Exception {
 341             {
 342                 c.v = new Object[1][1][1][1]; c.v[0][0][0][0] = Values.A; Object val1 = get();
 343                                               c.v[0][0][0][0] = Values.B; Object val2 = get();
 344                 assertEquals(val1, Values.A);
 345                 assertEquals(val2, (isStableEnabled ? Values.A : Values.B));
 346 
 347                 c.v = new Object[1][1][1][1]; c.v[0][0][0][0] = Values.C; Object val3 = get();
 348                 assertEquals(val3, (isStableEnabled ? (isStableEnabled ? Values.A : Values.B)
 349                                                     : Values.C));
 350 
 351                 c.v[0] = new Object[1][1][1]; c.v[0][0][0][0] = Values.D; Object val4 = get();
 352                 assertEquals(val4, (isStableEnabled ? (isStableEnabled ? Values.A : Values.B)
 353                                                     : Values.D));
 354 
 355                 c.v[0][0] = new Object[1][1]; c.v[0][0][0][0] = Values.E; Object val5 = get();
 356                 assertEquals(val5, (isStableEnabled ? (isStableEnabled ? Values.A : Values.B)
 357                                                     : Values.E));
 358 
 359                 c.v[0][0][0] = new Object[1]; c.v[0][0][0][0] = Values.F; Object val6 = get();
 360                 assertEquals(val6, (isStableEnabled ? (isStableEnabled ? Values.A : Values.B)
 361                                                     : Values.F));
 362             }
 363 
 364             {
 365                 c.v = new Object[1][1][1][1]; Object[] val1 = get1();
 366                 c.v[0][0][0] = new Object[1]; Object[] val2 = get1();
 367                 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
 368             }
 369 
 370             {
 371                 c.v = new Object[1][1][1][1]; Object[][] val1 = get2();
 372                 c.v[0][0] = new Object[1][1]; Object[][] val2 = get2();
 373                 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
 374             }
 375 
 376             {
 377                 c.v = new Object[1][1][1][1]; Object[][][] val1 = get3();
 378                 c.v[0] = new Object[1][1][1]; Object[][][] val2 = get3();
 379                 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
 380             }
 381 
 382             {
 383                 c.v = new Object[1][1][1][1]; Object[][][][] val1 = get4();
 384                 c.v = new Object[1][1][1][1]; Object[][][][] val2 = get4();
 385                 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
 386             }
 387         }
 388     }
 389 
 390     /* ==================================================== */
 391     // Dynamic Dim is higher than static
 392     static class ObjectArrayLowerDim0 {
 393         public @Stable Object v;
 394 
 395         public static final ObjectArrayLowerDim0 c = new ObjectArrayLowerDim0();
 396         public static Object get() { return ((Object[])c.v)[0]; }
 397         public static Object[] get1() { return (Object[])c.v; }
 398 
 399         public static void test() throws Exception {


 419         public @Stable Object[] v;
 420 
 421         public static final ObjectArrayLowerDim1 c = new ObjectArrayLowerDim1();
 422         public static Object get() { return ((Object[][])c.v)[0][0]; }
 423         public static Object[] get1() { return (Object[])(c.v[0]); }
 424         public static Object[] get2() { return c.v; }
 425 
 426         public static void test() throws Exception {
 427             {
 428                 c.v = new Object[1][1]; ((Object[][])c.v)[0][0] = Values.A; Object val1 = get();
 429                                         ((Object[][])c.v)[0][0] = Values.B; Object val2 = get();
 430 
 431                 assertEquals(val1, Values.A);
 432                 assertEquals(val2, Values.B);
 433             }
 434 
 435             {
 436                 c.v = new Object[1][1]; c.v[0] = new Object[0]; Object[] val1 = get1();
 437                                      c.v[0] = new Object[0]; Object[] val2 = get1();
 438 
 439                 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
 440             }
 441 
 442             {
 443                 c.v = new Object[0][0]; Object[] val1 = get2();
 444                 c.v = new Object[0][0]; Object[] val2 = get2();
 445 
 446                 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
 447             }
 448         }
 449     }
 450 
 451     /* ==================================================== */
 452 
 453     static class ObjectArrayLowerDim2 {
 454         public @Stable Object[][] v;
 455 
 456         public static final ObjectArrayLowerDim2 c = new ObjectArrayLowerDim2();
 457         public static Object get() { return ((Object[][][])c.v)[0][0][0]; }
 458         public static Object[] get1() { return (Object[])(c.v[0][0]); }
 459         public static Object[][] get2() { return (Object[][])(c.v[0]); }
 460         public static Object[][] get3() { return c.v; }
 461 
 462         public static void test() throws Exception {
 463             {
 464                 c.v = new Object[1][1][1]; ((Object[][][])c.v)[0][0][0] = Values.A; Object val1 = get();
 465                                            ((Object[][][])c.v)[0][0][0] = Values.B; Object val2 = get();
 466 
 467                 assertEquals(val1, Values.A);
 468                 assertEquals(val2, Values.B);
 469             }
 470 
 471             {
 472                 c.v = new Object[1][1][1]; c.v[0][0] = new Object[0]; Object[] val1 = get1();
 473                                            c.v[0][0] = new Object[0]; Object[] val2 = get1();
 474 
 475                 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
 476             }
 477 
 478             {
 479                 c.v = new Object[1][1][1]; c.v[0] = new Object[0][0]; Object[][] val1 = get2();
 480                                            c.v[0] = new Object[0][0]; Object[][] val2 = get2();
 481 
 482                 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
 483             }
 484 
 485             {
 486                 c.v = new Object[0][0][0]; Object[][] val1 = get3();
 487                 c.v = new Object[0][0][0]; Object[][] val2 = get3();
 488 
 489                 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
 490             }
 491         }
 492     }
 493 
 494     /* ==================================================== */
 495 
 496     static class NestedStableField {
 497         static class A {
 498             public @Stable Object a;
 499 
 500         }
 501         public @Stable A v;
 502 


 597         static class A {
 598             public @Stable Object a;
 599             public @Stable A[] left;
 600             public         A[] right;
 601         }
 602 
 603         public @Stable A[] v;
 604 
 605         public static final NestedStableField3 c = new NestedStableField3();
 606         public static Object get() { return c.v[0].left[1].left[0].left[1].a; }
 607         public static Object get1() { return c.v[1].left[0].left[1].right[0].left[1].a; }
 608 
 609         public static void test() throws Exception {
 610             {
 611                 A elem = new A();
 612                 c.v = new A[] { elem, elem }; c.v[0].left = c.v[0].right = c.v;
 613                                elem.a = Values.A; Object val1 = get(); Object val2 = get1();
 614                                elem.a = Values.B; Object val3 = get(); Object val4 = get1();
 615 
 616                 assertEquals(val1, Values.A);
 617                 assertEquals(val3, (isStableEnabled ? Values.A : Values.B));
 618 
 619                 assertEquals(val2, Values.A);
 620                 assertEquals(val4, Values.B);
 621             }
 622         }
 623     }
 624 
 625     /* ==================================================== */
 626     // Auxiliary methods
 627     static void assertEquals(Object i, Object j) { if (i != j)  throw new AssertionError(i + " != " + j); }
 628     static void assertTrue(boolean b) { if (!b)  throw new AssertionError(); }
 629 
 630     static boolean failed = false;
 631 
 632     public static void run(Class<?> test) {
 633         Throwable ex = null;
 634         System.out.print(test.getName()+": ");
 635         try {
 636             test.getMethod("test").invoke(null);
 637         } catch (InvocationTargetException e) {
test/compiler/stable/TestStableObject.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File