test/compiler/stable/TestStableFloat.java

Fri, 28 Mar 2014 10:13:37 -0700

author
vlivanov
date
Fri, 28 Mar 2014 10:13:37 -0700
changeset 6528
248ff38d2950
child 6747
ee1c924763d2
permissions
-rw-r--r--

8035828: Turn on @Stable support in VM
Reviewed-by: jrose, twisti

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 TestStableFloat
vlivanov@6528 28 * @summary tests on stable fields and arrays
vlivanov@6528 29 * @library /testlibrary
vlivanov@6528 30 * @compile -XDignore.symbol.file TestStableFloat.java
vlivanov@6528 31 * @run main ClassFileInstaller
vlivanov@6528 32 * java/lang/invoke/TestStableFloat
vlivanov@6528 33 * java/lang/invoke/TestStableFloat$FloatStable
vlivanov@6528 34 * java/lang/invoke/TestStableFloat$StaticFloatStable
vlivanov@6528 35 * java/lang/invoke/TestStableFloat$VolatileFloatStable
vlivanov@6528 36 * java/lang/invoke/TestStableFloat$FloatArrayDim1
vlivanov@6528 37 * java/lang/invoke/TestStableFloat$FloatArrayDim2
vlivanov@6528 38 * java/lang/invoke/TestStableFloat$FloatArrayDim3
vlivanov@6528 39 * java/lang/invoke/TestStableFloat$FloatArrayDim4
vlivanov@6528 40 * java/lang/invoke/TestStableFloat$ObjectArrayLowerDim0
vlivanov@6528 41 * java/lang/invoke/TestStableFloat$ObjectArrayLowerDim1
vlivanov@6528 42 * java/lang/invoke/TestStableFloat$NestedStableField
vlivanov@6528 43 * java/lang/invoke/TestStableFloat$NestedStableField$A
vlivanov@6528 44 * java/lang/invoke/TestStableFloat$NestedStableField1
vlivanov@6528 45 * java/lang/invoke/TestStableFloat$NestedStableField1$A
vlivanov@6528 46 * java/lang/invoke/TestStableFloat$NestedStableField2
vlivanov@6528 47 * java/lang/invoke/TestStableFloat$NestedStableField2$A
vlivanov@6528 48 * java/lang/invoke/TestStableFloat$NestedStableField3
vlivanov@6528 49 * java/lang/invoke/TestStableFloat$NestedStableField3$A
vlivanov@6528 50 * java/lang/invoke/TestStableFloat$DefaultValue
vlivanov@6528 51 * java/lang/invoke/TestStableFloat$ObjectArrayLowerDim2
vlivanov@6528 52 *
vlivanov@6528 53 * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
vlivanov@6528 54 * -XX:+UnlockDiagnosticVMOptions -XX:+FoldStableValues -XX:+UseCompressedOop
vlivanov@6528 55 * -server -XX:-TieredCompilation -Xcomp
vlivanov@6528 56 * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
vlivanov@6528 57 * java.lang.invoke.TestStableFloat
vlivanov@6528 58 *
vlivanov@6528 59 * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
vlivanov@6528 60 * -XX:+UnlockDiagnosticVMOptions -XX:+FoldStableValues -XX:-UseCompressedOop
vlivanov@6528 61 * -server -XX:-TieredCompilation -Xcomp
vlivanov@6528 62 * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
vlivanov@6528 63 * java.lang.invoke.TestStableFloat
vlivanov@6528 64 *
vlivanov@6528 65 * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
vlivanov@6528 66 * -XX:+UnlockDiagnosticVMOptions -XX:-FoldStableValues -XX:+UseCompressedOop
vlivanov@6528 67 * -server -XX:-TieredCompilation -Xcomp
vlivanov@6528 68 * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
vlivanov@6528 69 * java.lang.invoke.TestStableFloat
vlivanov@6528 70 *
vlivanov@6528 71 * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
vlivanov@6528 72 * -XX:+UnlockDiagnosticVMOptions -XX:-FoldStableValues -XX:-UseCompressedOop
vlivanov@6528 73 * -server -XX:-TieredCompilation -Xcomp
vlivanov@6528 74 * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
vlivanov@6528 75 * java.lang.invoke.TestStableFloat
vlivanov@6528 76 */
vlivanov@6528 77 package java.lang.invoke;
vlivanov@6528 78
vlivanov@6528 79 import com.sun.management.HotSpotDiagnosticMXBean;
vlivanov@6528 80 import com.sun.management.VMOption;
vlivanov@6528 81 import sun.management.ManagementFactoryHelper;
vlivanov@6528 82 import java.lang.reflect.InvocationTargetException;
vlivanov@6528 83
vlivanov@6528 84 public class TestStableFloat {
vlivanov@6528 85 public static void main(String[] args) throws Exception {
vlivanov@6528 86 System.out.println("@Stable enabled: "+isStableEnabled);
vlivanov@6528 87 System.out.println();
vlivanov@6528 88
vlivanov@6528 89 run(DefaultValue.class);
vlivanov@6528 90 run(FloatStable.class);
vlivanov@6528 91 run(StaticFloatStable.class);
vlivanov@6528 92 run(VolatileFloatStable.class);
vlivanov@6528 93
vlivanov@6528 94 // @Stable arrays: Dim 1-4
vlivanov@6528 95 run(FloatArrayDim1.class);
vlivanov@6528 96 run(FloatArrayDim2.class);
vlivanov@6528 97 run(FloatArrayDim3.class);
vlivanov@6528 98 run(FloatArrayDim4.class);
vlivanov@6528 99
vlivanov@6528 100 // @Stable Object field: dynamic arrays
vlivanov@6528 101 run(ObjectArrayLowerDim0.class);
vlivanov@6528 102 run(ObjectArrayLowerDim1.class);
vlivanov@6528 103 run(ObjectArrayLowerDim2.class);
vlivanov@6528 104
vlivanov@6528 105 // Nested @Stable fields
vlivanov@6528 106 run(NestedStableField.class);
vlivanov@6528 107 run(NestedStableField1.class);
vlivanov@6528 108 run(NestedStableField2.class);
vlivanov@6528 109 run(NestedStableField3.class);
vlivanov@6528 110
vlivanov@6528 111 if (failed) {
vlivanov@6528 112 throw new Error("TEST FAILED");
vlivanov@6528 113 }
vlivanov@6528 114 }
vlivanov@6528 115
vlivanov@6528 116 /* ==================================================== */
vlivanov@6528 117
vlivanov@6528 118 static class DefaultValue {
vlivanov@6528 119 public @Stable float v;
vlivanov@6528 120
vlivanov@6528 121 public static final DefaultValue c = new DefaultValue();
vlivanov@6528 122 public static float get() { return c.v; }
vlivanov@6528 123 public static void test() throws Exception {
vlivanov@6528 124 float val1 = get();
vlivanov@6528 125 c.v = 1.0F; float val2 = get();
vlivanov@6528 126 assertEquals(val1, 0F);
vlivanov@6528 127 assertEquals(val2, 1.0F);
vlivanov@6528 128 }
vlivanov@6528 129 }
vlivanov@6528 130
vlivanov@6528 131 /* ==================================================== */
vlivanov@6528 132
vlivanov@6528 133 static class FloatStable {
vlivanov@6528 134 public @Stable float v;
vlivanov@6528 135
vlivanov@6528 136 public static final FloatStable c = new FloatStable();
vlivanov@6528 137 public static float get() { return c.v; }
vlivanov@6528 138 public static void test() throws Exception {
vlivanov@6528 139 c.v = 1.0F; float val1 = get();
vlivanov@6528 140 c.v = 2.0F; float val2 = get();
vlivanov@6528 141 assertEquals(val1, 1.0F);
vlivanov@6528 142 assertEquals(val2, (isStableEnabled ? 1.0F : 2.0F));
vlivanov@6528 143 }
vlivanov@6528 144 }
vlivanov@6528 145
vlivanov@6528 146 /* ==================================================== */
vlivanov@6528 147
vlivanov@6528 148 static class StaticFloatStable {
vlivanov@6528 149 public static @Stable float v;
vlivanov@6528 150
vlivanov@6528 151 public static final StaticFloatStable c = new StaticFloatStable();
vlivanov@6528 152 public static float get() { return c.v; }
vlivanov@6528 153 public static void test() throws Exception {
vlivanov@6528 154 c.v = 1.0F; float val1 = get();
vlivanov@6528 155 c.v = 2.0F; float val2 = get();
vlivanov@6528 156 assertEquals(val1, 1.0F);
vlivanov@6528 157 assertEquals(val2, (isStableEnabled ? 1.0F : 2.0F));
vlivanov@6528 158 }
vlivanov@6528 159 }
vlivanov@6528 160
vlivanov@6528 161 /* ==================================================== */
vlivanov@6528 162
vlivanov@6528 163 static class VolatileFloatStable {
vlivanov@6528 164 public @Stable volatile float v;
vlivanov@6528 165
vlivanov@6528 166 public static final VolatileFloatStable c = new VolatileFloatStable();
vlivanov@6528 167 public static float get() { return c.v; }
vlivanov@6528 168 public static void test() throws Exception {
vlivanov@6528 169 c.v = 1.0F; float val1 = get();
vlivanov@6528 170 c.v = 2.0F; float val2 = get();
vlivanov@6528 171 assertEquals(val1, 1.0F);
vlivanov@6528 172 assertEquals(val2, (isStableEnabled ? 1.0F : 2.0F));
vlivanov@6528 173 }
vlivanov@6528 174 }
vlivanov@6528 175
vlivanov@6528 176 /* ==================================================== */
vlivanov@6528 177 // @Stable array == field && all components are stable
vlivanov@6528 178
vlivanov@6528 179 static class FloatArrayDim1 {
vlivanov@6528 180 public @Stable float[] v;
vlivanov@6528 181
vlivanov@6528 182 public static final FloatArrayDim1 c = new FloatArrayDim1();
vlivanov@6528 183 public static float get() { return c.v[0]; }
vlivanov@6528 184 public static float get1() { return c.v[10]; }
vlivanov@6528 185 public static float[] get2() { return c.v; }
vlivanov@6528 186 public static void test() throws Exception {
vlivanov@6528 187 {
vlivanov@6528 188 c.v = new float[1]; c.v[0] = 1.0F; float val1 = get();
vlivanov@6528 189 c.v[0] = 2.0F; float val2 = get();
vlivanov@6528 190 assertEquals(val1, 1.0F);
vlivanov@6528 191 assertEquals(val2, (isStableEnabled ? 1.0F : 2.0F));
vlivanov@6528 192
vlivanov@6528 193 c.v = new float[1]; c.v[0] = 3.0F; float val3 = get();
vlivanov@6528 194 assertEquals(val3, (isStableEnabled ? 1.0F : 3.0F));
vlivanov@6528 195 }
vlivanov@6528 196
vlivanov@6528 197 {
vlivanov@6528 198 c.v = new float[20]; c.v[10] = 1.0F; float val1 = get1();
vlivanov@6528 199 c.v[10] = 2.0F; float val2 = get1();
vlivanov@6528 200 assertEquals(val1, 1.0F);
vlivanov@6528 201 assertEquals(val2, (isStableEnabled ? 1.0F : 2.0F));
vlivanov@6528 202
vlivanov@6528 203 c.v = new float[20]; c.v[10] = 3.0F; float val3 = get1();
vlivanov@6528 204 assertEquals(val3, (isStableEnabled ? 1.0F : 3.0F));
vlivanov@6528 205 }
vlivanov@6528 206
vlivanov@6528 207 {
vlivanov@6528 208 c.v = new float[1]; float[] val1 = get2();
vlivanov@6528 209 c.v = new float[1]; float[] val2 = get2();
vlivanov@6528 210 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
vlivanov@6528 211 }
vlivanov@6528 212 }
vlivanov@6528 213 }
vlivanov@6528 214
vlivanov@6528 215 /* ==================================================== */
vlivanov@6528 216
vlivanov@6528 217 static class FloatArrayDim2 {
vlivanov@6528 218 public @Stable float[][] v;
vlivanov@6528 219
vlivanov@6528 220 public static final FloatArrayDim2 c = new FloatArrayDim2();
vlivanov@6528 221 public static float get() { return c.v[0][0]; }
vlivanov@6528 222 public static float[] get1() { return c.v[0]; }
vlivanov@6528 223 public static float[][] get2() { return c.v; }
vlivanov@6528 224 public static void test() throws Exception {
vlivanov@6528 225 {
vlivanov@6528 226 c.v = new float[1][1]; c.v[0][0] = 1.0F; float val1 = get();
vlivanov@6528 227 c.v[0][0] = 2.0F; float val2 = get();
vlivanov@6528 228 assertEquals(val1, 1.0F);
vlivanov@6528 229 assertEquals(val2, (isStableEnabled ? 1.0F : 2.0F));
vlivanov@6528 230
vlivanov@6528 231 c.v = new float[1][1]; c.v[0][0] = 3.0F; float val3 = get();
vlivanov@6528 232 assertEquals(val3, (isStableEnabled ? 1.0F : 3.0F));
vlivanov@6528 233
vlivanov@6528 234 c.v[0] = new float[1]; c.v[0][0] = 4.0F; float val4 = get();
vlivanov@6528 235 assertEquals(val4, (isStableEnabled ? 1.0F : 4.0F));
vlivanov@6528 236 }
vlivanov@6528 237
vlivanov@6528 238 {
vlivanov@6528 239 c.v = new float[1][1]; float[] val1 = get1();
vlivanov@6528 240 c.v[0] = new float[1]; float[] val2 = get1();
vlivanov@6528 241 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
vlivanov@6528 242 }
vlivanov@6528 243
vlivanov@6528 244 {
vlivanov@6528 245 c.v = new float[1][1]; float[][] val1 = get2();
vlivanov@6528 246 c.v = new float[1][1]; float[][] val2 = get2();
vlivanov@6528 247 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
vlivanov@6528 248 }
vlivanov@6528 249 }
vlivanov@6528 250 }
vlivanov@6528 251
vlivanov@6528 252 /* ==================================================== */
vlivanov@6528 253
vlivanov@6528 254 static class FloatArrayDim3 {
vlivanov@6528 255 public @Stable float[][][] v;
vlivanov@6528 256
vlivanov@6528 257 public static final FloatArrayDim3 c = new FloatArrayDim3();
vlivanov@6528 258 public static float get() { return c.v[0][0][0]; }
vlivanov@6528 259 public static float[] get1() { return c.v[0][0]; }
vlivanov@6528 260 public static float[][] get2() { return c.v[0]; }
vlivanov@6528 261 public static float[][][] get3() { return c.v; }
vlivanov@6528 262 public static void test() throws Exception {
vlivanov@6528 263 {
vlivanov@6528 264 c.v = new float[1][1][1]; c.v[0][0][0] = 1.0F; float val1 = get();
vlivanov@6528 265 c.v[0][0][0] = 2.0F; float val2 = get();
vlivanov@6528 266 assertEquals(val1, 1.0F);
vlivanov@6528 267 assertEquals(val2, (isStableEnabled ? 1.0F : 2.0F));
vlivanov@6528 268
vlivanov@6528 269 c.v = new float[1][1][1]; c.v[0][0][0] = 3.0F; float val3 = get();
vlivanov@6528 270 assertEquals(val3, (isStableEnabled ? 1.0F : 3.0F));
vlivanov@6528 271
vlivanov@6528 272 c.v[0] = new float[1][1]; c.v[0][0][0] = 4.0F; float val4 = get();
vlivanov@6528 273 assertEquals(val4, (isStableEnabled ? 1.0F : 4.0F));
vlivanov@6528 274
vlivanov@6528 275 c.v[0][0] = new float[1]; c.v[0][0][0] = 5.0F; float val5 = get();
vlivanov@6528 276 assertEquals(val5, (isStableEnabled ? 1.0F : 5.0F));
vlivanov@6528 277 }
vlivanov@6528 278
vlivanov@6528 279 {
vlivanov@6528 280 c.v = new float[1][1][1]; float[] val1 = get1();
vlivanov@6528 281 c.v[0][0] = new float[1]; float[] val2 = get1();
vlivanov@6528 282 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
vlivanov@6528 283 }
vlivanov@6528 284
vlivanov@6528 285 {
vlivanov@6528 286 c.v = new float[1][1][1]; float[][] val1 = get2();
vlivanov@6528 287 c.v[0] = new float[1][1]; float[][] val2 = get2();
vlivanov@6528 288 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
vlivanov@6528 289 }
vlivanov@6528 290
vlivanov@6528 291 {
vlivanov@6528 292 c.v = new float[1][1][1]; float[][][] val1 = get3();
vlivanov@6528 293 c.v = new float[1][1][1]; float[][][] val2 = get3();
vlivanov@6528 294 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
vlivanov@6528 295 }
vlivanov@6528 296 }
vlivanov@6528 297 }
vlivanov@6528 298
vlivanov@6528 299 /* ==================================================== */
vlivanov@6528 300
vlivanov@6528 301 static class FloatArrayDim4 {
vlivanov@6528 302 public @Stable float[][][][] v;
vlivanov@6528 303
vlivanov@6528 304 public static final FloatArrayDim4 c = new FloatArrayDim4();
vlivanov@6528 305 public static float get() { return c.v[0][0][0][0]; }
vlivanov@6528 306 public static float[] get1() { return c.v[0][0][0]; }
vlivanov@6528 307 public static float[][] get2() { return c.v[0][0]; }
vlivanov@6528 308 public static float[][][] get3() { return c.v[0]; }
vlivanov@6528 309 public static float[][][][] get4() { return c.v; }
vlivanov@6528 310 public static void test() throws Exception {
vlivanov@6528 311 {
vlivanov@6528 312 c.v = new float[1][1][1][1]; c.v[0][0][0][0] = 1.0F; float val1 = get();
vlivanov@6528 313 c.v[0][0][0][0] = 2.0F; float val2 = get();
vlivanov@6528 314 assertEquals(val1, 1.0F);
vlivanov@6528 315 assertEquals(val2, (isStableEnabled ? 1.0F : 2.0F));
vlivanov@6528 316
vlivanov@6528 317 c.v = new float[1][1][1][1]; c.v[0][0][0][0] = 3.0F; float val3 = get();
vlivanov@6528 318 assertEquals(val3, (isStableEnabled ? 1.0F : 3.0F));
vlivanov@6528 319
vlivanov@6528 320 c.v[0] = new float[1][1][1]; c.v[0][0][0][0] = 4.0F; float val4 = get();
vlivanov@6528 321 assertEquals(val4, (isStableEnabled ? 1.0F : 4.0F));
vlivanov@6528 322
vlivanov@6528 323 c.v[0][0] = new float[1][1]; c.v[0][0][0][0] = 5.0F; float val5 = get();
vlivanov@6528 324 assertEquals(val5, (isStableEnabled ? 1.0F : 5.0F));
vlivanov@6528 325
vlivanov@6528 326 c.v[0][0][0] = new float[1]; c.v[0][0][0][0] = 6.0F; float val6 = get();
vlivanov@6528 327 assertEquals(val6, (isStableEnabled ? 1.0F : 6.0F));
vlivanov@6528 328 }
vlivanov@6528 329
vlivanov@6528 330 {
vlivanov@6528 331 c.v = new float[1][1][1][1]; float[] val1 = get1();
vlivanov@6528 332 c.v[0][0][0] = new float[1]; float[] val2 = get1();
vlivanov@6528 333 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
vlivanov@6528 334 }
vlivanov@6528 335
vlivanov@6528 336 {
vlivanov@6528 337 c.v = new float[1][1][1][1]; float[][] val1 = get2();
vlivanov@6528 338 c.v[0][0] = new float[1][1]; float[][] val2 = get2();
vlivanov@6528 339 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
vlivanov@6528 340 }
vlivanov@6528 341
vlivanov@6528 342 {
vlivanov@6528 343 c.v = new float[1][1][1][1]; float[][][] val1 = get3();
vlivanov@6528 344 c.v[0] = new float[1][1][1]; float[][][] val2 = get3();
vlivanov@6528 345 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
vlivanov@6528 346 }
vlivanov@6528 347
vlivanov@6528 348 {
vlivanov@6528 349 c.v = new float[1][1][1][1]; float[][][][] val1 = get4();
vlivanov@6528 350 c.v = new float[1][1][1][1]; float[][][][] val2 = get4();
vlivanov@6528 351 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
vlivanov@6528 352 }
vlivanov@6528 353
vlivanov@6528 354 }
vlivanov@6528 355 }
vlivanov@6528 356
vlivanov@6528 357 /* ==================================================== */
vlivanov@6528 358 // Dynamic Dim is higher than static
vlivanov@6528 359
vlivanov@6528 360 static class ObjectArrayLowerDim0 {
vlivanov@6528 361 public @Stable Object v;
vlivanov@6528 362
vlivanov@6528 363 public static final ObjectArrayLowerDim0 c = new ObjectArrayLowerDim0();
vlivanov@6528 364 public static float get() { return ((float[])c.v)[0]; }
vlivanov@6528 365 public static float[] get1() { return (float[])c.v; }
vlivanov@6528 366
vlivanov@6528 367 public static void test() throws Exception {
vlivanov@6528 368 {
vlivanov@6528 369 c.v = new float[1]; ((float[])c.v)[0] = 1.0F; float val1 = get();
vlivanov@6528 370 ((float[])c.v)[0] = 2.0F; float val2 = get();
vlivanov@6528 371
vlivanov@6528 372 assertEquals(val1, 1.0F);
vlivanov@6528 373 assertEquals(val2, 2.0F);
vlivanov@6528 374 }
vlivanov@6528 375
vlivanov@6528 376 {
vlivanov@6528 377 c.v = new float[1]; float[] val1 = get1();
vlivanov@6528 378 c.v = new float[1]; float[] val2 = get1();
vlivanov@6528 379 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
vlivanov@6528 380 }
vlivanov@6528 381 }
vlivanov@6528 382 }
vlivanov@6528 383
vlivanov@6528 384 /* ==================================================== */
vlivanov@6528 385
vlivanov@6528 386 static class ObjectArrayLowerDim1 {
vlivanov@6528 387 public @Stable Object[] v;
vlivanov@6528 388
vlivanov@6528 389 public static final ObjectArrayLowerDim1 c = new ObjectArrayLowerDim1();
vlivanov@6528 390 public static float get() { return ((float[][])c.v)[0][0]; }
vlivanov@6528 391 public static float[] get1() { return (float[])(c.v[0]); }
vlivanov@6528 392 public static Object[] get2() { return c.v; }
vlivanov@6528 393
vlivanov@6528 394 public static void test() throws Exception {
vlivanov@6528 395 {
vlivanov@6528 396 c.v = new float[1][1]; ((float[][])c.v)[0][0] = 1.0F; float val1 = get();
vlivanov@6528 397 ((float[][])c.v)[0][0] = 2.0F; float val2 = get();
vlivanov@6528 398
vlivanov@6528 399 assertEquals(val1, 1.0F);
vlivanov@6528 400 assertEquals(val2, 2.0F);
vlivanov@6528 401 }
vlivanov@6528 402
vlivanov@6528 403 {
vlivanov@6528 404 c.v = new float[1][1]; c.v[0] = new float[0]; float[] val1 = get1();
vlivanov@6528 405 c.v[0] = new float[0]; float[] val2 = get1();
vlivanov@6528 406
vlivanov@6528 407 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
vlivanov@6528 408 }
vlivanov@6528 409
vlivanov@6528 410 {
vlivanov@6528 411 c.v = new float[0][0]; Object[] val1 = get2();
vlivanov@6528 412 c.v = new float[0][0]; Object[] val2 = get2();
vlivanov@6528 413
vlivanov@6528 414 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
vlivanov@6528 415 }
vlivanov@6528 416 }
vlivanov@6528 417 }
vlivanov@6528 418
vlivanov@6528 419 /* ==================================================== */
vlivanov@6528 420
vlivanov@6528 421 static class ObjectArrayLowerDim2 {
vlivanov@6528 422 public @Stable Object[][] v;
vlivanov@6528 423
vlivanov@6528 424 public static final ObjectArrayLowerDim2 c = new ObjectArrayLowerDim2();
vlivanov@6528 425 public static float get() { return ((float[][][])c.v)[0][0][0]; }
vlivanov@6528 426 public static float[] get1() { return (float[])(c.v[0][0]); }
vlivanov@6528 427 public static float[][] get2() { return (float[][])(c.v[0]); }
vlivanov@6528 428 public static Object[][] get3() { return c.v; }
vlivanov@6528 429
vlivanov@6528 430 public static void test() throws Exception {
vlivanov@6528 431 {
vlivanov@6528 432 c.v = new float[1][1][1]; ((float[][][])c.v)[0][0][0] = 1.0F; float val1 = get();
vlivanov@6528 433 ((float[][][])c.v)[0][0][0] = 2.0F; float val2 = get();
vlivanov@6528 434
vlivanov@6528 435 assertEquals(val1, 1.0F);
vlivanov@6528 436 assertEquals(val2, 2.0F);
vlivanov@6528 437 }
vlivanov@6528 438
vlivanov@6528 439 {
vlivanov@6528 440 c.v = new float[1][1][1]; c.v[0][0] = new float[0]; float[] val1 = get1();
vlivanov@6528 441 c.v[0][0] = new float[0]; float[] val2 = get1();
vlivanov@6528 442
vlivanov@6528 443 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
vlivanov@6528 444 }
vlivanov@6528 445
vlivanov@6528 446 {
vlivanov@6528 447 c.v = new float[1][1][1]; c.v[0] = new float[0][0]; float[][] val1 = get2();
vlivanov@6528 448 c.v[0] = new float[0][0]; float[][] val2 = get2();
vlivanov@6528 449
vlivanov@6528 450 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));
vlivanov@6528 451 }
vlivanov@6528 452
vlivanov@6528 453 {
vlivanov@6528 454 c.v = new float[0][0][0]; Object[][] val1 = get3();
vlivanov@6528 455 c.v = new float[0][0][0]; Object[][] val2 = get3();
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 NestedStableField {
vlivanov@6528 465 static class A {
vlivanov@6528 466 public @Stable float a;
vlivanov@6528 467
vlivanov@6528 468 }
vlivanov@6528 469 public @Stable A v;
vlivanov@6528 470
vlivanov@6528 471 public static final NestedStableField c = new NestedStableField();
vlivanov@6528 472 public static A get() { return c.v; }
vlivanov@6528 473 public static float get1() { return get().a; }
vlivanov@6528 474
vlivanov@6528 475 public static void test() throws Exception {
vlivanov@6528 476 {
vlivanov@6528 477 c.v = new A(); c.v.a = 1.0F; A val1 = get();
vlivanov@6528 478 c.v.a = 2.0F; A val2 = get();
vlivanov@6528 479
vlivanov@6528 480 assertEquals(val1.a, 2.0F);
vlivanov@6528 481 assertEquals(val2.a, 2.0F);
vlivanov@6528 482 }
vlivanov@6528 483
vlivanov@6528 484 {
vlivanov@6528 485 c.v = new A(); c.v.a = 1.0F; float val1 = get1();
vlivanov@6528 486 c.v.a = 2.0F; float val2 = get1();
vlivanov@6528 487 c.v = new A(); c.v.a = 3.0F; float val3 = get1();
vlivanov@6528 488
vlivanov@6528 489 assertEquals(val1, 1.0F);
vlivanov@6528 490 assertEquals(val2, (isStableEnabled ? 1.0F : 2.0F));
vlivanov@6528 491 assertEquals(val3, (isStableEnabled ? 1.0F : 3.0F));
vlivanov@6528 492 }
vlivanov@6528 493 }
vlivanov@6528 494 }
vlivanov@6528 495
vlivanov@6528 496 /* ==================================================== */
vlivanov@6528 497
vlivanov@6528 498 static class NestedStableField1 {
vlivanov@6528 499 static class A {
vlivanov@6528 500 public @Stable float a;
vlivanov@6528 501 public @Stable A next;
vlivanov@6528 502 }
vlivanov@6528 503 public @Stable A v;
vlivanov@6528 504
vlivanov@6528 505 public static final NestedStableField1 c = new NestedStableField1();
vlivanov@6528 506 public static A get() { return c.v.next.next.next.next.next.next.next; }
vlivanov@6528 507 public static float get1() { return get().a; }
vlivanov@6528 508
vlivanov@6528 509 public static void test() throws Exception {
vlivanov@6528 510 {
vlivanov@6528 511 c.v = new A(); c.v.next = new A(); c.v.next.next = c.v;
vlivanov@6528 512 c.v.a = 1.0F; c.v.next.a = 1.0F; A val1 = get();
vlivanov@6528 513 c.v.a = 2.0F; c.v.next.a = 2.0F; A val2 = get();
vlivanov@6528 514
vlivanov@6528 515 assertEquals(val1.a, 2.0F);
vlivanov@6528 516 assertEquals(val2.a, 2.0F);
vlivanov@6528 517 }
vlivanov@6528 518
vlivanov@6528 519 {
vlivanov@6528 520 c.v = new A(); c.v.next = c.v;
vlivanov@6528 521 c.v.a = 1.0F; float val1 = get1();
vlivanov@6528 522 c.v.a = 2.0F; float val2 = get1();
vlivanov@6528 523 c.v = new A(); c.v.next = c.v;
vlivanov@6528 524 c.v.a = 3.0F; float val3 = get1();
vlivanov@6528 525
vlivanov@6528 526 assertEquals(val1, 1.0F);
vlivanov@6528 527 assertEquals(val2, (isStableEnabled ? 1.0F : 2.0F));
vlivanov@6528 528 assertEquals(val3, (isStableEnabled ? 1.0F : 3.0F));
vlivanov@6528 529 }
vlivanov@6528 530 }
vlivanov@6528 531 }
vlivanov@6528 532 /* ==================================================== */
vlivanov@6528 533
vlivanov@6528 534 static class NestedStableField2 {
vlivanov@6528 535 static class A {
vlivanov@6528 536 public @Stable float a;
vlivanov@6528 537 public @Stable A left;
vlivanov@6528 538 public A right;
vlivanov@6528 539 }
vlivanov@6528 540
vlivanov@6528 541 public @Stable A v;
vlivanov@6528 542
vlivanov@6528 543 public static final NestedStableField2 c = new NestedStableField2();
vlivanov@6528 544 public static float get() { return c.v.left.left.left.a; }
vlivanov@6528 545 public static float get1() { return c.v.left.left.right.left.a; }
vlivanov@6528 546
vlivanov@6528 547 public static void test() throws Exception {
vlivanov@6528 548 {
vlivanov@6528 549 c.v = new A(); c.v.left = c.v.right = c.v;
vlivanov@6528 550 c.v.a = 1.0F; float val1 = get(); float val2 = get1();
vlivanov@6528 551 c.v.a = 2.0F; float val3 = get(); float val4 = get1();
vlivanov@6528 552
vlivanov@6528 553 assertEquals(val1, 1.0F);
vlivanov@6528 554 assertEquals(val3, (isStableEnabled ? 1.0F : 2.0F));
vlivanov@6528 555
vlivanov@6528 556 assertEquals(val2, 1.0F);
vlivanov@6528 557 assertEquals(val4, 2.0F);
vlivanov@6528 558 }
vlivanov@6528 559 }
vlivanov@6528 560 }
vlivanov@6528 561
vlivanov@6528 562 /* ==================================================== */
vlivanov@6528 563
vlivanov@6528 564 static class NestedStableField3 {
vlivanov@6528 565 static class A {
vlivanov@6528 566 public @Stable float a;
vlivanov@6528 567 public @Stable A[] left;
vlivanov@6528 568 public A[] right;
vlivanov@6528 569 }
vlivanov@6528 570
vlivanov@6528 571 public @Stable A[] v;
vlivanov@6528 572
vlivanov@6528 573 public static final NestedStableField3 c = new NestedStableField3();
vlivanov@6528 574 public static float get() { return c.v[0].left[1].left[0].left[1].a; }
vlivanov@6528 575 public static float get1() { return c.v[1].left[0].left[1].right[0].left[1].a; }
vlivanov@6528 576
vlivanov@6528 577 public static void test() throws Exception {
vlivanov@6528 578 {
vlivanov@6528 579 A elem = new A();
vlivanov@6528 580 c.v = new A[] { elem, elem }; c.v[0].left = c.v[0].right = c.v;
vlivanov@6528 581 elem.a = 1.0F; float val1 = get(); float val2 = get1();
vlivanov@6528 582 elem.a = 2.0F; float val3 = get(); float val4 = get1();
vlivanov@6528 583
vlivanov@6528 584 assertEquals(val1, 1.0F);
vlivanov@6528 585 assertEquals(val3, (isStableEnabled ? 1.0F : 2.0F));
vlivanov@6528 586
vlivanov@6528 587 assertEquals(val2, 1.0F);
vlivanov@6528 588 assertEquals(val4, 2.0F);
vlivanov@6528 589 }
vlivanov@6528 590 }
vlivanov@6528 591 }
vlivanov@6528 592
vlivanov@6528 593 /* ==================================================== */
vlivanov@6528 594 // Auxiliary methods
vlivanov@6528 595 static void assertEquals(float i, float j) { if (i != j) throw new AssertionError(i + " != " + j); }
vlivanov@6528 596 static void assertTrue(boolean b) { if (!b) throw new AssertionError(); }
vlivanov@6528 597
vlivanov@6528 598 static boolean failed = false;
vlivanov@6528 599
vlivanov@6528 600 public static void run(Class<?> test) {
vlivanov@6528 601 Throwable ex = null;
vlivanov@6528 602 System.out.print(test.getName()+": ");
vlivanov@6528 603 try {
vlivanov@6528 604 test.getMethod("test").invoke(null);
vlivanov@6528 605 } catch (InvocationTargetException e) {
vlivanov@6528 606 ex = e.getCause();
vlivanov@6528 607 } catch (Throwable e) {
vlivanov@6528 608 ex = e;
vlivanov@6528 609 } finally {
vlivanov@6528 610 if (ex == null) {
vlivanov@6528 611 System.out.println("PASSED");
vlivanov@6528 612 } else {
vlivanov@6528 613 failed = true;
vlivanov@6528 614 System.out.println("FAILED");
vlivanov@6528 615 ex.printStackTrace(System.out);
vlivanov@6528 616 }
vlivanov@6528 617 }
vlivanov@6528 618 }
vlivanov@6528 619
vlivanov@6528 620 static final boolean isStableEnabled;
vlivanov@6528 621 static {
vlivanov@6528 622 HotSpotDiagnosticMXBean diagnostic
vlivanov@6528 623 = ManagementFactoryHelper.getDiagnosticMXBean();
vlivanov@6528 624 VMOption tmp;
vlivanov@6528 625 try {
vlivanov@6528 626 tmp = diagnostic.getVMOption("FoldStableValues");
vlivanov@6528 627 } catch (IllegalArgumentException e) {
vlivanov@6528 628 tmp = null;
vlivanov@6528 629 }
vlivanov@6528 630 isStableEnabled = (tmp == null ? false : Boolean.parseBoolean(tmp.getValue()));
vlivanov@6528 631 }
vlivanov@6528 632 }

mercurial