test/compiler/stable/TestStableObject.java

Mon, 28 Jul 2014 15:06:38 -0700

author
fzhinkin
date
Mon, 28 Jul 2014 15:06:38 -0700
changeset 6997
dbb05f6d93c4
parent 6747
ee1c924763d2
child 6876
710a3c8b516e
child 7787
1ec24746bb40
permissions
-rw-r--r--

8051344: JVM crashed in Compile::start() during method parsing w/ UseRTMDeopt turned on
Summary: call rtm_deopt() only if there were no compilation bailouts before.
Reviewed-by: kvn

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

mercurial