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) {
|