1 /* 2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 /* 27 * @test TestStableShort 28 * @summary tests on stable fields and arrays 29 * @library /testlibrary /../../test/lib 30 * @build TestStableShort StableConfiguration jdk.testlib.WhiteBox 31 * @run main ClassFileInstaller jdk.testlib.WhiteBox jdk.testlib.WhiteBox$WhiteBoxPermission 32 * @run main ClassFileInstaller 33 * java/lang/invoke/StableConfiguration 34 * java/lang/invoke/TestStableShort 35 * java/lang/invoke/TestStableShort$ShortStable 36 * java/lang/invoke/TestStableShort$StaticShortStable 37 * java/lang/invoke/TestStableShort$VolatileShortStable 38 * java/lang/invoke/TestStableShort$ShortArrayDim1 39 * java/lang/invoke/TestStableShort$ShortArrayDim2 40 * java/lang/invoke/TestStableShort$ShortArrayDim3 41 * java/lang/invoke/TestStableShort$ShortArrayDim4 42 * java/lang/invoke/TestStableShort$ObjectArrayLowerDim0 43 * java/lang/invoke/TestStableShort$ObjectArrayLowerDim1 44 * java/lang/invoke/TestStableShort$NestedStableField 45 * java/lang/invoke/TestStableShort$NestedStableField$A 46 * java/lang/invoke/TestStableShort$NestedStableField1 47 * java/lang/invoke/TestStableShort$NestedStableField1$A 48 * java/lang/invoke/TestStableShort$NestedStableField2 49 * java/lang/invoke/TestStableShort$NestedStableField2$A 50 * java/lang/invoke/TestStableShort$NestedStableField3 51 * java/lang/invoke/TestStableShort$NestedStableField3$A 52 * java/lang/invoke/TestStableShort$DefaultValue 53 * java/lang/invoke/TestStableShort$DefaultStaticValue 54 * java/lang/invoke/TestStableShort$ObjectArrayLowerDim2 55 * 56 * @run main/othervm -Xbootclasspath/a:. 57 * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp 58 * -XX:-TieredCompilation 59 * -XX:+FoldStableValues 60 * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 61 * java.lang.invoke.TestStableShort 62 * @run main/othervm -Xbootclasspath/a:. 63 * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp 64 * -XX:-TieredCompilation 65 * -XX:-FoldStableValues 66 * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 67 * java.lang.invoke.TestStableShort 68 * 69 * @run main/othervm -Xbootclasspath/a:. 70 * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp 71 * -XX:+TieredCompilation -XX:TieredStopAtLevel=1 72 * -XX:+FoldStableValues 73 * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 74 * java.lang.invoke.TestStableShort 75 * @run main/othervm -Xbootclasspath/a:. 76 * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp 77 * -XX:+TieredCompilation -XX:TieredStopAtLevel=1 78 * -XX:-FoldStableValues 79 * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 80 * java.lang.invoke.TestStableShort 81 * 82 */ 83 package java.lang.invoke; 84 85 import java.lang.reflect.InvocationTargetException; 86 87 public class TestStableShort { 88 static final boolean isStableEnabled = StableConfiguration.isStableEnabled; 89 static final boolean isServerWithStable = StableConfiguration.isServerWithStable; 90 91 public static void main(String[] args) throws Exception { 92 run(DefaultValue.class); 93 run(ShortStable.class); 94 run(DefaultStaticValue.class); 95 run(StaticShortStable.class); 96 run(VolatileShortStable.class); 97 98 // @Stable arrays: Dim 1-4 99 run(ShortArrayDim1.class); 100 run(ShortArrayDim2.class); 101 run(ShortArrayDim3.class); 102 run(ShortArrayDim4.class); 103 104 // @Stable Object field: dynamic arrays 105 run(ObjectArrayLowerDim0.class); 106 run(ObjectArrayLowerDim1.class); 107 run(ObjectArrayLowerDim2.class); 108 109 // Nested @Stable fields 110 run(NestedStableField.class); 111 run(NestedStableField1.class); 112 run(NestedStableField2.class); 113 run(NestedStableField3.class); 114 115 if (failed) { 116 throw new Error("TEST FAILED"); 117 } 118 } 119 120 /* ==================================================== */ 121 122 static class DefaultValue { 123 public @Stable short v; 124 125 public static final DefaultValue c = new DefaultValue(); 126 public static short get() { return c.v; } 127 public static void test() throws Exception { 128 short val1 = get(); 129 c.v = 1; short val2 = get(); 130 assertEquals(val1, 0); 131 assertEquals(val2, 1); 132 } 133 } 134 135 /* ==================================================== */ 136 137 static class ShortStable { 138 public @Stable short v; 139 140 public static final ShortStable c = new ShortStable(); 141 public static short get() { return c.v; } 142 public static void test() throws Exception { 143 c.v = 1; short val1 = get(); 144 c.v = 32767; short val2 = get(); 145 assertEquals(val1, 1); 146 assertEquals(val2, (isStableEnabled ? 1 : 32767)); 147 } 148 } 149 150 /* ==================================================== */ 151 152 static class DefaultStaticValue { 153 public static @Stable short v; 154 155 public static final DefaultStaticValue c = new DefaultStaticValue(); 156 public static short get() { return c.v; } 157 public static void test() throws Exception { 158 short val1 = get(); 159 c.v = 1; short val2 = get(); 160 assertEquals(val1, 0); 161 assertEquals(val2, 1); 162 } 163 } 164 165 /* ==================================================== */ 166 167 static class StaticShortStable { 168 public static @Stable short v; 169 170 public static final StaticShortStable c = new StaticShortStable(); 171 public static short get() { return c.v; } 172 public static void test() throws Exception { 173 c.v = 1; short val1 = get(); 174 c.v = 32767; short val2 = get(); 175 assertEquals(val1, 1); 176 assertEquals(val2, (isStableEnabled ? 1 : 32767)); 177 } 178 } 179 180 /* ==================================================== */ 181 182 static class VolatileShortStable { 183 public @Stable volatile short v; 184 185 public static final VolatileShortStable c = new VolatileShortStable(); 186 public static short get() { return c.v; } 187 public static void test() throws Exception { 188 c.v = 1; short val1 = get(); 189 c.v = 32767; short val2 = get(); 190 assertEquals(val1, 1); 191 assertEquals(val2, (isStableEnabled ? 1 : 32767)); 192 } 193 } 194 195 /* ==================================================== */ 196 // @Stable array == field && all components are stable 197 198 static class ShortArrayDim1 { 199 public @Stable short[] v; 200 201 public static final ShortArrayDim1 c = new ShortArrayDim1(); 202 public static short get() { return c.v[0]; } 203 public static short get1() { return c.v[10]; } 204 public static short[] get2() { return c.v; } 205 public static void test() throws Exception { 206 { 207 c.v = new short[1]; c.v[0] = 1; short val1 = get(); 208 c.v[0] = 2; short val2 = get(); 209 assertEquals(val1, 1); 210 assertEquals(val2, (isServerWithStable ? 1 : 2)); 211 212 c.v = new short[1]; c.v[0] = 3; short val3 = get(); 213 assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) 214 : 3)); 215 } 216 217 { 218 c.v = new short[20]; c.v[10] = 1; short val1 = get1(); 219 c.v[10] = 2; short val2 = get1(); 220 assertEquals(val1, 1); 221 assertEquals(val2, (isServerWithStable ? 1 : 2)); 222 223 c.v = new short[20]; c.v[10] = 3; short val3 = get1(); 224 assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) 225 : 3)); 226 } 227 228 { 229 c.v = new short[1]; short[] val1 = get2(); 230 c.v = new short[1]; short[] val2 = get2(); 231 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); 232 } 233 } 234 } 235 236 /* ==================================================== */ 237 238 static class ShortArrayDim2 { 239 public @Stable short[][] v; 240 241 public static final ShortArrayDim2 c = new ShortArrayDim2(); 242 public static short get() { return c.v[0][0]; } 243 public static short[] get1() { return c.v[0]; } 244 public static short[][] get2() { return c.v; } 245 public static void test() throws Exception { 246 { 247 c.v = new short[1][1]; c.v[0][0] = 1; short val1 = get(); 248 c.v[0][0] = 2; short val2 = get(); 249 assertEquals(val1, 1); 250 assertEquals(val2, (isServerWithStable ? 1 : 2)); 251 252 c.v = new short[1][1]; c.v[0][0] = 3; short val3 = get(); 253 assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) 254 : 3)); 255 256 c.v[0] = new short[1]; c.v[0][0] = 4; short val4 = get(); 257 assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) 258 : 4)); 259 } 260 261 { 262 c.v = new short[1][1]; short[] val1 = get1(); 263 c.v[0] = new short[1]; short[] val2 = get1(); 264 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); 265 } 266 267 { 268 c.v = new short[1][1]; short[][] val1 = get2(); 269 c.v = new short[1][1]; short[][] val2 = get2(); 270 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); 271 } 272 } 273 } 274 275 /* ==================================================== */ 276 277 static class ShortArrayDim3 { 278 public @Stable short[][][] v; 279 280 public static final ShortArrayDim3 c = new ShortArrayDim3(); 281 public static short get() { return c.v[0][0][0]; } 282 public static short[] get1() { return c.v[0][0]; } 283 public static short[][] get2() { return c.v[0]; } 284 public static short[][][] get3() { return c.v; } 285 public static void test() throws Exception { 286 { 287 c.v = new short[1][1][1]; c.v[0][0][0] = 1; short val1 = get(); 288 c.v[0][0][0] = 2; short val2 = get(); 289 assertEquals(val1, 1); 290 assertEquals(val2, (isServerWithStable ? 1 : 2)); 291 292 c.v = new short[1][1][1]; c.v[0][0][0] = 3; short val3 = get(); 293 assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) 294 : 3)); 295 296 c.v[0] = new short[1][1]; c.v[0][0][0] = 4; short val4 = get(); 297 assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) 298 : 4)); 299 300 c.v[0][0] = new short[1]; c.v[0][0][0] = 5; short val5 = get(); 301 assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1 : 2) 302 : 5)); 303 } 304 305 { 306 c.v = new short[1][1][1]; short[] val1 = get1(); 307 c.v[0][0] = new short[1]; short[] val2 = get1(); 308 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); 309 } 310 311 { 312 c.v = new short[1][1][1]; short[][] val1 = get2(); 313 c.v[0] = new short[1][1]; short[][] val2 = get2(); 314 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); 315 } 316 317 { 318 c.v = new short[1][1][1]; short[][][] val1 = get3(); 319 c.v = new short[1][1][1]; short[][][] val2 = get3(); 320 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); 321 } 322 } 323 } 324 325 /* ==================================================== */ 326 327 static class ShortArrayDim4 { 328 public @Stable short[][][][] v; 329 330 public static final ShortArrayDim4 c = new ShortArrayDim4(); 331 public static short get() { return c.v[0][0][0][0]; } 332 public static short[] get1() { return c.v[0][0][0]; } 333 public static short[][] get2() { return c.v[0][0]; } 334 public static short[][][] get3() { return c.v[0]; } 335 public static short[][][][] get4() { return c.v; } 336 public static void test() throws Exception { 337 { 338 c.v = new short[1][1][1][1]; c.v[0][0][0][0] = 1; short val1 = get(); 339 c.v[0][0][0][0] = 2; short val2 = get(); 340 assertEquals(val1, 1); 341 assertEquals(val2, (isServerWithStable ? 1 : 2)); 342 343 c.v = new short[1][1][1][1]; c.v[0][0][0][0] = 3; short val3 = get(); 344 assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) 345 : 3)); 346 347 c.v[0] = new short[1][1][1]; c.v[0][0][0][0] = 4; short val4 = get(); 348 assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) 349 : 4)); 350 351 c.v[0][0] = new short[1][1]; c.v[0][0][0][0] = 5; short val5 = get(); 352 assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1 : 2) 353 : 5)); 354 355 c.v[0][0][0] = new short[1]; c.v[0][0][0][0] = 6; short val6 = get(); 356 assertEquals(val6, (isStableEnabled ? (isServerWithStable ? 1 : 2) 357 : 6)); 358 } 359 360 { 361 c.v = new short[1][1][1][1]; short[] val1 = get1(); 362 c.v[0][0][0] = new short[1]; short[] val2 = get1(); 363 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); 364 } 365 366 { 367 c.v = new short[1][1][1][1]; short[][] val1 = get2(); 368 c.v[0][0] = new short[1][1]; short[][] val2 = get2(); 369 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); 370 } 371 372 { 373 c.v = new short[1][1][1][1]; short[][][] val1 = get3(); 374 c.v[0] = new short[1][1][1]; short[][][] val2 = get3(); 375 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); 376 } 377 378 { 379 c.v = new short[1][1][1][1]; short[][][][] val1 = get4(); 380 c.v = new short[1][1][1][1]; short[][][][] val2 = get4(); 381 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); 382 } 383 } 384 } 385 386 /* ==================================================== */ 387 // Dynamic Dim is higher than static 388 static class ObjectArrayLowerDim0 { 389 public @Stable Object v; 390 391 public static final ObjectArrayLowerDim0 c = new ObjectArrayLowerDim0(); 392 public static short get() { return ((short[])c.v)[0]; } 393 public static short[] get1() { return (short[])c.v; } 394 395 public static void test() throws Exception { 396 { 397 c.v = new short[1]; ((short[])c.v)[0] = 1; short val1 = get(); 398 ((short[])c.v)[0] = 2; short val2 = get(); 399 400 assertEquals(val1, 1); 401 assertEquals(val2, 2); 402 } 403 404 { 405 c.v = new short[1]; short[] val1 = get1(); 406 c.v = new short[1]; short[] val2 = get1(); 407 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); 408 } 409 } 410 } 411 412 /* ==================================================== */ 413 414 static class ObjectArrayLowerDim1 { 415 public @Stable Object[] v; 416 417 public static final ObjectArrayLowerDim1 c = new ObjectArrayLowerDim1(); 418 public static short get() { return ((short[][])c.v)[0][0]; } 419 public static short[] get1() { return (short[])(c.v[0]); } 420 public static Object[] get2() { return c.v; } 421 422 public static void test() throws Exception { 423 { 424 c.v = new short[1][1]; ((short[][])c.v)[0][0] = 1; short val1 = get(); 425 ((short[][])c.v)[0][0] = 2; short val2 = get(); 426 427 assertEquals(val1, 1); 428 assertEquals(val2, 2); 429 } 430 431 { 432 c.v = new short[1][1]; c.v[0] = new short[0]; short[] val1 = get1(); 433 c.v[0] = new short[0]; short[] val2 = get1(); 434 435 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); 436 } 437 438 { 439 c.v = new short[0][0]; Object[] val1 = get2(); 440 c.v = new short[0][0]; Object[] val2 = get2(); 441 442 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); 443 } 444 } 445 } 446 447 /* ==================================================== */ 448 449 static class ObjectArrayLowerDim2 { 450 public @Stable Object[][] v; 451 452 public static final ObjectArrayLowerDim2 c = new ObjectArrayLowerDim2(); 453 public static short get() { return ((short[][][])c.v)[0][0][0]; } 454 public static short[] get1() { return (short[])(c.v[0][0]); } 455 public static short[][] get2() { return (short[][])(c.v[0]); } 456 public static Object[][] get3() { return c.v; } 457 458 public static void test() throws Exception { 459 { 460 c.v = new short[1][1][1]; ((short[][][])c.v)[0][0][0] = 1; short val1 = get(); 461 ((short[][][])c.v)[0][0][0] = 2; short val2 = get(); 462 463 assertEquals(val1, 1); 464 assertEquals(val2, 2); 465 } 466 467 { 468 c.v = new short[1][1][1]; c.v[0][0] = new short[0]; short[] val1 = get1(); 469 c.v[0][0] = new short[0]; short[] val2 = get1(); 470 471 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); 472 } 473 474 { 475 c.v = new short[1][1][1]; c.v[0] = new short[0][0]; short[][] val1 = get2(); 476 c.v[0] = new short[0][0]; short[][] val2 = get2(); 477 478 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); 479 } 480 481 { 482 c.v = new short[0][0][0]; Object[][] val1 = get3(); 483 c.v = new short[0][0][0]; Object[][] val2 = get3(); 484 485 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); 486 } 487 } 488 } 489 490 /* ==================================================== */ 491 492 static class NestedStableField { 493 static class A { 494 public @Stable short a; 495 496 } 497 public @Stable A v; 498 499 public static final NestedStableField c = new NestedStableField(); 500 public static A get() { return c.v; } 501 public static short get1() { return get().a; } 502 503 public static void test() throws Exception { 504 { 505 c.v = new A(); c.v.a = 1; A val1 = get(); 506 c.v.a = 2; A val2 = get(); 507 508 assertEquals(val1.a, 2); 509 assertEquals(val2.a, 2); 510 } 511 512 { 513 c.v = new A(); c.v.a = 1; short val1 = get1(); 514 c.v.a = 2; short val2 = get1(); 515 c.v = new A(); c.v.a = 3; short val3 = get1(); 516 517 assertEquals(val1, 1); 518 assertEquals(val2, (isStableEnabled ? 1 : 2)); 519 assertEquals(val3, (isStableEnabled ? 1 : 3)); 520 } 521 } 522 } 523 524 /* ==================================================== */ 525 526 static class NestedStableField1 { 527 static class A { 528 public @Stable short a; 529 public @Stable A next; 530 } 531 public @Stable A v; 532 533 public static final NestedStableField1 c = new NestedStableField1(); 534 public static A get() { return c.v.next.next.next.next.next.next.next; } 535 public static short get1() { return get().a; } 536 537 public static void test() throws Exception { 538 { 539 c.v = new A(); c.v.next = new A(); c.v.next.next = c.v; 540 c.v.a = 1; c.v.next.a = 1; A val1 = get(); 541 c.v.a = 2; c.v.next.a = 2; A val2 = get(); 542 543 assertEquals(val1.a, 2); 544 assertEquals(val2.a, 2); 545 } 546 547 { 548 c.v = new A(); c.v.next = c.v; 549 c.v.a = 1; short val1 = get1(); 550 c.v.a = 2; short val2 = get1(); 551 c.v = new A(); c.v.next = c.v; 552 c.v.a = 3; short val3 = get1(); 553 554 assertEquals(val1, 1); 555 assertEquals(val2, (isStableEnabled ? 1 : 2)); 556 assertEquals(val3, (isStableEnabled ? 1 : 3)); 557 } 558 } 559 } 560 /* ==================================================== */ 561 562 static class NestedStableField2 { 563 static class A { 564 public @Stable short a; 565 public @Stable A left; 566 public A right; 567 } 568 569 public @Stable A v; 570 571 public static final NestedStableField2 c = new NestedStableField2(); 572 public static short get() { return c.v.left.left.left.a; } 573 public static short get1() { return c.v.left.left.right.left.a; } 574 575 public static void test() throws Exception { 576 { 577 c.v = new A(); c.v.left = c.v.right = c.v; 578 c.v.a = 1; short val1 = get(); short val2 = get1(); 579 c.v.a = 2; short val3 = get(); short val4 = get1(); 580 581 assertEquals(val1, 1); 582 assertEquals(val3, (isStableEnabled ? 1 : 2)); 583 584 assertEquals(val2, 1); 585 assertEquals(val4, 2); 586 } 587 } 588 } 589 590 /* ==================================================== */ 591 592 static class NestedStableField3 { 593 static class A { 594 public @Stable short a; 595 public @Stable A[] left; 596 public A[] right; 597 } 598 599 public @Stable A[] v; 600 601 public static final NestedStableField3 c = new NestedStableField3(); 602 public static short get() { return c.v[0].left[1].left[0].left[1].a; } 603 public static short get1() { return c.v[1].left[0].left[1].right[0].left[1].a; } 604 605 public static void test() throws Exception { 606 { 607 A elem = new A(); 608 c.v = new A[] { elem, elem }; c.v[0].left = c.v[0].right = c.v; 609 elem.a = 1; short val1 = get(); short val2 = get1(); 610 elem.a = 2; short val3 = get(); short val4 = get1(); 611 612 assertEquals(val1, 1); 613 assertEquals(val3, (isServerWithStable ? 1 : 2)); 614 615 assertEquals(val2, 1); 616 assertEquals(val4, 2); 617 } 618 } 619 } 620 621 /* ==================================================== */ 622 // Auxiliary methods 623 static void assertEquals(int i, int j) { if (i != j) throw new AssertionError(i + " != " + j); } 624 static void assertTrue(boolean b) { if (!b) throw new AssertionError(); } 625 626 static boolean failed = false; 627 628 public static void run(Class<?> test) { 629 Throwable ex = null; 630 System.out.print(test.getName()+": "); 631 try { 632 test.getMethod("test").invoke(null); 633 } catch (InvocationTargetException e) { 634 ex = e.getCause(); 635 } catch (Throwable e) { 636 ex = e; 637 } finally { 638 if (ex == null) { 639 System.out.println("PASSED"); 640 } else { 641 failed = true; 642 System.out.println("FAILED"); 643 ex.printStackTrace(System.out); 644 } 645 } 646 } 647 }