VarHandleTestMethodHandleAccessFloat.java revision 15539:74cfa7836890
1270866Simp/*
2270866Simp * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
3270866Simp * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4270866Simp *
5270866Simp * This code is free software; you can redistribute it and/or modify it
6270866Simp * under the terms of the GNU General Public License version 2 only, as
7270866Simp * published by the Free Software Foundation.
8270866Simp *
9270866Simp * This code is distributed in the hope that it will be useful, but WITHOUT
10270866Simp * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11270866Simp * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12270866Simp * version 2 for more details (a copy is included in the LICENSE file that
13270866Simp * accompanied this code).
14270866Simp *
15270866Simp * You should have received a copy of the GNU General Public License version
16270866Simp * 2 along with this work; if not, write to the Free Software Foundation,
17270866Simp * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18270866Simp *
19270866Simp * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20270866Simp * or visit www.oracle.com if you need additional information or have any
21270866Simp * questions.
22270866Simp */
23270866Simp
24270866Simp/*
25270866Simp * @test
26270866Simp * @run testng/othervm -Diters=20000 VarHandleTestMethodHandleAccessFloat
27270866Simp */
28270866Simp
29270866Simpimport org.testng.annotations.BeforeClass;
30270866Simpimport org.testng.annotations.DataProvider;
31270866Simpimport org.testng.annotations.Test;
32270866Simp
33270866Simpimport java.lang.invoke.MethodHandles;
34270866Simpimport java.lang.invoke.VarHandle;
35270866Simpimport java.util.ArrayList;
36270866Simpimport java.util.Arrays;
37270866Simpimport java.util.List;
38270866Simp
39270866Simpimport static org.testng.Assert.*;
40270866Simp
41270866Simppublic class VarHandleTestMethodHandleAccessFloat extends VarHandleBaseTest {
42270866Simp    static final float static_final_v = 1.0f;
43270866Simp
44270866Simp    static float static_v;
45270866Simp
46270866Simp    final float final_v = 1.0f;
47270866Simp
48270866Simp    float v;
49270866Simp
50270866Simp    VarHandle vhFinalField;
51270866Simp
52270866Simp    VarHandle vhField;
53270866Simp
54270866Simp    VarHandle vhStaticField;
55270866Simp
56270866Simp    VarHandle vhStaticFinalField;
57270866Simp
58270866Simp    VarHandle vhArray;
59270866Simp
60270866Simp    @BeforeClass
61270866Simp    public void setup() throws Exception {
62270866Simp        vhFinalField = MethodHandles.lookup().findVarHandle(
63270866Simp                VarHandleTestMethodHandleAccessFloat.class, "final_v", float.class);
64270866Simp
65270866Simp        vhField = MethodHandles.lookup().findVarHandle(
66270866Simp                VarHandleTestMethodHandleAccessFloat.class, "v", float.class);
67270866Simp
68270866Simp        vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle(
69270866Simp            VarHandleTestMethodHandleAccessFloat.class, "static_final_v", float.class);
70270866Simp
71270866Simp        vhStaticField = MethodHandles.lookup().findStaticVarHandle(
72270866Simp            VarHandleTestMethodHandleAccessFloat.class, "static_v", float.class);
73270866Simp
74270866Simp        vhArray = MethodHandles.arrayElementVarHandle(float[].class);
75270866Simp    }
76270866Simp
77270866Simp
78270866Simp    @DataProvider
79270866Simp    public Object[][] accessTestCaseProvider() throws Exception {
80270866Simp        List<AccessTestCase<?>> cases = new ArrayList<>();
81270866Simp
82270866Simp        for (VarHandleToMethodHandle f : VarHandleToMethodHandle.values()) {
83270866Simp            cases.add(new MethodHandleAccessTestCase("Instance field",
84270866Simp                                                     vhField, f, hs -> testInstanceField(this, hs)));
85270866Simp            cases.add(new MethodHandleAccessTestCase("Instance field unsupported",
86270866Simp                                                     vhField, f, hs -> testInstanceFieldUnsupported(this, hs),
87270866Simp                                                     false));
88270866Simp
89270866Simp            cases.add(new MethodHandleAccessTestCase("Static field",
90270866Simp                                                     vhStaticField, f, VarHandleTestMethodHandleAccessFloat::testStaticField));
91270866Simp            cases.add(new MethodHandleAccessTestCase("Static field unsupported",
92270866Simp                                                     vhStaticField, f, VarHandleTestMethodHandleAccessFloat::testStaticFieldUnsupported,
93270866Simp                                                     false));
94270866Simp
95270866Simp            cases.add(new MethodHandleAccessTestCase("Array",
96270866Simp                                                     vhArray, f, VarHandleTestMethodHandleAccessFloat::testArray));
97270866Simp            cases.add(new MethodHandleAccessTestCase("Array unsupported",
98270866Simp                                                     vhArray, f, VarHandleTestMethodHandleAccessFloat::testArrayUnsupported,
99270866Simp                                                     false));
100270866Simp            cases.add(new MethodHandleAccessTestCase("Array index out of bounds",
101270866Simp                                                     vhArray, f, VarHandleTestMethodHandleAccessFloat::testArrayIndexOutOfBounds,
102270866Simp                                                     false));
103270866Simp        }
104270866Simp
105270866Simp        // Work around issue with jtreg summary reporting which truncates
106270866Simp        // the String result of Object.toString to 30 characters, hence
107270866Simp        // the first dummy argument
108270866Simp        return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new);
109270866Simp    }
110270866Simp
111270866Simp    @Test(dataProvider = "accessTestCaseProvider")
112270866Simp    public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable {
113270866Simp        T t = atc.get();
114270866Simp        int iters = atc.requiresLoop() ? ITERS : 1;
115270866Simp        for (int c = 0; c < iters; c++) {
116270866Simp            atc.testAccess(t);
117270866Simp        }
118270866Simp    }
119270866Simp
120270866Simp
121270866Simp    static void testInstanceField(VarHandleTestMethodHandleAccessFloat recv, Handles hs) throws Throwable {
122270866Simp        // Plain
123270866Simp        {
124270866Simp            hs.get(TestAccessMode.SET).invokeExact(recv, 1.0f);
125270866Simp            float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv);
126270866Simp            assertEquals(x, 1.0f, "set float value");
127270866Simp        }
128270866Simp
129270866Simp
130270866Simp        // Volatile
131270866Simp        {
132270866Simp            hs.get(TestAccessMode.SET_VOLATILE).invokeExact(recv, 2.0f);
133270866Simp            float x = (float) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(recv);
134270866Simp            assertEquals(x, 2.0f, "setVolatile float value");
135270866Simp        }
136270866Simp
137270866Simp        // Lazy
138270866Simp        {
139270866Simp            hs.get(TestAccessMode.SET_RELEASE).invokeExact(recv, 1.0f);
140270866Simp            float x = (float) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(recv);
141270866Simp            assertEquals(x, 1.0f, "setRelease float value");
142270866Simp        }
143270866Simp
144270866Simp        // Opaque
145270866Simp        {
146270866Simp            hs.get(TestAccessMode.SET_OPAQUE).invokeExact(recv, 2.0f);
147270866Simp            float x = (float) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(recv);
148270866Simp            assertEquals(x, 2.0f, "setOpaque float value");
149270866Simp        }
150270866Simp
151270866Simp        hs.get(TestAccessMode.SET).invokeExact(recv, 1.0f);
152270866Simp
153270866Simp        // Compare
154270866Simp        {
155270866Simp            boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, 1.0f, 2.0f);
156270866Simp            assertEquals(r, true, "success compareAndSet float");
157270866Simp            float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv);
158270866Simp            assertEquals(x, 2.0f, "success compareAndSet float value");
159270866Simp        }
160270866Simp
161270866Simp        {
162270866Simp            boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, 1.0f, 3.0f);
163270866Simp            assertEquals(r, false, "failing compareAndSet float");
164270866Simp            float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv);
165270866Simp            assertEquals(x, 2.0f, "failing compareAndSet float value");
166270866Simp        }
167270866Simp
168270866Simp        {
169270866Simp            float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, 2.0f, 1.0f);
170270866Simp            assertEquals(r, 2.0f, "success compareAndExchange float");
171270866Simp            float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv);
172270866Simp            assertEquals(x, 1.0f, "success compareAndExchange float value");
173270866Simp        }
174270866Simp
175270866Simp        {
176270866Simp            float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, 2.0f, 3.0f);
177270866Simp            assertEquals(r, 1.0f, "failing compareAndExchange float");
178270866Simp            float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv);
179270866Simp            assertEquals(x, 1.0f, "failing compareAndExchange float value");
180270866Simp        }
181270866Simp
182270866Simp        {
183270866Simp            float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, 1.0f, 2.0f);
184270866Simp            assertEquals(r, 1.0f, "success compareAndExchangeAcquire float");
185270866Simp            float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv);
186270866Simp            assertEquals(x, 2.0f, "success compareAndExchangeAcquire float value");
187270866Simp        }
188270866Simp
189270866Simp        {
190270866Simp            float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, 1.0f, 3.0f);
191270866Simp            assertEquals(r, 2.0f, "failing compareAndExchangeAcquire float");
192270866Simp            float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv);
193270866Simp            assertEquals(x, 2.0f, "failing compareAndExchangeAcquire float value");
194270866Simp        }
195270866Simp
196270866Simp        {
197270866Simp            float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, 2.0f, 1.0f);
198270866Simp            assertEquals(r, 2.0f, "success compareAndExchangeRelease float");
199270866Simp            float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv);
200270866Simp            assertEquals(x, 1.0f, "success compareAndExchangeRelease float value");
201270866Simp        }
202270866Simp
203270866Simp        {
204270866Simp            float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, 2.0f, 3.0f);
205270866Simp            assertEquals(r, 1.0f, "failing compareAndExchangeRelease float");
206270866Simp            float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv);
207270866Simp            assertEquals(x, 1.0f, "failing compareAndExchangeRelease float value");
208270866Simp        }
209270866Simp
210270866Simp        {
211270866Simp            boolean success = false;
212270866Simp            for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
213270866Simp                success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(recv, 1.0f, 2.0f);
214270866Simp            }
215270866Simp            assertEquals(success, true, "weakCompareAndSet float");
216270866Simp            float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv);
217270866Simp            assertEquals(x, 2.0f, "weakCompareAndSet float value");
218270866Simp        }
219270866Simp
220270866Simp        {
221270866Simp            boolean success = false;
222270866Simp            for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
223270866Simp                success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, 2.0f, 1.0f);
224270866Simp            }
225270866Simp            assertEquals(success, true, "weakCompareAndSetAcquire float");
226270866Simp            float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv);
227270866Simp            assertEquals(x, 1.0f, "weakCompareAndSetAcquire float");
228270866Simp        }
229270866Simp
230270866Simp        {
231270866Simp            boolean success = false;
232270866Simp            for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
233270866Simp                success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, 1.0f, 2.0f);
234270866Simp            }
235270866Simp            assertEquals(success, true, "weakCompareAndSetRelease float");
236270866Simp            float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv);
237270866Simp            assertEquals(x, 2.0f, "weakCompareAndSetRelease float");
238270866Simp        }
239270866Simp
240270866Simp        {
241270866Simp            boolean success = false;
242270866Simp            for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
243270866Simp                success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(recv, 2.0f, 1.0f);
244270866Simp            }
245270866Simp            assertEquals(success, true, "weakCompareAndSetVolatile float");
246270866Simp            float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv);
247270866Simp            assertEquals(x, 1.0f, "weakCompareAndSetVolatile float");
248270866Simp        }
249270866Simp
250270866Simp        // Compare set and get
251270866Simp        {
252270866Simp            float o = (float) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, 2.0f);
253270866Simp            assertEquals(o, 1.0f, "getAndSet float");
254270866Simp            float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv);
255270866Simp            assertEquals(x, 2.0f, "getAndSet float value");
256270866Simp        }
257270866Simp
258270866Simp        // get and add, add and get
259270866Simp        {
260270866Simp            hs.get(TestAccessMode.SET).invokeExact(recv, 1.0f);
261270866Simp
262270866Simp            float o = (float) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(recv, 3.0f);
263270866Simp            assertEquals(o, 1.0f, "getAndAdd float");
264270866Simp            float c = (float) hs.get(TestAccessMode.ADD_AND_GET).invokeExact(recv, 3.0f);
265270866Simp            assertEquals(c, (float)(1.0f + 3.0f + 3.0f), "getAndAdd float value");
266270866Simp        }
267270866Simp
268270866Simp        {
269270866Simp            hs.get(TestAccessMode.SET).invokeExact(recv, 1.0f);
270270866Simp
271270866Simp            float o = (float) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(recv, 2.0f);
272270866Simp            assertEquals(o, 1.0f, "getAndAddAcquire float");
273270866Simp            float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv);
274270866Simp            assertEquals(x, (float)(1.0f + 2.0f), "getAndAddAcquire float value");
275270866Simp        }
276270866Simp
277270866Simp        {
278            hs.get(TestAccessMode.SET).invokeExact(recv, 1.0f);
279
280            float o = (float) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(recv, 2.0f);
281            assertEquals(o, 1.0f, "getAndAddRelease float");
282            float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv);
283            assertEquals(x, (float)(1.0f + 2.0f), "getAndAddRelease float value");
284        }
285
286    }
287
288    static void testInstanceFieldUnsupported(VarHandleTestMethodHandleAccessFloat recv, Handles hs) throws Throwable {
289
290
291        for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
292            checkUOE(am, () -> {
293                float r = (float) hs.get(am).invokeExact(recv, 1.0f);
294            });
295        }
296    }
297
298
299    static void testStaticField(Handles hs) throws Throwable {
300        // Plain
301        {
302            hs.get(TestAccessMode.SET).invokeExact(1.0f);
303            float x = (float) hs.get(TestAccessMode.GET).invokeExact();
304            assertEquals(x, 1.0f, "set float value");
305        }
306
307
308        // Volatile
309        {
310            hs.get(TestAccessMode.SET_VOLATILE).invokeExact(2.0f);
311            float x = (float) hs.get(TestAccessMode.GET_VOLATILE).invokeExact();
312            assertEquals(x, 2.0f, "setVolatile float value");
313        }
314
315        // Lazy
316        {
317            hs.get(TestAccessMode.SET_RELEASE).invokeExact(1.0f);
318            float x = (float) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact();
319            assertEquals(x, 1.0f, "setRelease float value");
320        }
321
322        // Opaque
323        {
324            hs.get(TestAccessMode.SET_OPAQUE).invokeExact(2.0f);
325            float x = (float) hs.get(TestAccessMode.GET_OPAQUE).invokeExact();
326            assertEquals(x, 2.0f, "setOpaque float value");
327        }
328
329        hs.get(TestAccessMode.SET).invokeExact(1.0f);
330
331        // Compare
332        {
333            boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(1.0f, 2.0f);
334            assertEquals(r, true, "success compareAndSet float");
335            float x = (float) hs.get(TestAccessMode.GET).invokeExact();
336            assertEquals(x, 2.0f, "success compareAndSet float value");
337        }
338
339        {
340            boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(1.0f, 3.0f);
341            assertEquals(r, false, "failing compareAndSet float");
342            float x = (float) hs.get(TestAccessMode.GET).invokeExact();
343            assertEquals(x, 2.0f, "failing compareAndSet float value");
344        }
345
346        {
347            float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(2.0f, 1.0f);
348            assertEquals(r, 2.0f, "success compareAndExchange float");
349            float x = (float) hs.get(TestAccessMode.GET).invokeExact();
350            assertEquals(x, 1.0f, "success compareAndExchange float value");
351        }
352
353        {
354            float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(2.0f, 3.0f);
355            assertEquals(r, 1.0f, "failing compareAndExchange float");
356            float x = (float) hs.get(TestAccessMode.GET).invokeExact();
357            assertEquals(x, 1.0f, "failing compareAndExchange float value");
358        }
359
360        {
361            float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(1.0f, 2.0f);
362            assertEquals(r, 1.0f, "success compareAndExchangeAcquire float");
363            float x = (float) hs.get(TestAccessMode.GET).invokeExact();
364            assertEquals(x, 2.0f, "success compareAndExchangeAcquire float value");
365        }
366
367        {
368            float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(1.0f, 3.0f);
369            assertEquals(r, 2.0f, "failing compareAndExchangeAcquire float");
370            float x = (float) hs.get(TestAccessMode.GET).invokeExact();
371            assertEquals(x, 2.0f, "failing compareAndExchangeAcquire float value");
372        }
373
374        {
375            float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(2.0f, 1.0f);
376            assertEquals(r, 2.0f, "success compareAndExchangeRelease float");
377            float x = (float) hs.get(TestAccessMode.GET).invokeExact();
378            assertEquals(x, 1.0f, "success compareAndExchangeRelease float value");
379        }
380
381        {
382            float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(2.0f, 3.0f);
383            assertEquals(r, 1.0f, "failing compareAndExchangeRelease float");
384            float x = (float) hs.get(TestAccessMode.GET).invokeExact();
385            assertEquals(x, 1.0f, "failing compareAndExchangeRelease float value");
386        }
387
388        {
389            boolean success = false;
390            for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
391                success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(1.0f, 2.0f);
392            }
393            assertEquals(success, true, "weakCompareAndSet float");
394            float x = (float) hs.get(TestAccessMode.GET).invokeExact();
395            assertEquals(x, 2.0f, "weakCompareAndSet float value");
396        }
397
398        {
399            boolean success = false;
400            for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
401                success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(2.0f, 1.0f);
402            }
403            assertEquals(success, true, "weakCompareAndSetAcquire float");
404            float x = (float) hs.get(TestAccessMode.GET).invokeExact();
405            assertEquals(x, 1.0f, "weakCompareAndSetAcquire float");
406        }
407
408        {
409            boolean success = false;
410            for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
411                success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(1.0f, 2.0f);
412            }
413            assertEquals(success, true, "weakCompareAndSetRelease float");
414            float x = (float) hs.get(TestAccessMode.GET).invokeExact();
415            assertEquals(x, 2.0f, "weakCompareAndSetRelease float");
416        }
417
418        {
419            boolean success = false;
420            for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
421                success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(2.0f, 1.0f);
422            }
423            assertEquals(success, true, "weakCompareAndSetVolatile float");
424            float x = (float) hs.get(TestAccessMode.GET).invokeExact();
425            assertEquals(x, 1.0f, "weakCompareAndSetVolatile float");
426        }
427
428        // Compare set and get
429        {
430            hs.get(TestAccessMode.SET).invokeExact(1.0f);
431
432            float o = (float) hs.get(TestAccessMode.GET_AND_SET).invokeExact(2.0f);
433            assertEquals(o, 1.0f, "getAndSet float");
434            float x = (float) hs.get(TestAccessMode.GET).invokeExact();
435            assertEquals(x, 2.0f, "getAndSet float value");
436        }
437
438        // Compare set and get
439        {
440            hs.get(TestAccessMode.SET).invokeExact(1.0f);
441
442            float o = (float) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(2.0f);
443            assertEquals(o, 1.0f, "getAndSetAcquire float");
444            float x = (float) hs.get(TestAccessMode.GET).invokeExact();
445            assertEquals(x, 2.0f, "getAndSetAcquire float value");
446        }
447
448        // Compare set and get
449        {
450            hs.get(TestAccessMode.SET).invokeExact(1.0f);
451
452            float o = (float) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(2.0f);
453            assertEquals(o, 1.0f, "getAndSetRelease float");
454            float x = (float) hs.get(TestAccessMode.GET).invokeExact();
455            assertEquals(x, 2.0f, "getAndSetRelease float value");
456        }
457
458        // get and add, add and get
459        {
460            hs.get(TestAccessMode.SET).invokeExact(1.0f);
461
462            float o = (float) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(3.0f);
463            assertEquals(o, 1.0f, "getAndAdd float");
464            float c = (float) hs.get(TestAccessMode.ADD_AND_GET).invokeExact(3.0f);
465            assertEquals(c, (float)(1.0f + 3.0f + 3.0f), "getAndAdd float value");
466        }
467
468        {
469            hs.get(TestAccessMode.SET).invokeExact(1.0f);
470
471            float o = (float) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(2.0f);
472            assertEquals(o, 1.0f, "getAndAddAcquire float");
473            float x = (float) hs.get(TestAccessMode.GET).invokeExact();
474            assertEquals(x, (float)(1.0f + 2.0f), "getAndAddAcquire float value");
475        }
476
477        {
478            hs.get(TestAccessMode.SET).invokeExact(1.0f);
479
480            float o = (float) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(2.0f);
481            assertEquals(o, 1.0f, "getAndAddRelease float");
482            float x = (float) hs.get(TestAccessMode.GET).invokeExact();
483            assertEquals(x, (float)(1.0f + 2.0f), "getAndAddRelease float value");
484        }
485
486    }
487
488    static void testStaticFieldUnsupported(Handles hs) throws Throwable {
489
490
491        for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
492            checkUOE(am, () -> {
493                float r = (float) hs.get(am).invokeExact(1.0f);
494            });
495        }
496    }
497
498
499    static void testArray(Handles hs) throws Throwable {
500        float[] array = new float[10];
501
502        for (int i = 0; i < array.length; i++) {
503            // Plain
504            {
505                hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0f);
506                float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i);
507                assertEquals(x, 1.0f, "get float value");
508            }
509
510
511            // Volatile
512            {
513                hs.get(TestAccessMode.SET_VOLATILE).invokeExact(array, i, 2.0f);
514                float x = (float) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(array, i);
515                assertEquals(x, 2.0f, "setVolatile float value");
516            }
517
518            // Lazy
519            {
520                hs.get(TestAccessMode.SET_RELEASE).invokeExact(array, i, 1.0f);
521                float x = (float) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(array, i);
522                assertEquals(x, 1.0f, "setRelease float value");
523            }
524
525            // Opaque
526            {
527                hs.get(TestAccessMode.SET_OPAQUE).invokeExact(array, i, 2.0f);
528                float x = (float) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(array, i);
529                assertEquals(x, 2.0f, "setOpaque float value");
530            }
531
532            hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0f);
533
534            // Compare
535            {
536                boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, 1.0f, 2.0f);
537                assertEquals(r, true, "success compareAndSet float");
538                float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i);
539                assertEquals(x, 2.0f, "success compareAndSet float value");
540            }
541
542            {
543                boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, 1.0f, 3.0f);
544                assertEquals(r, false, "failing compareAndSet float");
545                float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i);
546                assertEquals(x, 2.0f, "failing compareAndSet float value");
547            }
548
549            {
550                float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, 2.0f, 1.0f);
551                assertEquals(r, 2.0f, "success compareAndExchange float");
552                float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i);
553                assertEquals(x, 1.0f, "success compareAndExchange float value");
554            }
555
556            {
557                float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, 2.0f, 3.0f);
558                assertEquals(r, 1.0f, "failing compareAndExchange float");
559                float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i);
560                assertEquals(x, 1.0f, "failing compareAndExchange float value");
561            }
562
563            {
564                float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, 1.0f, 2.0f);
565                assertEquals(r, 1.0f, "success compareAndExchangeAcquire float");
566                float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i);
567                assertEquals(x, 2.0f, "success compareAndExchangeAcquire float value");
568            }
569
570            {
571                float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, 1.0f, 3.0f);
572                assertEquals(r, 2.0f, "failing compareAndExchangeAcquire float");
573                float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i);
574                assertEquals(x, 2.0f, "failing compareAndExchangeAcquire float value");
575            }
576
577            {
578                float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, 2.0f, 1.0f);
579                assertEquals(r, 2.0f, "success compareAndExchangeRelease float");
580                float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i);
581                assertEquals(x, 1.0f, "success compareAndExchangeRelease float value");
582            }
583
584            {
585                float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, 2.0f, 3.0f);
586                assertEquals(r, 1.0f, "failing compareAndExchangeRelease float");
587                float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i);
588                assertEquals(x, 1.0f, "failing compareAndExchangeRelease float value");
589            }
590
591            {
592                boolean success = false;
593                for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
594                    success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, 1.0f, 2.0f);
595                }
596                assertEquals(success, true, "weakCompareAndSet float");
597                float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i);
598                assertEquals(x, 2.0f, "weakCompareAndSet float value");
599            }
600
601            {
602                boolean success = false;
603                for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
604                    success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, 2.0f, 1.0f);
605                }
606                assertEquals(success, true, "weakCompareAndSetAcquire float");
607                float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i);
608                assertEquals(x, 1.0f, "weakCompareAndSetAcquire float");
609            }
610
611            {
612                boolean success = false;
613                for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
614                    success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(array, i, 1.0f, 2.0f);
615                }
616                assertEquals(success, true, "weakCompareAndSetRelease float");
617                float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i);
618                assertEquals(x, 2.0f, "weakCompareAndSetRelease float");
619            }
620
621            {
622                boolean success = false;
623                for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
624                    success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(array, i, 2.0f, 1.0f);
625                }
626                assertEquals(success, true, "weakCompareAndSetVolatile float");
627                float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i);
628                assertEquals(x, 1.0f, "weakCompareAndSetVolatile float");
629            }
630
631            // Compare set and get
632            {
633                hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0f);
634
635                float o = (float) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, 2.0f);
636                assertEquals(o, 1.0f, "getAndSet float");
637                float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i);
638                assertEquals(x, 2.0f, "getAndSet float value");
639            }
640
641            {
642                hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0f);
643
644                float o = (float) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(array, i, 2.0f);
645                assertEquals(o, 1.0f, "getAndSetAcquire float");
646                float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i);
647                assertEquals(x, 2.0f, "getAndSetAcquire float value");
648            }
649
650            {
651                hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0f);
652
653                float o = (float) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(array, i, 2.0f);
654                assertEquals(o, 1.0f, "getAndSetRelease float");
655                float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i);
656                assertEquals(x, 2.0f, "getAndSetRelease float value");
657            }
658
659            // get and add, add and get
660            {
661                hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0f);
662
663                float o = (float) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(array, i, 3.0f);
664                assertEquals(o, 1.0f, "getAndAdd float");
665                float c = (float) hs.get(TestAccessMode.ADD_AND_GET).invokeExact(array, i, 3.0f);
666                assertEquals(c, (float)(1.0f + 3.0f + 3.0f), "getAndAdd float value");
667            }
668
669            {
670                hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0f);
671
672                float o = (float) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(array, i, 2.0f);
673                assertEquals(o, 1.0f, "getAndAddAcquire float");
674                float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i);
675                assertEquals(x, (float)(1.0f + 2.0f), "getAndAddAcquire float value");
676            }
677
678            {
679                hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0f);
680
681                float o = (float) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(array, i, 2.0f);
682                assertEquals(o, 1.0f, "getAndAddRelease float");
683                float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i);
684                assertEquals(x, (float)(1.0f + 2.0f), "getAndAddRelease float value");
685            }
686
687        }
688    }
689
690    static void testArrayUnsupported(Handles hs) throws Throwable {
691        float[] array = new float[10];
692
693        final int i = 0;
694
695
696        for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
697            checkUOE(am, () -> {
698                float o = (float) hs.get(am).invokeExact(array, i, 1.0f);
699            });
700        }
701    }
702
703    static void testArrayIndexOutOfBounds(Handles hs) throws Throwable {
704        float[] array = new float[10];
705
706        for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) {
707            final int ci = i;
708
709            for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) {
710                checkIOOBE(am, () -> {
711                    float x = (float) hs.get(am).invokeExact(array, ci);
712                });
713            }
714
715            for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) {
716                checkIOOBE(am, () -> {
717                    hs.get(am).invokeExact(array, ci, 1.0f);
718                });
719            }
720
721            for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) {
722                checkIOOBE(am, () -> {
723                    boolean r = (boolean) hs.get(am).invokeExact(array, ci, 1.0f, 2.0f);
724                });
725            }
726
727            for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) {
728                checkIOOBE(am, () -> {
729                    float r = (float) hs.get(am).invokeExact(array, ci, 2.0f, 1.0f);
730                });
731            }
732
733            for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) {
734                checkIOOBE(am, () -> {
735                    float o = (float) hs.get(am).invokeExact(array, ci, 1.0f);
736                });
737            }
738
739            for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
740                checkIOOBE(am, () -> {
741                    float o = (float) hs.get(am).invokeExact(array, ci, 3.0f);
742                });
743            }
744
745        }
746    }
747}
748
749