Merge
This commit is contained in:
commit
8761e88b55
@ -26,6 +26,7 @@
|
|||||||
package java.lang.invoke;
|
package java.lang.invoke;
|
||||||
|
|
||||||
import jdk.internal.HotSpotIntrinsicCandidate;
|
import jdk.internal.HotSpotIntrinsicCandidate;
|
||||||
|
import jdk.internal.util.Preconditions;
|
||||||
import jdk.internal.vm.annotation.ForceInline;
|
import jdk.internal.vm.annotation.ForceInline;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
@ -34,7 +35,6 @@ import java.util.Arrays;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
@ -1436,7 +1436,7 @@ public abstract class VarHandle {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static final BiFunction<String, List<Integer>, ArrayIndexOutOfBoundsException>
|
static final BiFunction<String, List<Integer>, ArrayIndexOutOfBoundsException>
|
||||||
AIOOBE_SUPPLIER = Objects.outOfBoundsExceptionFormatter(
|
AIOOBE_SUPPLIER = Preconditions.outOfBoundsExceptionFormatter(
|
||||||
new Function<String, ArrayIndexOutOfBoundsException>() {
|
new Function<String, ArrayIndexOutOfBoundsException>() {
|
||||||
@Override
|
@Override
|
||||||
public ArrayIndexOutOfBoundsException apply(String s) {
|
public ArrayIndexOutOfBoundsException apply(String s) {
|
||||||
|
@ -24,9 +24,11 @@
|
|||||||
*/
|
*/
|
||||||
package java.lang.invoke;
|
package java.lang.invoke;
|
||||||
|
|
||||||
import java.util.Objects;
|
import jdk.internal.util.Preconditions;
|
||||||
import jdk.internal.vm.annotation.ForceInline;
|
import jdk.internal.vm.annotation.ForceInline;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
import static java.lang.invoke.MethodHandleStatics.UNSAFE;
|
import static java.lang.invoke.MethodHandleStatics.UNSAFE;
|
||||||
|
|
||||||
#warn
|
#warn
|
||||||
@ -425,7 +427,7 @@ final class VarHandle$Type$s {
|
|||||||
$type$[] array = ($type$[]) oarray;
|
$type$[] array = ($type$[]) oarray;
|
||||||
#end[Object]
|
#end[Object]
|
||||||
return UNSAFE.get$Type$Volatile(array,
|
return UNSAFE.get$Type$Volatile(array,
|
||||||
(((long) Objects.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase);
|
(((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ForceInline
|
@ForceInline
|
||||||
@ -436,7 +438,7 @@ final class VarHandle$Type$s {
|
|||||||
$type$[] array = ($type$[]) oarray;
|
$type$[] array = ($type$[]) oarray;
|
||||||
#end[Object]
|
#end[Object]
|
||||||
UNSAFE.put$Type$Volatile(array,
|
UNSAFE.put$Type$Volatile(array,
|
||||||
(((long) Objects.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
(((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
||||||
{#if[Object]?handle.componentType.cast(value):value});
|
{#if[Object]?handle.componentType.cast(value):value});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -448,7 +450,7 @@ final class VarHandle$Type$s {
|
|||||||
$type$[] array = ($type$[]) oarray;
|
$type$[] array = ($type$[]) oarray;
|
||||||
#end[Object]
|
#end[Object]
|
||||||
return UNSAFE.get$Type$Opaque(array,
|
return UNSAFE.get$Type$Opaque(array,
|
||||||
(((long) Objects.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase);
|
(((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ForceInline
|
@ForceInline
|
||||||
@ -459,7 +461,7 @@ final class VarHandle$Type$s {
|
|||||||
$type$[] array = ($type$[]) oarray;
|
$type$[] array = ($type$[]) oarray;
|
||||||
#end[Object]
|
#end[Object]
|
||||||
UNSAFE.put$Type$Opaque(array,
|
UNSAFE.put$Type$Opaque(array,
|
||||||
(((long) Objects.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
(((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
||||||
{#if[Object]?handle.componentType.cast(value):value});
|
{#if[Object]?handle.componentType.cast(value):value});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -471,7 +473,7 @@ final class VarHandle$Type$s {
|
|||||||
$type$[] array = ($type$[]) oarray;
|
$type$[] array = ($type$[]) oarray;
|
||||||
#end[Object]
|
#end[Object]
|
||||||
return UNSAFE.get$Type$Acquire(array,
|
return UNSAFE.get$Type$Acquire(array,
|
||||||
(((long) Objects.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase);
|
(((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ForceInline
|
@ForceInline
|
||||||
@ -482,7 +484,7 @@ final class VarHandle$Type$s {
|
|||||||
$type$[] array = ($type$[]) oarray;
|
$type$[] array = ($type$[]) oarray;
|
||||||
#end[Object]
|
#end[Object]
|
||||||
UNSAFE.put$Type$Release(array,
|
UNSAFE.put$Type$Release(array,
|
||||||
(((long) Objects.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
(((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
||||||
{#if[Object]?handle.componentType.cast(value):value});
|
{#if[Object]?handle.componentType.cast(value):value});
|
||||||
}
|
}
|
||||||
#if[CAS]
|
#if[CAS]
|
||||||
@ -495,7 +497,7 @@ final class VarHandle$Type$s {
|
|||||||
$type$[] array = ($type$[]) oarray;
|
$type$[] array = ($type$[]) oarray;
|
||||||
#end[Object]
|
#end[Object]
|
||||||
return UNSAFE.compareAndSwap$Type$(array,
|
return UNSAFE.compareAndSwap$Type$(array,
|
||||||
(((long) Objects.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
(((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
||||||
{#if[Object]?handle.componentType.cast(expected):expected},
|
{#if[Object]?handle.componentType.cast(expected):expected},
|
||||||
{#if[Object]?handle.componentType.cast(value):value});
|
{#if[Object]?handle.componentType.cast(value):value});
|
||||||
}
|
}
|
||||||
@ -508,7 +510,7 @@ final class VarHandle$Type$s {
|
|||||||
$type$[] array = ($type$[]) oarray;
|
$type$[] array = ($type$[]) oarray;
|
||||||
#end[Object]
|
#end[Object]
|
||||||
return UNSAFE.compareAndExchange$Type$Volatile(array,
|
return UNSAFE.compareAndExchange$Type$Volatile(array,
|
||||||
(((long) Objects.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
(((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
||||||
{#if[Object]?handle.componentType.cast(expected):expected},
|
{#if[Object]?handle.componentType.cast(expected):expected},
|
||||||
{#if[Object]?handle.componentType.cast(value):value});
|
{#if[Object]?handle.componentType.cast(value):value});
|
||||||
}
|
}
|
||||||
@ -521,7 +523,7 @@ final class VarHandle$Type$s {
|
|||||||
$type$[] array = ($type$[]) oarray;
|
$type$[] array = ($type$[]) oarray;
|
||||||
#end[Object]
|
#end[Object]
|
||||||
return UNSAFE.compareAndExchange$Type$Acquire(array,
|
return UNSAFE.compareAndExchange$Type$Acquire(array,
|
||||||
(((long) Objects.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
(((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
||||||
{#if[Object]?handle.componentType.cast(expected):expected},
|
{#if[Object]?handle.componentType.cast(expected):expected},
|
||||||
{#if[Object]?handle.componentType.cast(value):value});
|
{#if[Object]?handle.componentType.cast(value):value});
|
||||||
}
|
}
|
||||||
@ -534,7 +536,7 @@ final class VarHandle$Type$s {
|
|||||||
$type$[] array = ($type$[]) oarray;
|
$type$[] array = ($type$[]) oarray;
|
||||||
#end[Object]
|
#end[Object]
|
||||||
return UNSAFE.compareAndExchange$Type$Release(array,
|
return UNSAFE.compareAndExchange$Type$Release(array,
|
||||||
(((long) Objects.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
(((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
||||||
{#if[Object]?handle.componentType.cast(expected):expected},
|
{#if[Object]?handle.componentType.cast(expected):expected},
|
||||||
{#if[Object]?handle.componentType.cast(value):value});
|
{#if[Object]?handle.componentType.cast(value):value});
|
||||||
}
|
}
|
||||||
@ -547,7 +549,7 @@ final class VarHandle$Type$s {
|
|||||||
$type$[] array = ($type$[]) oarray;
|
$type$[] array = ($type$[]) oarray;
|
||||||
#end[Object]
|
#end[Object]
|
||||||
return UNSAFE.weakCompareAndSwap$Type$(array,
|
return UNSAFE.weakCompareAndSwap$Type$(array,
|
||||||
(((long) Objects.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
(((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
||||||
{#if[Object]?handle.componentType.cast(expected):expected},
|
{#if[Object]?handle.componentType.cast(expected):expected},
|
||||||
{#if[Object]?handle.componentType.cast(value):value});
|
{#if[Object]?handle.componentType.cast(value):value});
|
||||||
}
|
}
|
||||||
@ -561,7 +563,7 @@ final class VarHandle$Type$s {
|
|||||||
#end[Object]
|
#end[Object]
|
||||||
// TODO defer to strong form until new Unsafe method is added
|
// TODO defer to strong form until new Unsafe method is added
|
||||||
return UNSAFE.compareAndSwap$Type$(array,
|
return UNSAFE.compareAndSwap$Type$(array,
|
||||||
(((long) Objects.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
(((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
||||||
{#if[Object]?handle.componentType.cast(expected):expected},
|
{#if[Object]?handle.componentType.cast(expected):expected},
|
||||||
{#if[Object]?handle.componentType.cast(value):value});
|
{#if[Object]?handle.componentType.cast(value):value});
|
||||||
}
|
}
|
||||||
@ -574,7 +576,7 @@ final class VarHandle$Type$s {
|
|||||||
$type$[] array = ($type$[]) oarray;
|
$type$[] array = ($type$[]) oarray;
|
||||||
#end[Object]
|
#end[Object]
|
||||||
return UNSAFE.weakCompareAndSwap$Type$Acquire(array,
|
return UNSAFE.weakCompareAndSwap$Type$Acquire(array,
|
||||||
(((long) Objects.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
(((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
||||||
{#if[Object]?handle.componentType.cast(expected):expected},
|
{#if[Object]?handle.componentType.cast(expected):expected},
|
||||||
{#if[Object]?handle.componentType.cast(value):value});
|
{#if[Object]?handle.componentType.cast(value):value});
|
||||||
}
|
}
|
||||||
@ -587,7 +589,7 @@ final class VarHandle$Type$s {
|
|||||||
$type$[] array = ($type$[]) oarray;
|
$type$[] array = ($type$[]) oarray;
|
||||||
#end[Object]
|
#end[Object]
|
||||||
return UNSAFE.weakCompareAndSwap$Type$Release(array,
|
return UNSAFE.weakCompareAndSwap$Type$Release(array,
|
||||||
(((long) Objects.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
(((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
||||||
{#if[Object]?handle.componentType.cast(expected):expected},
|
{#if[Object]?handle.componentType.cast(expected):expected},
|
||||||
{#if[Object]?handle.componentType.cast(value):value});
|
{#if[Object]?handle.componentType.cast(value):value});
|
||||||
}
|
}
|
||||||
@ -600,7 +602,7 @@ final class VarHandle$Type$s {
|
|||||||
$type$[] array = ($type$[]) oarray;
|
$type$[] array = ($type$[]) oarray;
|
||||||
#end[Object]
|
#end[Object]
|
||||||
return UNSAFE.getAndSet$Type$(array,
|
return UNSAFE.getAndSet$Type$(array,
|
||||||
(((long) Objects.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
(((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
||||||
{#if[Object]?handle.componentType.cast(value):value});
|
{#if[Object]?handle.componentType.cast(value):value});
|
||||||
}
|
}
|
||||||
#end[CAS]
|
#end[CAS]
|
||||||
@ -614,7 +616,7 @@ final class VarHandle$Type$s {
|
|||||||
$type$[] array = ($type$[]) oarray;
|
$type$[] array = ($type$[]) oarray;
|
||||||
#end[Object]
|
#end[Object]
|
||||||
return UNSAFE.getAndAdd$Type$(array,
|
return UNSAFE.getAndAdd$Type$(array,
|
||||||
(((long) Objects.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
(((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
||||||
value);
|
value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -626,7 +628,7 @@ final class VarHandle$Type$s {
|
|||||||
$type$[] array = ($type$[]) oarray;
|
$type$[] array = ($type$[]) oarray;
|
||||||
#end[Object]
|
#end[Object]
|
||||||
return UNSAFE.getAndAdd$Type$(array,
|
return UNSAFE.getAndAdd$Type$(array,
|
||||||
(((long) Objects.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
(((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
|
||||||
value) + value;
|
value) + value;
|
||||||
}
|
}
|
||||||
#end[AtomicAdd]
|
#end[AtomicAdd]
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
package java.lang.invoke;
|
package java.lang.invoke;
|
||||||
|
|
||||||
import jdk.internal.misc.Unsafe;
|
import jdk.internal.misc.Unsafe;
|
||||||
|
import jdk.internal.util.Preconditions;
|
||||||
import jdk.internal.vm.annotation.ForceInline;
|
import jdk.internal.vm.annotation.ForceInline;
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
@ -78,7 +79,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase {
|
|||||||
|
|
||||||
@ForceInline
|
@ForceInline
|
||||||
static int index(byte[] ba, int index) {
|
static int index(byte[] ba, int index) {
|
||||||
return Objects.checkIndex(index, ba.length - ALIGN, null);
|
return Preconditions.checkIndex(index, ba.length - ALIGN, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ForceInline
|
@ForceInline
|
||||||
@ -297,14 +298,14 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase {
|
|||||||
|
|
||||||
@ForceInline
|
@ForceInline
|
||||||
static int index(ByteBuffer bb, int index) {
|
static int index(ByteBuffer bb, int index) {
|
||||||
return Objects.checkIndex(index, UNSAFE.getInt(bb, BUFFER_LIMIT) - ALIGN, null);
|
return Preconditions.checkIndex(index, UNSAFE.getInt(bb, BUFFER_LIMIT) - ALIGN, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ForceInline
|
@ForceInline
|
||||||
static int indexRO(ByteBuffer bb, int index) {
|
static int indexRO(ByteBuffer bb, int index) {
|
||||||
if (UNSAFE.getBoolean(bb, BYTE_BUFFER_IS_READ_ONLY))
|
if (UNSAFE.getBoolean(bb, BYTE_BUFFER_IS_READ_ONLY))
|
||||||
throw new ReadOnlyBufferException();
|
throw new ReadOnlyBufferException();
|
||||||
return Objects.checkIndex(index, UNSAFE.getInt(bb, BUFFER_LIMIT) - ALIGN, null);
|
return Preconditions.checkIndex(index, UNSAFE.getInt(bb, BUFFER_LIMIT) - ALIGN, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ForceInline
|
@ForceInline
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -25,10 +25,9 @@
|
|||||||
|
|
||||||
package java.util;
|
package java.util;
|
||||||
|
|
||||||
import jdk.internal.HotSpotIntrinsicCandidate;
|
import jdk.internal.util.Preconditions;
|
||||||
|
import jdk.internal.vm.annotation.ForceInline;
|
||||||
|
|
||||||
import java.util.function.BiFunction;
|
|
||||||
import java.util.function.Function;
|
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -348,172 +347,6 @@ public final class Objects {
|
|||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Maps out-of-bounds values to a runtime exception.
|
|
||||||
*
|
|
||||||
* @param checkKind the kind of bounds check, whose name may correspond
|
|
||||||
* to the name of one of the range check methods, checkIndex,
|
|
||||||
* checkFromToIndex, checkFromIndexSize
|
|
||||||
* @param args the out-of-bounds arguments that failed the range check.
|
|
||||||
* If the checkKind corresponds a the name of a range check method
|
|
||||||
* then the bounds arguments are those that can be passed in order
|
|
||||||
* to the method.
|
|
||||||
* @param oobef the exception formatter that when applied with a checkKind
|
|
||||||
* and a list out-of-bounds arguments returns a runtime exception.
|
|
||||||
* If {@code null} then, it is as if an exception formatter was
|
|
||||||
* supplied that returns {@link IndexOutOfBoundsException} for any
|
|
||||||
* given arguments.
|
|
||||||
* @return the runtime exception
|
|
||||||
*/
|
|
||||||
private static RuntimeException outOfBounds(
|
|
||||||
BiFunction<String, List<Integer>, ? extends RuntimeException> oobef,
|
|
||||||
String checkKind,
|
|
||||||
Integer... args) {
|
|
||||||
List<Integer> largs = List.of(args);
|
|
||||||
RuntimeException e = oobef == null
|
|
||||||
? null : oobef.apply(checkKind, largs);
|
|
||||||
return e == null
|
|
||||||
? new IndexOutOfBoundsException(outOfBoundsMessage(checkKind, largs)) : e;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Specific out-of-bounds exception producing methods that avoid
|
|
||||||
// the varargs-based code in the critical methods there by reducing their
|
|
||||||
// the byte code size, and therefore less likely to peturb inlining
|
|
||||||
|
|
||||||
private static RuntimeException outOfBoundsCheckIndex(
|
|
||||||
BiFunction<String, List<Integer>, ? extends RuntimeException> oobe,
|
|
||||||
int index, int length) {
|
|
||||||
return outOfBounds(oobe, "checkIndex", index, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static RuntimeException outOfBoundsCheckFromToIndex(
|
|
||||||
BiFunction<String, List<Integer>, ? extends RuntimeException> oobe,
|
|
||||||
int fromIndex, int toIndex, int length) {
|
|
||||||
return outOfBounds(oobe, "checkFromToIndex", fromIndex, toIndex, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static RuntimeException outOfBoundsCheckFromIndexSize(
|
|
||||||
BiFunction<String, List<Integer>, ? extends RuntimeException> oobe,
|
|
||||||
int fromIndex, int size, int length) {
|
|
||||||
return outOfBounds(oobe, "checkFromIndexSize", fromIndex, size, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns an out-of-bounds exception formatter from an given exception
|
|
||||||
* factory. The exception formatter is a function that formats an
|
|
||||||
* out-of-bounds message from its arguments and applies that message to the
|
|
||||||
* given exception factory to produce and relay an exception.
|
|
||||||
*
|
|
||||||
* <p>The exception formatter accepts two arguments: a {@code String}
|
|
||||||
* describing the out-of-bounds range check that failed, referred to as the
|
|
||||||
* <em>check kind</em>; and a {@code List<Integer>} containing the
|
|
||||||
* out-of-bound integer values that failed the check. The list of
|
|
||||||
* out-of-bound values is not modified.
|
|
||||||
*
|
|
||||||
* <p>Three check kinds are supported {@code checkIndex},
|
|
||||||
* {@code checkFromToIndex} and {@code checkFromIndexSize} corresponding
|
|
||||||
* respectively to the specified application of an exception formatter as an
|
|
||||||
* argument to the out-of-bounds range check methods
|
|
||||||
* {@link #checkIndex(int, int, BiFunction) checkIndex},
|
|
||||||
* {@link #checkFromToIndex(int, int, int, BiFunction) checkFromToIndex}, and
|
|
||||||
* {@link #checkFromIndexSize(int, int, int, BiFunction) checkFromIndexSize}.
|
|
||||||
* Thus a supported check kind corresponds to a method name and the
|
|
||||||
* out-of-bound integer values correspond to method argument values, in
|
|
||||||
* order, preceding the exception formatter argument (similar in many
|
|
||||||
* respects to the form of arguments required for a reflective invocation of
|
|
||||||
* such a range check method).
|
|
||||||
*
|
|
||||||
* <p>Formatter arguments conforming to such supported check kinds will
|
|
||||||
* produce specific exception messages describing failed out-of-bounds
|
|
||||||
* checks. Otherwise, more generic exception messages will be produced in
|
|
||||||
* any of the following cases: the check kind is supported but fewer
|
|
||||||
* or more out-of-bounds values are supplied, the check kind is not
|
|
||||||
* supported, the check kind is {@code null}, or the list of out-of-bound
|
|
||||||
* values is {@code null}.
|
|
||||||
*
|
|
||||||
* @apiNote
|
|
||||||
* This method produces an out-of-bounds exception formatter that can be
|
|
||||||
* passed as an argument to any of the supported out-of-bounds range check
|
|
||||||
* methods declared by {@code Objects}. For example, a formatter producing
|
|
||||||
* an {@code ArrayIndexOutOfBoundsException} may be produced and stored on a
|
|
||||||
* {@code static final} field as follows:
|
|
||||||
* <pre>{@code
|
|
||||||
* static final
|
|
||||||
* BiFunction<String, List<Integer>, ArrayIndexOutOfBoundsException> AIOOBEF =
|
|
||||||
* outOfBoundsExceptionFormatter(ArrayIndexOutOfBoundsException::new);
|
|
||||||
* }</pre>
|
|
||||||
* The formatter instance {@code AIOOBEF} may be passed as an argument to an
|
|
||||||
* out-of-bounds range check method, such as checking if an {@code index}
|
|
||||||
* is within the bounds of a {@code limit}:
|
|
||||||
* <pre>{@code
|
|
||||||
* checkIndex(index, limit, AIOOBEF);
|
|
||||||
* }</pre>
|
|
||||||
* If the bounds check fails then the range check method will throw an
|
|
||||||
* {@code ArrayIndexOutOfBoundsException} with an appropriate exception
|
|
||||||
* message that is a produced from {@code AIOOBEF} as follows:
|
|
||||||
* <pre>{@code
|
|
||||||
* AIOOBEF.apply("checkIndex", List.of(index, limit));
|
|
||||||
* }</pre>
|
|
||||||
*
|
|
||||||
* @param f the exception factory, that produces an exception from a message
|
|
||||||
* where the message is produced and formatted by the returned
|
|
||||||
* exception formatter. If this factory is stateless and side-effect
|
|
||||||
* free then so is the returned formatter.
|
|
||||||
* Exceptions thrown by the factory are relayed to the caller
|
|
||||||
* of the returned formatter.
|
|
||||||
* @param <X> the type of runtime exception to be returned by the given
|
|
||||||
* exception factory and relayed by the exception formatter
|
|
||||||
* @return the out-of-bounds exception formatter
|
|
||||||
*/
|
|
||||||
public static <X extends RuntimeException>
|
|
||||||
BiFunction<String, List<Integer>, X> outOfBoundsExceptionFormatter(Function<String, X> f) {
|
|
||||||
// Use anonymous class to avoid bootstrap issues if this method is
|
|
||||||
// used early in startup
|
|
||||||
return new BiFunction<String, List<Integer>, X>() {
|
|
||||||
@Override
|
|
||||||
public X apply(String checkKind, List<Integer> args) {
|
|
||||||
return f.apply(outOfBoundsMessage(checkKind, args));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String outOfBoundsMessage(String checkKind, List<Integer> args) {
|
|
||||||
if (checkKind == null && args == null) {
|
|
||||||
return String.format("Range check failed");
|
|
||||||
} else if (checkKind == null) {
|
|
||||||
return String.format("Range check failed: %s", args);
|
|
||||||
} else if (args == null) {
|
|
||||||
return String.format("Range check failed: %s", checkKind);
|
|
||||||
}
|
|
||||||
|
|
||||||
int argSize = 0;
|
|
||||||
switch (checkKind) {
|
|
||||||
case "checkIndex":
|
|
||||||
argSize = 2;
|
|
||||||
break;
|
|
||||||
case "checkFromToIndex":
|
|
||||||
case "checkFromIndexSize":
|
|
||||||
argSize = 3;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
|
|
||||||
// Switch to default if fewer or more arguments than required are supplied
|
|
||||||
switch ((args.size() != argSize) ? "" : checkKind) {
|
|
||||||
case "checkIndex":
|
|
||||||
return String.format("Index %d out-of-bounds for length %d",
|
|
||||||
args.get(0), args.get(1));
|
|
||||||
case "checkFromToIndex":
|
|
||||||
return String.format("Range [%d, %d) out-of-bounds for length %d",
|
|
||||||
args.get(0), args.get(1), args.get(2));
|
|
||||||
case "checkFromIndexSize":
|
|
||||||
return String.format("Range [%d, %<d + %d) out-of-bounds for length %d",
|
|
||||||
args.get(0), args.get(1), args.get(2));
|
|
||||||
default:
|
|
||||||
return String.format("Range check failed: %s %s", checkKind, args);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the {@code index} is within the bounds of the range from
|
* Checks if the {@code index} is within the bounds of the range from
|
||||||
* {@code 0} (inclusive) to {@code length} (exclusive).
|
* {@code 0} (inclusive) to {@code length} (exclusive).
|
||||||
@ -526,72 +359,16 @@ public final class Objects {
|
|||||||
* <li>{@code length < 0}, which is implied from the former inequalities</li>
|
* <li>{@code length < 0}, which is implied from the former inequalities</li>
|
||||||
* </ul>
|
* </ul>
|
||||||
*
|
*
|
||||||
* <p>This method behaves as if {@link #checkIndex(int, int, BiFunction)}
|
|
||||||
* was called with same out-of-bounds arguments and an exception formatter
|
|
||||||
* argument produced from an invocation of
|
|
||||||
* {@code outOfBoundsExceptionFormatter(IndexOutOfBounds::new)} (though it may
|
|
||||||
* be more efficient).
|
|
||||||
*
|
|
||||||
* @param index the index
|
* @param index the index
|
||||||
* @param length the upper-bound (exclusive) of the range
|
* @param length the upper-bound (exclusive) of the range
|
||||||
* @return {@code index} if it is within bounds of the range
|
* @return {@code index} if it is within bounds of the range
|
||||||
* @throws IndexOutOfBoundsException if the {@code index} is out-of-bounds
|
* @throws IndexOutOfBoundsException if the {@code index} is out-of-bounds
|
||||||
* @since 9
|
* @since 9
|
||||||
*/
|
*/
|
||||||
|
@ForceInline
|
||||||
public static
|
public static
|
||||||
int checkIndex(int index, int length) {
|
int checkIndex(int index, int length) {
|
||||||
return checkIndex(index, length, null);
|
return Preconditions.checkIndex(index, length, null);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if the {@code index} is within the bounds of the range from
|
|
||||||
* {@code 0} (inclusive) to {@code length} (exclusive).
|
|
||||||
*
|
|
||||||
* <p>The {@code index} is defined to be out-of-bounds if any of the
|
|
||||||
* following inequalities is true:
|
|
||||||
* <ul>
|
|
||||||
* <li>{@code index < 0}</li>
|
|
||||||
* <li>{@code index >= length}</li>
|
|
||||||
* <li>{@code length < 0}, which is implied from the former inequalities</li>
|
|
||||||
* </ul>
|
|
||||||
*
|
|
||||||
* <p>If the {@code index} is out-of-bounds, then a runtime exception is
|
|
||||||
* thrown that is the result of applying the following arguments to the
|
|
||||||
* exception formatter: the name of this method, {@code checkIndex};
|
|
||||||
* and an unmodifiable list integers whose values are, in order, the
|
|
||||||
* out-of-bounds arguments {@code index} and {@code length}.
|
|
||||||
*
|
|
||||||
* @param <X> the type of runtime exception to throw if the arguments are
|
|
||||||
* out-of-bounds
|
|
||||||
* @param index the index
|
|
||||||
* @param length the upper-bound (exclusive) of the range
|
|
||||||
* @param oobef the exception formatter that when applied with this
|
|
||||||
* method name and out-of-bounds arguments returns a runtime
|
|
||||||
* exception. If {@code null} or returns {@code null} then, it is as
|
|
||||||
* if an exception formatter produced from an invocation of
|
|
||||||
* {@code outOfBoundsExceptionFormatter(IndexOutOfBounds::new)} is used
|
|
||||||
* instead (though it may be more efficient).
|
|
||||||
* Exceptions thrown by the formatter are relayed to the caller.
|
|
||||||
* @return {@code index} if it is within bounds of the range
|
|
||||||
* @throws X if the {@code index} is out-of-bounds and the exception
|
|
||||||
* formatter is non-{@code null}
|
|
||||||
* @throws IndexOutOfBoundsException if the {@code index} is out-of-bounds
|
|
||||||
* and the exception formatter is {@code null}
|
|
||||||
* @since 9
|
|
||||||
*
|
|
||||||
* @implNote
|
|
||||||
* This method is made intrinsic in optimizing compilers to guide them to
|
|
||||||
* perform unsigned comparisons of the index and length when it is known the
|
|
||||||
* length is a non-negative value (such as that of an array length or from
|
|
||||||
* the upper bound of a loop)
|
|
||||||
*/
|
|
||||||
@HotSpotIntrinsicCandidate
|
|
||||||
public static <X extends RuntimeException>
|
|
||||||
int checkIndex(int index, int length,
|
|
||||||
BiFunction<String, List<Integer>, X> oobef) {
|
|
||||||
if (index < 0 || index >= length)
|
|
||||||
throw outOfBoundsCheckIndex(oobef, index, length);
|
|
||||||
return index;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -608,12 +385,6 @@ public final class Objects {
|
|||||||
* <li>{@code length < 0}, which is implied from the former inequalities</li>
|
* <li>{@code length < 0}, which is implied from the former inequalities</li>
|
||||||
* </ul>
|
* </ul>
|
||||||
*
|
*
|
||||||
* <p>This method behaves as if {@link #checkFromToIndex(int, int, int, BiFunction)}
|
|
||||||
* was called with same out-of-bounds arguments and an exception formatter
|
|
||||||
* argument produced from an invocation of
|
|
||||||
* {@code outOfBoundsExceptionFormatter(IndexOutOfBounds::new)} (though it may
|
|
||||||
* be more efficient).
|
|
||||||
*
|
|
||||||
* @param fromIndex the lower-bound (inclusive) of the sub-range
|
* @param fromIndex the lower-bound (inclusive) of the sub-range
|
||||||
* @param toIndex the upper-bound (exclusive) of the sub-range
|
* @param toIndex the upper-bound (exclusive) of the sub-range
|
||||||
* @param length the upper-bound (exclusive) the range
|
* @param length the upper-bound (exclusive) the range
|
||||||
@ -623,54 +394,7 @@ public final class Objects {
|
|||||||
*/
|
*/
|
||||||
public static
|
public static
|
||||||
int checkFromToIndex(int fromIndex, int toIndex, int length) {
|
int checkFromToIndex(int fromIndex, int toIndex, int length) {
|
||||||
return checkFromToIndex(fromIndex, toIndex, length, null);
|
return Preconditions.checkFromToIndex(fromIndex, toIndex, length, null);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if the sub-range from {@code fromIndex} (inclusive) to
|
|
||||||
* {@code toIndex} (exclusive) is within the bounds of range from {@code 0}
|
|
||||||
* (inclusive) to {@code length} (exclusive).
|
|
||||||
*
|
|
||||||
* <p>The sub-range is defined to be out-of-bounds if any of the following
|
|
||||||
* inequalities is true:
|
|
||||||
* <ul>
|
|
||||||
* <li>{@code fromIndex < 0}</li>
|
|
||||||
* <li>{@code fromIndex > toIndex}</li>
|
|
||||||
* <li>{@code toIndex > length}</li>
|
|
||||||
* <li>{@code length < 0}, which is implied from the former inequalities</li>
|
|
||||||
* </ul>
|
|
||||||
*
|
|
||||||
* <p>If the sub-range is out-of-bounds, then a runtime exception is
|
|
||||||
* thrown that is the result of applying the following arguments to the
|
|
||||||
* exception formatter: the name of this method, {@code checkFromToIndex};
|
|
||||||
* and an unmodifiable list integers whose values are, in order, the
|
|
||||||
* out-of-bounds arguments {@code fromIndex}, {@code toIndex}, and {@code length}.
|
|
||||||
*
|
|
||||||
* @param <X> the type of runtime exception to throw if the arguments are
|
|
||||||
* out-of-bounds
|
|
||||||
* @param fromIndex the lower-bound (inclusive) of the sub-range
|
|
||||||
* @param toIndex the upper-bound (exclusive) of the sub-range
|
|
||||||
* @param length the upper-bound (exclusive) the range
|
|
||||||
* @param oobef the exception formatter that when applied with this
|
|
||||||
* method name and out-of-bounds arguments returns a runtime
|
|
||||||
* exception. If {@code null} or returns {@code null} then, it is as
|
|
||||||
* if an exception formatter produced from an invocation of
|
|
||||||
* {@code outOfBoundsExceptionFormatter(IndexOutOfBounds::new)} is used
|
|
||||||
* instead (though it may be more efficient).
|
|
||||||
* Exceptions thrown by the formatter are relayed to the caller.
|
|
||||||
* @return {@code fromIndex} if the sub-range within bounds of the range
|
|
||||||
* @throws X if the sub-range is out-of-bounds and the exception factory
|
|
||||||
* function is non-{@code null}
|
|
||||||
* @throws IndexOutOfBoundsException if the sub-range is out-of-bounds and
|
|
||||||
* the exception factory function is {@code null}
|
|
||||||
* @since 9
|
|
||||||
*/
|
|
||||||
public static <X extends RuntimeException>
|
|
||||||
int checkFromToIndex(int fromIndex, int toIndex, int length,
|
|
||||||
BiFunction<String, List<Integer>, X> oobef) {
|
|
||||||
if (fromIndex < 0 || fromIndex > toIndex || toIndex > length)
|
|
||||||
throw outOfBoundsCheckFromToIndex(oobef, fromIndex, toIndex, length);
|
|
||||||
return fromIndex;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -687,12 +411,6 @@ public final class Objects {
|
|||||||
* <li>{@code length < 0}, which is implied from the former inequalities</li>
|
* <li>{@code length < 0}, which is implied from the former inequalities</li>
|
||||||
* </ul>
|
* </ul>
|
||||||
*
|
*
|
||||||
* <p>This method behaves as if {@link #checkFromIndexSize(int, int, int, BiFunction)}
|
|
||||||
* was called with same out-of-bounds arguments and an exception formatter
|
|
||||||
* argument produced from an invocation of
|
|
||||||
* {@code outOfBoundsExceptionFormatter(IndexOutOfBounds::new)} (though it may
|
|
||||||
* be more efficient).
|
|
||||||
*
|
|
||||||
* @param fromIndex the lower-bound (inclusive) of the sub-interval
|
* @param fromIndex the lower-bound (inclusive) of the sub-interval
|
||||||
* @param size the size of the sub-range
|
* @param size the size of the sub-range
|
||||||
* @param length the upper-bound (exclusive) of the range
|
* @param length the upper-bound (exclusive) of the range
|
||||||
@ -702,54 +420,7 @@ public final class Objects {
|
|||||||
*/
|
*/
|
||||||
public static
|
public static
|
||||||
int checkFromIndexSize(int fromIndex, int size, int length) {
|
int checkFromIndexSize(int fromIndex, int size, int length) {
|
||||||
return checkFromIndexSize(fromIndex, size, length, null);
|
return Preconditions.checkFromIndexSize(fromIndex, size, length, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if the sub-range from {@code fromIndex} (inclusive) to
|
|
||||||
* {@code fromIndex + size} (exclusive) is within the bounds of range from
|
|
||||||
* {@code 0} (inclusive) to {@code length} (exclusive).
|
|
||||||
*
|
|
||||||
* <p>The sub-range is defined to be out-of-bounds if any of the following
|
|
||||||
* inequalities is true:
|
|
||||||
* <ul>
|
|
||||||
* <li>{@code fromIndex < 0}</li>
|
|
||||||
* <li>{@code size < 0}</li>
|
|
||||||
* <li>{@code fromIndex + size > length}, taking into account integer overflow</li>
|
|
||||||
* <li>{@code length < 0}, which is implied from the former inequalities</li>
|
|
||||||
* </ul>
|
|
||||||
*
|
|
||||||
* <p>If the sub-range is out-of-bounds, then a runtime exception is
|
|
||||||
* thrown that is the result of applying the following arguments to the
|
|
||||||
* exception formatter: the name of this method, {@code checkFromIndexSize};
|
|
||||||
* and an unmodifiable list integers whose values are, in order, the
|
|
||||||
* out-of-bounds arguments {@code fromIndex}, {@code size}, and
|
|
||||||
* {@code length}.
|
|
||||||
*
|
|
||||||
* @param <X> the type of runtime exception to throw if the arguments are
|
|
||||||
* out-of-bounds
|
|
||||||
* @param fromIndex the lower-bound (inclusive) of the sub-interval
|
|
||||||
* @param size the size of the sub-range
|
|
||||||
* @param length the upper-bound (exclusive) of the range
|
|
||||||
* @param oobef the exception formatter that when applied with this
|
|
||||||
* method name and out-of-bounds arguments returns a runtime
|
|
||||||
* exception. If {@code null} or returns {@code null} then, it is as
|
|
||||||
* if an exception formatter produced from an invocation of
|
|
||||||
* {@code outOfBoundsExceptionFormatter(IndexOutOfBounds::new)} is used
|
|
||||||
* instead (though it may be more efficient).
|
|
||||||
* Exceptions thrown by the formatter are relayed to the caller.
|
|
||||||
* @return {@code fromIndex} if the sub-range within bounds of the range
|
|
||||||
* @throws X if the sub-range is out-of-bounds and the exception factory
|
|
||||||
* function is non-{@code null}
|
|
||||||
* @throws IndexOutOfBoundsException if the sub-range is out-of-bounds and
|
|
||||||
* the exception factory function is {@code null}
|
|
||||||
* @since 9
|
|
||||||
*/
|
|
||||||
public static <X extends RuntimeException>
|
|
||||||
int checkFromIndexSize(int fromIndex, int size, int length,
|
|
||||||
BiFunction<String, List<Integer>, X> oobef) {
|
|
||||||
if ((length | fromIndex | size) < 0 || size > length - fromIndex)
|
|
||||||
throw outOfBoundsCheckFromIndexSize(oobef, fromIndex, size, length);
|
|
||||||
return fromIndex;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,346 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation. Oracle designates this
|
||||||
|
* particular file as subject to the "Classpath" exception as provided
|
||||||
|
* by Oracle in the LICENSE file that accompanied this code.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
package jdk.internal.util;
|
||||||
|
|
||||||
|
import jdk.internal.HotSpotIntrinsicCandidate;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.BiFunction;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility methods to check if state or arguments are correct.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class Preconditions {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maps out-of-bounds values to a runtime exception.
|
||||||
|
*
|
||||||
|
* @param checkKind the kind of bounds check, whose name may correspond
|
||||||
|
* to the name of one of the range check methods, checkIndex,
|
||||||
|
* checkFromToIndex, checkFromIndexSize
|
||||||
|
* @param args the out-of-bounds arguments that failed the range check.
|
||||||
|
* If the checkKind corresponds a the name of a range check method
|
||||||
|
* then the bounds arguments are those that can be passed in order
|
||||||
|
* to the method.
|
||||||
|
* @param oobef the exception formatter that when applied with a checkKind
|
||||||
|
* and a list out-of-bounds arguments returns a runtime exception.
|
||||||
|
* If {@code null} then, it is as if an exception formatter was
|
||||||
|
* supplied that returns {@link IndexOutOfBoundsException} for any
|
||||||
|
* given arguments.
|
||||||
|
* @return the runtime exception
|
||||||
|
*/
|
||||||
|
private static RuntimeException outOfBounds(
|
||||||
|
BiFunction<String, List<Integer>, ? extends RuntimeException> oobef,
|
||||||
|
String checkKind,
|
||||||
|
Integer... args) {
|
||||||
|
List<Integer> largs = List.of(args);
|
||||||
|
RuntimeException e = oobef == null
|
||||||
|
? null : oobef.apply(checkKind, largs);
|
||||||
|
return e == null
|
||||||
|
? new IndexOutOfBoundsException(outOfBoundsMessage(checkKind, largs)) : e;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static RuntimeException outOfBoundsCheckIndex(
|
||||||
|
BiFunction<String, List<Integer>, ? extends RuntimeException> oobe,
|
||||||
|
int index, int length) {
|
||||||
|
return outOfBounds(oobe, "checkIndex", index, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static RuntimeException outOfBoundsCheckFromToIndex(
|
||||||
|
BiFunction<String, List<Integer>, ? extends RuntimeException> oobe,
|
||||||
|
int fromIndex, int toIndex, int length) {
|
||||||
|
return outOfBounds(oobe, "checkFromToIndex", fromIndex, toIndex, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static RuntimeException outOfBoundsCheckFromIndexSize(
|
||||||
|
BiFunction<String, List<Integer>, ? extends RuntimeException> oobe,
|
||||||
|
int fromIndex, int size, int length) {
|
||||||
|
return outOfBounds(oobe, "checkFromIndexSize", fromIndex, size, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an out-of-bounds exception formatter from an given exception
|
||||||
|
* factory. The exception formatter is a function that formats an
|
||||||
|
* out-of-bounds message from its arguments and applies that message to the
|
||||||
|
* given exception factory to produce and relay an exception.
|
||||||
|
*
|
||||||
|
* <p>The exception formatter accepts two arguments: a {@code String}
|
||||||
|
* describing the out-of-bounds range check that failed, referred to as the
|
||||||
|
* <em>check kind</em>; and a {@code List<Integer>} containing the
|
||||||
|
* out-of-bound integer values that failed the check. The list of
|
||||||
|
* out-of-bound values is not modified.
|
||||||
|
*
|
||||||
|
* <p>Three check kinds are supported {@code checkIndex},
|
||||||
|
* {@code checkFromToIndex} and {@code checkFromIndexSize} corresponding
|
||||||
|
* respectively to the specified application of an exception formatter as an
|
||||||
|
* argument to the out-of-bounds range check methods
|
||||||
|
* {@link #checkIndex(int, int, BiFunction) checkIndex},
|
||||||
|
* {@link #checkFromToIndex(int, int, int, BiFunction) checkFromToIndex}, and
|
||||||
|
* {@link #checkFromIndexSize(int, int, int, BiFunction) checkFromIndexSize}.
|
||||||
|
* Thus a supported check kind corresponds to a method name and the
|
||||||
|
* out-of-bound integer values correspond to method argument values, in
|
||||||
|
* order, preceding the exception formatter argument (similar in many
|
||||||
|
* respects to the form of arguments required for a reflective invocation of
|
||||||
|
* such a range check method).
|
||||||
|
*
|
||||||
|
* <p>Formatter arguments conforming to such supported check kinds will
|
||||||
|
* produce specific exception messages describing failed out-of-bounds
|
||||||
|
* checks. Otherwise, more generic exception messages will be produced in
|
||||||
|
* any of the following cases: the check kind is supported but fewer
|
||||||
|
* or more out-of-bounds values are supplied, the check kind is not
|
||||||
|
* supported, the check kind is {@code null}, or the list of out-of-bound
|
||||||
|
* values is {@code null}.
|
||||||
|
*
|
||||||
|
* @apiNote
|
||||||
|
* This method produces an out-of-bounds exception formatter that can be
|
||||||
|
* passed as an argument to any of the supported out-of-bounds range check
|
||||||
|
* methods declared by {@code Objects}. For example, a formatter producing
|
||||||
|
* an {@code ArrayIndexOutOfBoundsException} may be produced and stored on a
|
||||||
|
* {@code static final} field as follows:
|
||||||
|
* <pre>{@code
|
||||||
|
* static final
|
||||||
|
* BiFunction<String, List<Integer>, ArrayIndexOutOfBoundsException> AIOOBEF =
|
||||||
|
* outOfBoundsExceptionFormatter(ArrayIndexOutOfBoundsException::new);
|
||||||
|
* }</pre>
|
||||||
|
* The formatter instance {@code AIOOBEF} may be passed as an argument to an
|
||||||
|
* out-of-bounds range check method, such as checking if an {@code index}
|
||||||
|
* is within the bounds of a {@code limit}:
|
||||||
|
* <pre>{@code
|
||||||
|
* checkIndex(index, limit, AIOOBEF);
|
||||||
|
* }</pre>
|
||||||
|
* If the bounds check fails then the range check method will throw an
|
||||||
|
* {@code ArrayIndexOutOfBoundsException} with an appropriate exception
|
||||||
|
* message that is a produced from {@code AIOOBEF} as follows:
|
||||||
|
* <pre>{@code
|
||||||
|
* AIOOBEF.apply("checkIndex", List.of(index, limit));
|
||||||
|
* }</pre>
|
||||||
|
*
|
||||||
|
* @param f the exception factory, that produces an exception from a message
|
||||||
|
* where the message is produced and formatted by the returned
|
||||||
|
* exception formatter. If this factory is stateless and side-effect
|
||||||
|
* free then so is the returned formatter.
|
||||||
|
* Exceptions thrown by the factory are relayed to the caller
|
||||||
|
* of the returned formatter.
|
||||||
|
* @param <X> the type of runtime exception to be returned by the given
|
||||||
|
* exception factory and relayed by the exception formatter
|
||||||
|
* @return the out-of-bounds exception formatter
|
||||||
|
*/
|
||||||
|
public static <X extends RuntimeException>
|
||||||
|
BiFunction<String, List<Integer>, X> outOfBoundsExceptionFormatter(Function<String, X> f) {
|
||||||
|
// Use anonymous class to avoid bootstrap issues if this method is
|
||||||
|
// used early in startup
|
||||||
|
return new BiFunction<String, List<Integer>, X>() {
|
||||||
|
@Override
|
||||||
|
public X apply(String checkKind, List<Integer> args) {
|
||||||
|
return f.apply(outOfBoundsMessage(checkKind, args));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String outOfBoundsMessage(String checkKind, List<Integer> args) {
|
||||||
|
if (checkKind == null && args == null) {
|
||||||
|
return String.format("Range check failed");
|
||||||
|
} else if (checkKind == null) {
|
||||||
|
return String.format("Range check failed: %s", args);
|
||||||
|
} else if (args == null) {
|
||||||
|
return String.format("Range check failed: %s", checkKind);
|
||||||
|
}
|
||||||
|
|
||||||
|
int argSize = 0;
|
||||||
|
switch (checkKind) {
|
||||||
|
case "checkIndex":
|
||||||
|
argSize = 2;
|
||||||
|
break;
|
||||||
|
case "checkFromToIndex":
|
||||||
|
case "checkFromIndexSize":
|
||||||
|
argSize = 3;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
|
||||||
|
// Switch to default if fewer or more arguments than required are supplied
|
||||||
|
switch ((args.size() != argSize) ? "" : checkKind) {
|
||||||
|
case "checkIndex":
|
||||||
|
return String.format("Index %d out-of-bounds for length %d",
|
||||||
|
args.get(0), args.get(1));
|
||||||
|
case "checkFromToIndex":
|
||||||
|
return String.format("Range [%d, %d) out-of-bounds for length %d",
|
||||||
|
args.get(0), args.get(1), args.get(2));
|
||||||
|
case "checkFromIndexSize":
|
||||||
|
return String.format("Range [%d, %<d + %d) out-of-bounds for length %d",
|
||||||
|
args.get(0), args.get(1), args.get(2));
|
||||||
|
default:
|
||||||
|
return String.format("Range check failed: %s %s", checkKind, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the {@code index} is within the bounds of the range from
|
||||||
|
* {@code 0} (inclusive) to {@code length} (exclusive).
|
||||||
|
*
|
||||||
|
* <p>The {@code index} is defined to be out-of-bounds if any of the
|
||||||
|
* following inequalities is true:
|
||||||
|
* <ul>
|
||||||
|
* <li>{@code index < 0}</li>
|
||||||
|
* <li>{@code index >= length}</li>
|
||||||
|
* <li>{@code length < 0}, which is implied from the former inequalities</li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* <p>If the {@code index} is out-of-bounds, then a runtime exception is
|
||||||
|
* thrown that is the result of applying the following arguments to the
|
||||||
|
* exception formatter: the name of this method, {@code checkIndex};
|
||||||
|
* and an unmodifiable list integers whose values are, in order, the
|
||||||
|
* out-of-bounds arguments {@code index} and {@code length}.
|
||||||
|
*
|
||||||
|
* @param <X> the type of runtime exception to throw if the arguments are
|
||||||
|
* out-of-bounds
|
||||||
|
* @param index the index
|
||||||
|
* @param length the upper-bound (exclusive) of the range
|
||||||
|
* @param oobef the exception formatter that when applied with this
|
||||||
|
* method name and out-of-bounds arguments returns a runtime
|
||||||
|
* exception. If {@code null} or returns {@code null} then, it is as
|
||||||
|
* if an exception formatter produced from an invocation of
|
||||||
|
* {@code outOfBoundsExceptionFormatter(IndexOutOfBounds::new)} is used
|
||||||
|
* instead (though it may be more efficient).
|
||||||
|
* Exceptions thrown by the formatter are relayed to the caller.
|
||||||
|
* @return {@code index} if it is within bounds of the range
|
||||||
|
* @throws X if the {@code index} is out-of-bounds and the exception
|
||||||
|
* formatter is non-{@code null}
|
||||||
|
* @throws IndexOutOfBoundsException if the {@code index} is out-of-bounds
|
||||||
|
* and the exception formatter is {@code null}
|
||||||
|
* @since 9
|
||||||
|
*
|
||||||
|
* @implNote
|
||||||
|
* This method is made intrinsic in optimizing compilers to guide them to
|
||||||
|
* perform unsigned comparisons of the index and length when it is known the
|
||||||
|
* length is a non-negative value (such as that of an array length or from
|
||||||
|
* the upper bound of a loop)
|
||||||
|
*/
|
||||||
|
@HotSpotIntrinsicCandidate
|
||||||
|
public static <X extends RuntimeException>
|
||||||
|
int checkIndex(int index, int length,
|
||||||
|
BiFunction<String, List<Integer>, X> oobef) {
|
||||||
|
if (index < 0 || index >= length)
|
||||||
|
throw outOfBoundsCheckIndex(oobef, index, length);
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the sub-range from {@code fromIndex} (inclusive) to
|
||||||
|
* {@code toIndex} (exclusive) is within the bounds of range from {@code 0}
|
||||||
|
* (inclusive) to {@code length} (exclusive).
|
||||||
|
*
|
||||||
|
* <p>The sub-range is defined to be out-of-bounds if any of the following
|
||||||
|
* inequalities is true:
|
||||||
|
* <ul>
|
||||||
|
* <li>{@code fromIndex < 0}</li>
|
||||||
|
* <li>{@code fromIndex > toIndex}</li>
|
||||||
|
* <li>{@code toIndex > length}</li>
|
||||||
|
* <li>{@code length < 0}, which is implied from the former inequalities</li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* <p>If the sub-range is out-of-bounds, then a runtime exception is
|
||||||
|
* thrown that is the result of applying the following arguments to the
|
||||||
|
* exception formatter: the name of this method, {@code checkFromToIndex};
|
||||||
|
* and an unmodifiable list integers whose values are, in order, the
|
||||||
|
* out-of-bounds arguments {@code fromIndex}, {@code toIndex}, and {@code length}.
|
||||||
|
*
|
||||||
|
* @param <X> the type of runtime exception to throw if the arguments are
|
||||||
|
* out-of-bounds
|
||||||
|
* @param fromIndex the lower-bound (inclusive) of the sub-range
|
||||||
|
* @param toIndex the upper-bound (exclusive) of the sub-range
|
||||||
|
* @param length the upper-bound (exclusive) the range
|
||||||
|
* @param oobef the exception formatter that when applied with this
|
||||||
|
* method name and out-of-bounds arguments returns a runtime
|
||||||
|
* exception. If {@code null} or returns {@code null} then, it is as
|
||||||
|
* if an exception formatter produced from an invocation of
|
||||||
|
* {@code outOfBoundsExceptionFormatter(IndexOutOfBounds::new)} is used
|
||||||
|
* instead (though it may be more efficient).
|
||||||
|
* Exceptions thrown by the formatter are relayed to the caller.
|
||||||
|
* @return {@code fromIndex} if the sub-range within bounds of the range
|
||||||
|
* @throws X if the sub-range is out-of-bounds and the exception factory
|
||||||
|
* function is non-{@code null}
|
||||||
|
* @throws IndexOutOfBoundsException if the sub-range is out-of-bounds and
|
||||||
|
* the exception factory function is {@code null}
|
||||||
|
* @since 9
|
||||||
|
*/
|
||||||
|
public static <X extends RuntimeException>
|
||||||
|
int checkFromToIndex(int fromIndex, int toIndex, int length,
|
||||||
|
BiFunction<String, List<Integer>, X> oobef) {
|
||||||
|
if (fromIndex < 0 || fromIndex > toIndex || toIndex > length)
|
||||||
|
throw outOfBoundsCheckFromToIndex(oobef, fromIndex, toIndex, length);
|
||||||
|
return fromIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the sub-range from {@code fromIndex} (inclusive) to
|
||||||
|
* {@code fromIndex + size} (exclusive) is within the bounds of range from
|
||||||
|
* {@code 0} (inclusive) to {@code length} (exclusive).
|
||||||
|
*
|
||||||
|
* <p>The sub-range is defined to be out-of-bounds if any of the following
|
||||||
|
* inequalities is true:
|
||||||
|
* <ul>
|
||||||
|
* <li>{@code fromIndex < 0}</li>
|
||||||
|
* <li>{@code size < 0}</li>
|
||||||
|
* <li>{@code fromIndex + size > length}, taking into account integer overflow</li>
|
||||||
|
* <li>{@code length < 0}, which is implied from the former inequalities</li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* <p>If the sub-range is out-of-bounds, then a runtime exception is
|
||||||
|
* thrown that is the result of applying the following arguments to the
|
||||||
|
* exception formatter: the name of this method, {@code checkFromIndexSize};
|
||||||
|
* and an unmodifiable list integers whose values are, in order, the
|
||||||
|
* out-of-bounds arguments {@code fromIndex}, {@code size}, and
|
||||||
|
* {@code length}.
|
||||||
|
*
|
||||||
|
* @param <X> the type of runtime exception to throw if the arguments are
|
||||||
|
* out-of-bounds
|
||||||
|
* @param fromIndex the lower-bound (inclusive) of the sub-interval
|
||||||
|
* @param size the size of the sub-range
|
||||||
|
* @param length the upper-bound (exclusive) of the range
|
||||||
|
* @param oobef the exception formatter that when applied with this
|
||||||
|
* method name and out-of-bounds arguments returns a runtime
|
||||||
|
* exception. If {@code null} or returns {@code null} then, it is as
|
||||||
|
* if an exception formatter produced from an invocation of
|
||||||
|
* {@code outOfBoundsExceptionFormatter(IndexOutOfBounds::new)} is used
|
||||||
|
* instead (though it may be more efficient).
|
||||||
|
* Exceptions thrown by the formatter are relayed to the caller.
|
||||||
|
* @return {@code fromIndex} if the sub-range within bounds of the range
|
||||||
|
* @throws X if the sub-range is out-of-bounds and the exception factory
|
||||||
|
* function is non-{@code null}
|
||||||
|
* @throws IndexOutOfBoundsException if the sub-range is out-of-bounds and
|
||||||
|
* the exception factory function is {@code null}
|
||||||
|
* @since 9
|
||||||
|
*/
|
||||||
|
public static <X extends RuntimeException>
|
||||||
|
int checkFromIndexSize(int fromIndex, int size, int length,
|
||||||
|
BiFunction<String, List<Integer>, X> oobef) {
|
||||||
|
if ((length | fromIndex | size) < 0 || size > length - fromIndex)
|
||||||
|
throw outOfBoundsCheckFromIndexSize(oobef, fromIndex, size, length);
|
||||||
|
return fromIndex;
|
||||||
|
}
|
||||||
|
}
|
@ -40,6 +40,7 @@ import static org.testng.Assert.*;
|
|||||||
|
|
||||||
abstract class VarHandleBaseTest {
|
abstract class VarHandleBaseTest {
|
||||||
static final int ITERS = Integer.getInteger("iters", 1);
|
static final int ITERS = Integer.getInteger("iters", 1);
|
||||||
|
static final int WEAK_ATTEMPTS = Integer.getInteger("weakAttempts", 10);
|
||||||
|
|
||||||
interface ThrowingRunnable {
|
interface ThrowingRunnable {
|
||||||
void run() throws Throwable;
|
void run() throws Throwable;
|
||||||
@ -475,4 +476,4 @@ abstract class VarHandleBaseTest {
|
|||||||
assertEquals(mt.parameterType(mt.parameterCount() - 1), vh.varType());
|
assertEquals(mt.parameterType(mt.parameterCount() - 1), vh.varType());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -104,7 +104,6 @@ public class VarHandleTestAccessInt extends VarHandleBaseTest {
|
|||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE));
|
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE));
|
||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE));
|
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE));
|
||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET));
|
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET));
|
||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_VOLATILE));
|
|
||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE));
|
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE));
|
||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE));
|
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE));
|
||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET));
|
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET));
|
||||||
@ -402,39 +401,41 @@ public class VarHandleTestAccessInt extends VarHandleBaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSet(recv, 1, 2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet int");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSet(recv, 1, 2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet int");
|
||||||
int x = (int) vh.get(recv);
|
int x = (int) vh.get(recv);
|
||||||
assertEquals(x, 2, "weakCompareAndSet int value");
|
assertEquals(x, 2, "weakCompareAndSet int value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetAcquire(recv, 2, 1);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire int");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetAcquire(recv, 2, 1);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire int");
|
||||||
int x = (int) vh.get(recv);
|
int x = (int) vh.get(recv);
|
||||||
assertEquals(x, 1, "weakCompareAndSetAcquire int");
|
assertEquals(x, 1, "weakCompareAndSetAcquire int");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetRelease(recv, 1, 2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease int");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetRelease(recv, 1, 2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease int");
|
||||||
int x = (int) vh.get(recv);
|
int x = (int) vh.get(recv);
|
||||||
assertEquals(x, 2, "weakCompareAndSetRelease int");
|
assertEquals(x, 2, "weakCompareAndSetRelease int");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
boolean r = vh.weakCompareAndSetVolatile(recv, 2, 1);
|
|
||||||
assertEquals(r, true, "weakCompareAndSetVolatile int");
|
|
||||||
int x = (int) vh.get(recv);
|
|
||||||
assertEquals(x, 1, "weakCompareAndSetVolatile int value");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare set and get
|
// Compare set and get
|
||||||
{
|
{
|
||||||
int o = (int) vh.getAndSet(recv, 2);
|
int o = (int) vh.getAndSet(recv, 1);
|
||||||
assertEquals(o, 1, "getAndSet int");
|
assertEquals(o, 2, "getAndSet int");
|
||||||
int x = (int) vh.get(recv);
|
int x = (int) vh.get(recv);
|
||||||
assertEquals(x, 2, "getAndSet int value");
|
assertEquals(x, 1, "getAndSet int value");
|
||||||
}
|
}
|
||||||
|
|
||||||
vh.set(recv, 1);
|
vh.set(recv, 1);
|
||||||
@ -543,39 +544,41 @@ public class VarHandleTestAccessInt extends VarHandleBaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) vh.weakCompareAndSet(1, 2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet int");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSet(1, 2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet int");
|
||||||
int x = (int) vh.get();
|
int x = (int) vh.get();
|
||||||
assertEquals(x, 2, "weakCompareAndSet int value");
|
assertEquals(x, 2, "weakCompareAndSet int value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) vh.weakCompareAndSetAcquire(2, 1);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire int");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetAcquire(2, 1);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire int");
|
||||||
int x = (int) vh.get();
|
int x = (int) vh.get();
|
||||||
assertEquals(x, 1, "weakCompareAndSetAcquire int");
|
assertEquals(x, 1, "weakCompareAndSetAcquire int");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) vh.weakCompareAndSetRelease(1, 2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease int");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetRelease(1, 2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease int");
|
||||||
int x = (int) vh.get();
|
int x = (int) vh.get();
|
||||||
assertEquals(x, 2, "weakCompareAndSetRelease int");
|
assertEquals(x, 2, "weakCompareAndSetRelease int");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
boolean r = (boolean) vh.weakCompareAndSetVolatile(2, 1);
|
|
||||||
assertEquals(r, true, "weakCompareAndSetVolatile int");
|
|
||||||
int x = (int) vh.get();
|
|
||||||
assertEquals(x, 1, "weakCompareAndSetVolatile int value");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare set and get
|
// Compare set and get
|
||||||
{
|
{
|
||||||
int o = (int) vh.getAndSet( 2);
|
int o = (int) vh.getAndSet( 1);
|
||||||
assertEquals(o, 1, "getAndSet int");
|
assertEquals(o, 2, "getAndSet int");
|
||||||
int x = (int) vh.get();
|
int x = (int) vh.get();
|
||||||
assertEquals(x, 2, "getAndSet int value");
|
assertEquals(x, 1, "getAndSet int value");
|
||||||
}
|
}
|
||||||
|
|
||||||
vh.set(1);
|
vh.set(1);
|
||||||
@ -687,39 +690,41 @@ public class VarHandleTestAccessInt extends VarHandleBaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSet(array, i, 1, 2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet int");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSet(array, i, 1, 2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet int");
|
||||||
int x = (int) vh.get(array, i);
|
int x = (int) vh.get(array, i);
|
||||||
assertEquals(x, 2, "weakCompareAndSet int value");
|
assertEquals(x, 2, "weakCompareAndSet int value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetAcquire(array, i, 2, 1);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire int");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetAcquire(array, i, 2, 1);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire int");
|
||||||
int x = (int) vh.get(array, i);
|
int x = (int) vh.get(array, i);
|
||||||
assertEquals(x, 1, "weakCompareAndSetAcquire int");
|
assertEquals(x, 1, "weakCompareAndSetAcquire int");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetRelease(array, i, 1, 2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease int");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetRelease(array, i, 1, 2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease int");
|
||||||
int x = (int) vh.get(array, i);
|
int x = (int) vh.get(array, i);
|
||||||
assertEquals(x, 2, "weakCompareAndSetRelease int");
|
assertEquals(x, 2, "weakCompareAndSetRelease int");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
boolean r = vh.weakCompareAndSetVolatile(array, i, 2, 1);
|
|
||||||
assertEquals(r, true, "weakCompareAndSetVolatile int");
|
|
||||||
int x = (int) vh.get(array, i);
|
|
||||||
assertEquals(x, 1, "weakCompareAndSetVolatile int value");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare set and get
|
// Compare set and get
|
||||||
{
|
{
|
||||||
int o = (int) vh.getAndSet(array, i, 2);
|
int o = (int) vh.getAndSet(array, i, 1);
|
||||||
assertEquals(o, 1, "getAndSet int");
|
assertEquals(o, 2, "getAndSet int");
|
||||||
int x = (int) vh.get(array, i);
|
int x = (int) vh.get(array, i);
|
||||||
assertEquals(x, 2, "getAndSet int value");
|
assertEquals(x, 1, "getAndSet int value");
|
||||||
}
|
}
|
||||||
|
|
||||||
vh.set(array, i, 1);
|
vh.set(array, i, 1);
|
||||||
@ -799,10 +804,6 @@ public class VarHandleTestAccessInt extends VarHandleBaseTest {
|
|||||||
boolean r = vh.weakCompareAndSet(array, ci, 1, 2);
|
boolean r = vh.weakCompareAndSet(array, ci, 1, 2);
|
||||||
});
|
});
|
||||||
|
|
||||||
checkIOOBE(() -> {
|
|
||||||
boolean r = vh.weakCompareAndSetVolatile(array, ci, 1, 2);
|
|
||||||
});
|
|
||||||
|
|
||||||
checkIOOBE(() -> {
|
checkIOOBE(() -> {
|
||||||
boolean r = vh.weakCompareAndSetAcquire(array, ci, 1, 2);
|
boolean r = vh.weakCompareAndSetAcquire(array, ci, 1, 2);
|
||||||
});
|
});
|
||||||
|
@ -104,7 +104,6 @@ public class VarHandleTestAccessLong extends VarHandleBaseTest {
|
|||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE));
|
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE));
|
||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE));
|
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE));
|
||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET));
|
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET));
|
||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_VOLATILE));
|
|
||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE));
|
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE));
|
||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE));
|
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE));
|
||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET));
|
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET));
|
||||||
@ -402,39 +401,41 @@ public class VarHandleTestAccessLong extends VarHandleBaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSet(recv, 1L, 2L);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet long");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSet(recv, 1L, 2L);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet long");
|
||||||
long x = (long) vh.get(recv);
|
long x = (long) vh.get(recv);
|
||||||
assertEquals(x, 2L, "weakCompareAndSet long value");
|
assertEquals(x, 2L, "weakCompareAndSet long value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetAcquire(recv, 2L, 1L);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire long");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetAcquire(recv, 2L, 1L);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire long");
|
||||||
long x = (long) vh.get(recv);
|
long x = (long) vh.get(recv);
|
||||||
assertEquals(x, 1L, "weakCompareAndSetAcquire long");
|
assertEquals(x, 1L, "weakCompareAndSetAcquire long");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetRelease(recv, 1L, 2L);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease long");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetRelease(recv, 1L, 2L);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease long");
|
||||||
long x = (long) vh.get(recv);
|
long x = (long) vh.get(recv);
|
||||||
assertEquals(x, 2L, "weakCompareAndSetRelease long");
|
assertEquals(x, 2L, "weakCompareAndSetRelease long");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
boolean r = vh.weakCompareAndSetVolatile(recv, 2L, 1L);
|
|
||||||
assertEquals(r, true, "weakCompareAndSetVolatile long");
|
|
||||||
long x = (long) vh.get(recv);
|
|
||||||
assertEquals(x, 1L, "weakCompareAndSetVolatile long value");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare set and get
|
// Compare set and get
|
||||||
{
|
{
|
||||||
long o = (long) vh.getAndSet(recv, 2L);
|
long o = (long) vh.getAndSet(recv, 1L);
|
||||||
assertEquals(o, 1L, "getAndSet long");
|
assertEquals(o, 2L, "getAndSet long");
|
||||||
long x = (long) vh.get(recv);
|
long x = (long) vh.get(recv);
|
||||||
assertEquals(x, 2L, "getAndSet long value");
|
assertEquals(x, 1L, "getAndSet long value");
|
||||||
}
|
}
|
||||||
|
|
||||||
vh.set(recv, 1L);
|
vh.set(recv, 1L);
|
||||||
@ -543,39 +544,41 @@ public class VarHandleTestAccessLong extends VarHandleBaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) vh.weakCompareAndSet(1L, 2L);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet long");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSet(1L, 2L);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet long");
|
||||||
long x = (long) vh.get();
|
long x = (long) vh.get();
|
||||||
assertEquals(x, 2L, "weakCompareAndSet long value");
|
assertEquals(x, 2L, "weakCompareAndSet long value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) vh.weakCompareAndSetAcquire(2L, 1L);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire long");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetAcquire(2L, 1L);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire long");
|
||||||
long x = (long) vh.get();
|
long x = (long) vh.get();
|
||||||
assertEquals(x, 1L, "weakCompareAndSetAcquire long");
|
assertEquals(x, 1L, "weakCompareAndSetAcquire long");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) vh.weakCompareAndSetRelease(1L, 2L);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease long");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetRelease(1L, 2L);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease long");
|
||||||
long x = (long) vh.get();
|
long x = (long) vh.get();
|
||||||
assertEquals(x, 2L, "weakCompareAndSetRelease long");
|
assertEquals(x, 2L, "weakCompareAndSetRelease long");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
boolean r = (boolean) vh.weakCompareAndSetVolatile(2L, 1L);
|
|
||||||
assertEquals(r, true, "weakCompareAndSetVolatile long");
|
|
||||||
long x = (long) vh.get();
|
|
||||||
assertEquals(x, 1L, "weakCompareAndSetVolatile long value");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare set and get
|
// Compare set and get
|
||||||
{
|
{
|
||||||
long o = (long) vh.getAndSet( 2L);
|
long o = (long) vh.getAndSet( 1L);
|
||||||
assertEquals(o, 1L, "getAndSet long");
|
assertEquals(o, 2L, "getAndSet long");
|
||||||
long x = (long) vh.get();
|
long x = (long) vh.get();
|
||||||
assertEquals(x, 2L, "getAndSet long value");
|
assertEquals(x, 1L, "getAndSet long value");
|
||||||
}
|
}
|
||||||
|
|
||||||
vh.set(1L);
|
vh.set(1L);
|
||||||
@ -687,39 +690,41 @@ public class VarHandleTestAccessLong extends VarHandleBaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSet(array, i, 1L, 2L);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet long");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSet(array, i, 1L, 2L);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet long");
|
||||||
long x = (long) vh.get(array, i);
|
long x = (long) vh.get(array, i);
|
||||||
assertEquals(x, 2L, "weakCompareAndSet long value");
|
assertEquals(x, 2L, "weakCompareAndSet long value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetAcquire(array, i, 2L, 1L);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire long");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetAcquire(array, i, 2L, 1L);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire long");
|
||||||
long x = (long) vh.get(array, i);
|
long x = (long) vh.get(array, i);
|
||||||
assertEquals(x, 1L, "weakCompareAndSetAcquire long");
|
assertEquals(x, 1L, "weakCompareAndSetAcquire long");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetRelease(array, i, 1L, 2L);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease long");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetRelease(array, i, 1L, 2L);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease long");
|
||||||
long x = (long) vh.get(array, i);
|
long x = (long) vh.get(array, i);
|
||||||
assertEquals(x, 2L, "weakCompareAndSetRelease long");
|
assertEquals(x, 2L, "weakCompareAndSetRelease long");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
boolean r = vh.weakCompareAndSetVolatile(array, i, 2L, 1L);
|
|
||||||
assertEquals(r, true, "weakCompareAndSetVolatile long");
|
|
||||||
long x = (long) vh.get(array, i);
|
|
||||||
assertEquals(x, 1L, "weakCompareAndSetVolatile long value");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare set and get
|
// Compare set and get
|
||||||
{
|
{
|
||||||
long o = (long) vh.getAndSet(array, i, 2L);
|
long o = (long) vh.getAndSet(array, i, 1L);
|
||||||
assertEquals(o, 1L, "getAndSet long");
|
assertEquals(o, 2L, "getAndSet long");
|
||||||
long x = (long) vh.get(array, i);
|
long x = (long) vh.get(array, i);
|
||||||
assertEquals(x, 2L, "getAndSet long value");
|
assertEquals(x, 1L, "getAndSet long value");
|
||||||
}
|
}
|
||||||
|
|
||||||
vh.set(array, i, 1L);
|
vh.set(array, i, 1L);
|
||||||
@ -799,10 +804,6 @@ public class VarHandleTestAccessLong extends VarHandleBaseTest {
|
|||||||
boolean r = vh.weakCompareAndSet(array, ci, 1L, 2L);
|
boolean r = vh.weakCompareAndSet(array, ci, 1L, 2L);
|
||||||
});
|
});
|
||||||
|
|
||||||
checkIOOBE(() -> {
|
|
||||||
boolean r = vh.weakCompareAndSetVolatile(array, ci, 1L, 2L);
|
|
||||||
});
|
|
||||||
|
|
||||||
checkIOOBE(() -> {
|
checkIOOBE(() -> {
|
||||||
boolean r = vh.weakCompareAndSetAcquire(array, ci, 1L, 2L);
|
boolean r = vh.weakCompareAndSetAcquire(array, ci, 1L, 2L);
|
||||||
});
|
});
|
||||||
|
@ -104,7 +104,6 @@ public class VarHandleTestAccessString extends VarHandleBaseTest {
|
|||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE));
|
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE));
|
||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE));
|
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE));
|
||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET));
|
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET));
|
||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_VOLATILE));
|
|
||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE));
|
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE));
|
||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE));
|
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE));
|
||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET));
|
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET));
|
||||||
@ -416,39 +415,41 @@ public class VarHandleTestAccessString extends VarHandleBaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSet(recv, "foo", "bar");
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet String");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSet(recv, "foo", "bar");
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet String");
|
||||||
String x = (String) vh.get(recv);
|
String x = (String) vh.get(recv);
|
||||||
assertEquals(x, "bar", "weakCompareAndSet String value");
|
assertEquals(x, "bar", "weakCompareAndSet String value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetAcquire(recv, "bar", "foo");
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire String");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetAcquire(recv, "bar", "foo");
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire String");
|
||||||
String x = (String) vh.get(recv);
|
String x = (String) vh.get(recv);
|
||||||
assertEquals(x, "foo", "weakCompareAndSetAcquire String");
|
assertEquals(x, "foo", "weakCompareAndSetAcquire String");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetRelease(recv, "foo", "bar");
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease String");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetRelease(recv, "foo", "bar");
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease String");
|
||||||
String x = (String) vh.get(recv);
|
String x = (String) vh.get(recv);
|
||||||
assertEquals(x, "bar", "weakCompareAndSetRelease String");
|
assertEquals(x, "bar", "weakCompareAndSetRelease String");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
boolean r = vh.weakCompareAndSetVolatile(recv, "bar", "foo");
|
|
||||||
assertEquals(r, true, "weakCompareAndSetVolatile String");
|
|
||||||
String x = (String) vh.get(recv);
|
|
||||||
assertEquals(x, "foo", "weakCompareAndSetVolatile String value");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare set and get
|
// Compare set and get
|
||||||
{
|
{
|
||||||
String o = (String) vh.getAndSet(recv, "bar");
|
String o = (String) vh.getAndSet(recv, "foo");
|
||||||
assertEquals(o, "foo", "getAndSet String");
|
assertEquals(o, "bar", "getAndSet String");
|
||||||
String x = (String) vh.get(recv);
|
String x = (String) vh.get(recv);
|
||||||
assertEquals(x, "bar", "getAndSet String value");
|
assertEquals(x, "foo", "getAndSet String value");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -555,39 +556,41 @@ public class VarHandleTestAccessString extends VarHandleBaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) vh.weakCompareAndSet("foo", "bar");
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet String");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSet("foo", "bar");
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet String");
|
||||||
String x = (String) vh.get();
|
String x = (String) vh.get();
|
||||||
assertEquals(x, "bar", "weakCompareAndSet String value");
|
assertEquals(x, "bar", "weakCompareAndSet String value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) vh.weakCompareAndSetAcquire("bar", "foo");
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire String");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetAcquire("bar", "foo");
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire String");
|
||||||
String x = (String) vh.get();
|
String x = (String) vh.get();
|
||||||
assertEquals(x, "foo", "weakCompareAndSetAcquire String");
|
assertEquals(x, "foo", "weakCompareAndSetAcquire String");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) vh.weakCompareAndSetRelease("foo", "bar");
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease String");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetRelease("foo", "bar");
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease String");
|
||||||
String x = (String) vh.get();
|
String x = (String) vh.get();
|
||||||
assertEquals(x, "bar", "weakCompareAndSetRelease String");
|
assertEquals(x, "bar", "weakCompareAndSetRelease String");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
boolean r = (boolean) vh.weakCompareAndSetVolatile("bar", "foo");
|
|
||||||
assertEquals(r, true, "weakCompareAndSetVolatile String");
|
|
||||||
String x = (String) vh.get();
|
|
||||||
assertEquals(x, "foo", "weakCompareAndSetVolatile String value");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare set and get
|
// Compare set and get
|
||||||
{
|
{
|
||||||
String o = (String) vh.getAndSet( "bar");
|
String o = (String) vh.getAndSet( "foo");
|
||||||
assertEquals(o, "foo", "getAndSet String");
|
assertEquals(o, "bar", "getAndSet String");
|
||||||
String x = (String) vh.get();
|
String x = (String) vh.get();
|
||||||
assertEquals(x, "bar", "getAndSet String value");
|
assertEquals(x, "foo", "getAndSet String value");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -697,39 +700,41 @@ public class VarHandleTestAccessString extends VarHandleBaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSet(array, i, "foo", "bar");
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet String");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSet(array, i, "foo", "bar");
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet String");
|
||||||
String x = (String) vh.get(array, i);
|
String x = (String) vh.get(array, i);
|
||||||
assertEquals(x, "bar", "weakCompareAndSet String value");
|
assertEquals(x, "bar", "weakCompareAndSet String value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetAcquire(array, i, "bar", "foo");
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire String");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetAcquire(array, i, "bar", "foo");
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire String");
|
||||||
String x = (String) vh.get(array, i);
|
String x = (String) vh.get(array, i);
|
||||||
assertEquals(x, "foo", "weakCompareAndSetAcquire String");
|
assertEquals(x, "foo", "weakCompareAndSetAcquire String");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetRelease(array, i, "foo", "bar");
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease String");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetRelease(array, i, "foo", "bar");
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease String");
|
||||||
String x = (String) vh.get(array, i);
|
String x = (String) vh.get(array, i);
|
||||||
assertEquals(x, "bar", "weakCompareAndSetRelease String");
|
assertEquals(x, "bar", "weakCompareAndSetRelease String");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
boolean r = vh.weakCompareAndSetVolatile(array, i, "bar", "foo");
|
|
||||||
assertEquals(r, true, "weakCompareAndSetVolatile String");
|
|
||||||
String x = (String) vh.get(array, i);
|
|
||||||
assertEquals(x, "foo", "weakCompareAndSetVolatile String value");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare set and get
|
// Compare set and get
|
||||||
{
|
{
|
||||||
String o = (String) vh.getAndSet(array, i, "bar");
|
String o = (String) vh.getAndSet(array, i, "foo");
|
||||||
assertEquals(o, "foo", "getAndSet String");
|
assertEquals(o, "bar", "getAndSet String");
|
||||||
String x = (String) vh.get(array, i);
|
String x = (String) vh.get(array, i);
|
||||||
assertEquals(x, "bar", "getAndSet String value");
|
assertEquals(x, "foo", "getAndSet String value");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -807,10 +812,6 @@ public class VarHandleTestAccessString extends VarHandleBaseTest {
|
|||||||
boolean r = vh.weakCompareAndSet(array, ci, "foo", "bar");
|
boolean r = vh.weakCompareAndSet(array, ci, "foo", "bar");
|
||||||
});
|
});
|
||||||
|
|
||||||
checkIOOBE(() -> {
|
|
||||||
boolean r = vh.weakCompareAndSetVolatile(array, ci, "foo", "bar");
|
|
||||||
});
|
|
||||||
|
|
||||||
checkIOOBE(() -> {
|
checkIOOBE(() -> {
|
||||||
boolean r = vh.weakCompareAndSetAcquire(array, ci, "foo", "bar");
|
boolean r = vh.weakCompareAndSetAcquire(array, ci, "foo", "bar");
|
||||||
});
|
});
|
||||||
|
@ -700,22 +700,31 @@ public class VarHandleTestByteArrayAsDouble extends VarHandleBaseByteArrayTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet double");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet double");
|
||||||
double x = (double) vh.get(array, i);
|
double x = (double) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_2, "weakCompareAndSet double value");
|
assertEquals(x, VALUE_2, "weakCompareAndSet double value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire double");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire double");
|
||||||
double x = (double) vh.get(array, i);
|
double x = (double) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_1, "weakCompareAndSetAcquire double");
|
assertEquals(x, VALUE_1, "weakCompareAndSetAcquire double");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease double");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease double");
|
||||||
double x = (double) vh.get(array, i);
|
double x = (double) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_2, "weakCompareAndSetRelease double");
|
assertEquals(x, VALUE_2, "weakCompareAndSetRelease double");
|
||||||
}
|
}
|
||||||
@ -840,22 +849,31 @@ public class VarHandleTestByteArrayAsDouble extends VarHandleBaseByteArrayTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet double");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet double");
|
||||||
double x = (double) vh.get(array, i);
|
double x = (double) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_2, "weakCompareAndSet double value");
|
assertEquals(x, VALUE_2, "weakCompareAndSet double value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire double");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire double");
|
||||||
double x = (double) vh.get(array, i);
|
double x = (double) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_1, "weakCompareAndSetAcquire double");
|
assertEquals(x, VALUE_1, "weakCompareAndSetAcquire double");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease double");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease double");
|
||||||
double x = (double) vh.get(array, i);
|
double x = (double) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_2, "weakCompareAndSetRelease double");
|
assertEquals(x, VALUE_2, "weakCompareAndSetRelease double");
|
||||||
}
|
}
|
||||||
|
@ -700,22 +700,31 @@ public class VarHandleTestByteArrayAsFloat extends VarHandleBaseByteArrayTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet float");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet float");
|
||||||
float x = (float) vh.get(array, i);
|
float x = (float) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_2, "weakCompareAndSet float value");
|
assertEquals(x, VALUE_2, "weakCompareAndSet float value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire float");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire float");
|
||||||
float x = (float) vh.get(array, i);
|
float x = (float) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_1, "weakCompareAndSetAcquire float");
|
assertEquals(x, VALUE_1, "weakCompareAndSetAcquire float");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease float");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease float");
|
||||||
float x = (float) vh.get(array, i);
|
float x = (float) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_2, "weakCompareAndSetRelease float");
|
assertEquals(x, VALUE_2, "weakCompareAndSetRelease float");
|
||||||
}
|
}
|
||||||
@ -840,22 +849,31 @@ public class VarHandleTestByteArrayAsFloat extends VarHandleBaseByteArrayTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet float");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet float");
|
||||||
float x = (float) vh.get(array, i);
|
float x = (float) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_2, "weakCompareAndSet float value");
|
assertEquals(x, VALUE_2, "weakCompareAndSet float value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire float");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire float");
|
||||||
float x = (float) vh.get(array, i);
|
float x = (float) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_1, "weakCompareAndSetAcquire float");
|
assertEquals(x, VALUE_1, "weakCompareAndSetAcquire float");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease float");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease float");
|
||||||
float x = (float) vh.get(array, i);
|
float x = (float) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_2, "weakCompareAndSetRelease float");
|
assertEquals(x, VALUE_2, "weakCompareAndSetRelease float");
|
||||||
}
|
}
|
||||||
|
@ -714,22 +714,31 @@ public class VarHandleTestByteArrayAsInt extends VarHandleBaseByteArrayTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet int");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet int");
|
||||||
int x = (int) vh.get(array, i);
|
int x = (int) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_2, "weakCompareAndSet int value");
|
assertEquals(x, VALUE_2, "weakCompareAndSet int value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire int");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire int");
|
||||||
int x = (int) vh.get(array, i);
|
int x = (int) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_1, "weakCompareAndSetAcquire int");
|
assertEquals(x, VALUE_1, "weakCompareAndSetAcquire int");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease int");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease int");
|
||||||
int x = (int) vh.get(array, i);
|
int x = (int) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_2, "weakCompareAndSetRelease int");
|
assertEquals(x, VALUE_2, "weakCompareAndSetRelease int");
|
||||||
}
|
}
|
||||||
@ -863,22 +872,31 @@ public class VarHandleTestByteArrayAsInt extends VarHandleBaseByteArrayTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet int");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet int");
|
||||||
int x = (int) vh.get(array, i);
|
int x = (int) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_2, "weakCompareAndSet int value");
|
assertEquals(x, VALUE_2, "weakCompareAndSet int value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire int");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire int");
|
||||||
int x = (int) vh.get(array, i);
|
int x = (int) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_1, "weakCompareAndSetAcquire int");
|
assertEquals(x, VALUE_1, "weakCompareAndSetAcquire int");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease int");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease int");
|
||||||
int x = (int) vh.get(array, i);
|
int x = (int) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_2, "weakCompareAndSetRelease int");
|
assertEquals(x, VALUE_2, "weakCompareAndSetRelease int");
|
||||||
}
|
}
|
||||||
|
@ -714,22 +714,31 @@ public class VarHandleTestByteArrayAsLong extends VarHandleBaseByteArrayTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet long");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet long");
|
||||||
long x = (long) vh.get(array, i);
|
long x = (long) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_2, "weakCompareAndSet long value");
|
assertEquals(x, VALUE_2, "weakCompareAndSet long value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire long");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire long");
|
||||||
long x = (long) vh.get(array, i);
|
long x = (long) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_1, "weakCompareAndSetAcquire long");
|
assertEquals(x, VALUE_1, "weakCompareAndSetAcquire long");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease long");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease long");
|
||||||
long x = (long) vh.get(array, i);
|
long x = (long) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_2, "weakCompareAndSetRelease long");
|
assertEquals(x, VALUE_2, "weakCompareAndSetRelease long");
|
||||||
}
|
}
|
||||||
@ -863,22 +872,31 @@ public class VarHandleTestByteArrayAsLong extends VarHandleBaseByteArrayTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet long");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet long");
|
||||||
long x = (long) vh.get(array, i);
|
long x = (long) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_2, "weakCompareAndSet long value");
|
assertEquals(x, VALUE_2, "weakCompareAndSet long value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire long");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire long");
|
||||||
long x = (long) vh.get(array, i);
|
long x = (long) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_1, "weakCompareAndSetAcquire long");
|
assertEquals(x, VALUE_1, "weakCompareAndSetAcquire long");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease long");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease long");
|
||||||
long x = (long) vh.get(array, i);
|
long x = (long) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_2, "weakCompareAndSetRelease long");
|
assertEquals(x, VALUE_2, "weakCompareAndSetRelease long");
|
||||||
}
|
}
|
||||||
|
@ -208,39 +208,41 @@ public class VarHandleTestMethodHandleAccessInt extends VarHandleBaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(recv, 1, 2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet int");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(recv, 1, 2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet int");
|
||||||
int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
|
int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
|
||||||
assertEquals(x, 2, "weakCompareAndSet int value");
|
assertEquals(x, 2, "weakCompareAndSet int value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, 2, 1);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire int");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, 2, 1);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire int");
|
||||||
int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
|
int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
|
||||||
assertEquals(x, 1, "weakCompareAndSetAcquire int");
|
assertEquals(x, 1, "weakCompareAndSetAcquire int");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, 1, 2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease int");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, 1, 2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease int");
|
||||||
int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
|
int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
|
||||||
assertEquals(x, 2, "weakCompareAndSetRelease int");
|
assertEquals(x, 2, "weakCompareAndSetRelease int");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(recv, 2, 1);
|
|
||||||
assertEquals(r, true, "weakCompareAndSetVolatile int");
|
|
||||||
int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
|
|
||||||
assertEquals(x, 1, "weakCompareAndSetVolatile int value");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare set and get
|
// Compare set and get
|
||||||
{
|
{
|
||||||
int o = (int) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, 2);
|
int o = (int) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, 1);
|
||||||
assertEquals(o, 1, "getAndSet int");
|
assertEquals(o, 2, "getAndSet int");
|
||||||
int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
|
int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
|
||||||
assertEquals(x, 2, "getAndSet int value");
|
assertEquals(x, 1, "getAndSet int value");
|
||||||
}
|
}
|
||||||
|
|
||||||
hs.get(TestAccessMode.SET).invokeExact(recv, 1);
|
hs.get(TestAccessMode.SET).invokeExact(recv, 1);
|
||||||
@ -349,39 +351,41 @@ public class VarHandleTestMethodHandleAccessInt extends VarHandleBaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(1, 2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet int");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(1, 2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet int");
|
||||||
int x = (int) hs.get(TestAccessMode.GET).invokeExact();
|
int x = (int) hs.get(TestAccessMode.GET).invokeExact();
|
||||||
assertEquals(x, 2, "weakCompareAndSet int value");
|
assertEquals(x, 2, "weakCompareAndSet int value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(2, 1);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire int");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(2, 1);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire int");
|
||||||
int x = (int) hs.get(TestAccessMode.GET).invokeExact();
|
int x = (int) hs.get(TestAccessMode.GET).invokeExact();
|
||||||
assertEquals(x, 1, "weakCompareAndSetAcquire int");
|
assertEquals(x, 1, "weakCompareAndSetAcquire int");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(1, 2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease int");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(1, 2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease int");
|
||||||
int x = (int) hs.get(TestAccessMode.GET).invokeExact();
|
int x = (int) hs.get(TestAccessMode.GET).invokeExact();
|
||||||
assertEquals(x, 2, "weakCompareAndSetRelease int");
|
assertEquals(x, 2, "weakCompareAndSetRelease int");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(2, 1);
|
|
||||||
assertEquals(r, true, "weakCompareAndSetVolatile int");
|
|
||||||
int x = (int) hs.get(TestAccessMode.GET).invokeExact();
|
|
||||||
assertEquals(x, 1, "weakCompareAndSetVolatile int value");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare set and get
|
// Compare set and get
|
||||||
{
|
{
|
||||||
int o = (int) hs.get(TestAccessMode.GET_AND_SET).invokeExact(2);
|
int o = (int) hs.get(TestAccessMode.GET_AND_SET).invokeExact( 1);
|
||||||
assertEquals(o, 1, "getAndSet int");
|
assertEquals(o, 2, "getAndSet int");
|
||||||
int x = (int) hs.get(TestAccessMode.GET).invokeExact();
|
int x = (int) hs.get(TestAccessMode.GET).invokeExact();
|
||||||
assertEquals(x, 2, "getAndSet int value");
|
assertEquals(x, 1, "getAndSet int value");
|
||||||
}
|
}
|
||||||
|
|
||||||
hs.get(TestAccessMode.SET).invokeExact(1);
|
hs.get(TestAccessMode.SET).invokeExact(1);
|
||||||
@ -493,39 +497,41 @@ public class VarHandleTestMethodHandleAccessInt extends VarHandleBaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, 1, 2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet int");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, 1, 2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet int");
|
||||||
int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
||||||
assertEquals(x, 2, "weakCompareAndSet int value");
|
assertEquals(x, 2, "weakCompareAndSet int value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, 2, 1);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire int");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, 2, 1);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire int");
|
||||||
int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
||||||
assertEquals(x, 1, "weakCompareAndSetAcquire int");
|
assertEquals(x, 1, "weakCompareAndSetAcquire int");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(array, i, 1, 2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease int");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(array, i, 1, 2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease int");
|
||||||
int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
||||||
assertEquals(x, 2, "weakCompareAndSetRelease int");
|
assertEquals(x, 2, "weakCompareAndSetRelease int");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(array, i, 2, 1);
|
|
||||||
assertEquals(r, true, "weakCompareAndSetVolatile int");
|
|
||||||
int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
|
||||||
assertEquals(x, 1, "weakCompareAndSetVolatile int value");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare set and get
|
// Compare set and get
|
||||||
{
|
{
|
||||||
int o = (int) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, 2);
|
int o = (int) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, 1);
|
||||||
assertEquals(o, 1, "getAndSet int");
|
assertEquals(o, 2, "getAndSet int");
|
||||||
int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
||||||
assertEquals(x, 2, "getAndSet int value");
|
assertEquals(x, 1, "getAndSet int value");
|
||||||
}
|
}
|
||||||
|
|
||||||
hs.get(TestAccessMode.SET).invokeExact(array, i, 1);
|
hs.get(TestAccessMode.SET).invokeExact(array, i, 1);
|
||||||
|
@ -208,39 +208,41 @@ public class VarHandleTestMethodHandleAccessLong extends VarHandleBaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(recv, 1L, 2L);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet long");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(recv, 1L, 2L);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet long");
|
||||||
long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
|
long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
|
||||||
assertEquals(x, 2L, "weakCompareAndSet long value");
|
assertEquals(x, 2L, "weakCompareAndSet long value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, 2L, 1L);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire long");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, 2L, 1L);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire long");
|
||||||
long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
|
long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
|
||||||
assertEquals(x, 1L, "weakCompareAndSetAcquire long");
|
assertEquals(x, 1L, "weakCompareAndSetAcquire long");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, 1L, 2L);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease long");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, 1L, 2L);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease long");
|
||||||
long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
|
long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
|
||||||
assertEquals(x, 2L, "weakCompareAndSetRelease long");
|
assertEquals(x, 2L, "weakCompareAndSetRelease long");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(recv, 2L, 1L);
|
|
||||||
assertEquals(r, true, "weakCompareAndSetVolatile long");
|
|
||||||
long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
|
|
||||||
assertEquals(x, 1L, "weakCompareAndSetVolatile long value");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare set and get
|
// Compare set and get
|
||||||
{
|
{
|
||||||
long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, 2L);
|
long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, 1L);
|
||||||
assertEquals(o, 1L, "getAndSet long");
|
assertEquals(o, 2L, "getAndSet long");
|
||||||
long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
|
long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
|
||||||
assertEquals(x, 2L, "getAndSet long value");
|
assertEquals(x, 1L, "getAndSet long value");
|
||||||
}
|
}
|
||||||
|
|
||||||
hs.get(TestAccessMode.SET).invokeExact(recv, 1L);
|
hs.get(TestAccessMode.SET).invokeExact(recv, 1L);
|
||||||
@ -349,39 +351,41 @@ public class VarHandleTestMethodHandleAccessLong extends VarHandleBaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(1L, 2L);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet long");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(1L, 2L);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet long");
|
||||||
long x = (long) hs.get(TestAccessMode.GET).invokeExact();
|
long x = (long) hs.get(TestAccessMode.GET).invokeExact();
|
||||||
assertEquals(x, 2L, "weakCompareAndSet long value");
|
assertEquals(x, 2L, "weakCompareAndSet long value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(2L, 1L);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire long");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(2L, 1L);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire long");
|
||||||
long x = (long) hs.get(TestAccessMode.GET).invokeExact();
|
long x = (long) hs.get(TestAccessMode.GET).invokeExact();
|
||||||
assertEquals(x, 1L, "weakCompareAndSetAcquire long");
|
assertEquals(x, 1L, "weakCompareAndSetAcquire long");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(1L, 2L);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease long");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(1L, 2L);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease long");
|
||||||
long x = (long) hs.get(TestAccessMode.GET).invokeExact();
|
long x = (long) hs.get(TestAccessMode.GET).invokeExact();
|
||||||
assertEquals(x, 2L, "weakCompareAndSetRelease long");
|
assertEquals(x, 2L, "weakCompareAndSetRelease long");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(2L, 1L);
|
|
||||||
assertEquals(r, true, "weakCompareAndSetVolatile long");
|
|
||||||
long x = (long) hs.get(TestAccessMode.GET).invokeExact();
|
|
||||||
assertEquals(x, 1L, "weakCompareAndSetVolatile long value");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare set and get
|
// Compare set and get
|
||||||
{
|
{
|
||||||
long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(2L);
|
long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact( 1L);
|
||||||
assertEquals(o, 1L, "getAndSet long");
|
assertEquals(o, 2L, "getAndSet long");
|
||||||
long x = (long) hs.get(TestAccessMode.GET).invokeExact();
|
long x = (long) hs.get(TestAccessMode.GET).invokeExact();
|
||||||
assertEquals(x, 2L, "getAndSet long value");
|
assertEquals(x, 1L, "getAndSet long value");
|
||||||
}
|
}
|
||||||
|
|
||||||
hs.get(TestAccessMode.SET).invokeExact(1L);
|
hs.get(TestAccessMode.SET).invokeExact(1L);
|
||||||
@ -493,39 +497,41 @@ public class VarHandleTestMethodHandleAccessLong extends VarHandleBaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, 1L, 2L);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet long");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, 1L, 2L);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet long");
|
||||||
long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
||||||
assertEquals(x, 2L, "weakCompareAndSet long value");
|
assertEquals(x, 2L, "weakCompareAndSet long value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, 2L, 1L);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire long");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, 2L, 1L);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire long");
|
||||||
long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
||||||
assertEquals(x, 1L, "weakCompareAndSetAcquire long");
|
assertEquals(x, 1L, "weakCompareAndSetAcquire long");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(array, i, 1L, 2L);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease long");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(array, i, 1L, 2L);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease long");
|
||||||
long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
||||||
assertEquals(x, 2L, "weakCompareAndSetRelease long");
|
assertEquals(x, 2L, "weakCompareAndSetRelease long");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(array, i, 2L, 1L);
|
|
||||||
assertEquals(r, true, "weakCompareAndSetVolatile long");
|
|
||||||
long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
|
||||||
assertEquals(x, 1L, "weakCompareAndSetVolatile long value");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare set and get
|
// Compare set and get
|
||||||
{
|
{
|
||||||
long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, 2L);
|
long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, 1L);
|
||||||
assertEquals(o, 1L, "getAndSet long");
|
assertEquals(o, 2L, "getAndSet long");
|
||||||
long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
||||||
assertEquals(x, 2L, "getAndSet long value");
|
assertEquals(x, 1L, "getAndSet long value");
|
||||||
}
|
}
|
||||||
|
|
||||||
hs.get(TestAccessMode.SET).invokeExact(array, i, 1L);
|
hs.get(TestAccessMode.SET).invokeExact(array, i, 1L);
|
||||||
|
@ -208,39 +208,41 @@ public class VarHandleTestMethodHandleAccessString extends VarHandleBaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(recv, "foo", "bar");
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet String");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(recv, "foo", "bar");
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet String");
|
||||||
String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
|
String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
|
||||||
assertEquals(x, "bar", "weakCompareAndSet String value");
|
assertEquals(x, "bar", "weakCompareAndSet String value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, "bar", "foo");
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire String");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, "bar", "foo");
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire String");
|
||||||
String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
|
String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
|
||||||
assertEquals(x, "foo", "weakCompareAndSetAcquire String");
|
assertEquals(x, "foo", "weakCompareAndSetAcquire String");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, "foo", "bar");
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease String");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, "foo", "bar");
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease String");
|
||||||
String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
|
String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
|
||||||
assertEquals(x, "bar", "weakCompareAndSetRelease String");
|
assertEquals(x, "bar", "weakCompareAndSetRelease String");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(recv, "bar", "foo");
|
|
||||||
assertEquals(r, true, "weakCompareAndSetVolatile String");
|
|
||||||
String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
|
|
||||||
assertEquals(x, "foo", "weakCompareAndSetVolatile String value");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare set and get
|
// Compare set and get
|
||||||
{
|
{
|
||||||
String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, "bar");
|
String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, "foo");
|
||||||
assertEquals(o, "foo", "getAndSet String");
|
assertEquals(o, "bar", "getAndSet String");
|
||||||
String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
|
String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
|
||||||
assertEquals(x, "bar", "getAndSet String value");
|
assertEquals(x, "foo", "getAndSet String value");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -345,39 +347,41 @@ public class VarHandleTestMethodHandleAccessString extends VarHandleBaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact("foo", "bar");
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet String");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact("foo", "bar");
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet String");
|
||||||
String x = (String) hs.get(TestAccessMode.GET).invokeExact();
|
String x = (String) hs.get(TestAccessMode.GET).invokeExact();
|
||||||
assertEquals(x, "bar", "weakCompareAndSet String value");
|
assertEquals(x, "bar", "weakCompareAndSet String value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact("bar", "foo");
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire String");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact("bar", "foo");
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire String");
|
||||||
String x = (String) hs.get(TestAccessMode.GET).invokeExact();
|
String x = (String) hs.get(TestAccessMode.GET).invokeExact();
|
||||||
assertEquals(x, "foo", "weakCompareAndSetAcquire String");
|
assertEquals(x, "foo", "weakCompareAndSetAcquire String");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact("foo", "bar");
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease String");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact("foo", "bar");
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease String");
|
||||||
String x = (String) hs.get(TestAccessMode.GET).invokeExact();
|
String x = (String) hs.get(TestAccessMode.GET).invokeExact();
|
||||||
assertEquals(x, "bar", "weakCompareAndSetRelease String");
|
assertEquals(x, "bar", "weakCompareAndSetRelease String");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact("bar", "foo");
|
|
||||||
assertEquals(r, true, "weakCompareAndSetVolatile String");
|
|
||||||
String x = (String) hs.get(TestAccessMode.GET).invokeExact();
|
|
||||||
assertEquals(x, "foo", "weakCompareAndSetVolatile String value");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare set and get
|
// Compare set and get
|
||||||
{
|
{
|
||||||
String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact("bar");
|
String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact( "foo");
|
||||||
assertEquals(o, "foo", "getAndSet String");
|
assertEquals(o, "bar", "getAndSet String");
|
||||||
String x = (String) hs.get(TestAccessMode.GET).invokeExact();
|
String x = (String) hs.get(TestAccessMode.GET).invokeExact();
|
||||||
assertEquals(x, "bar", "getAndSet String value");
|
assertEquals(x, "foo", "getAndSet String value");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -485,39 +489,41 @@ public class VarHandleTestMethodHandleAccessString extends VarHandleBaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, "foo", "bar");
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet String");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, "foo", "bar");
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet String");
|
||||||
String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
||||||
assertEquals(x, "bar", "weakCompareAndSet String value");
|
assertEquals(x, "bar", "weakCompareAndSet String value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, "bar", "foo");
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire String");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, "bar", "foo");
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire String");
|
||||||
String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
||||||
assertEquals(x, "foo", "weakCompareAndSetAcquire String");
|
assertEquals(x, "foo", "weakCompareAndSetAcquire String");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(array, i, "foo", "bar");
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease String");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(array, i, "foo", "bar");
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease String");
|
||||||
String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
||||||
assertEquals(x, "bar", "weakCompareAndSetRelease String");
|
assertEquals(x, "bar", "weakCompareAndSetRelease String");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(array, i, "bar", "foo");
|
|
||||||
assertEquals(r, true, "weakCompareAndSetVolatile String");
|
|
||||||
String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
|
||||||
assertEquals(x, "foo", "weakCompareAndSetVolatile String value");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare set and get
|
// Compare set and get
|
||||||
{
|
{
|
||||||
String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, "bar");
|
String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, "foo");
|
||||||
assertEquals(o, "foo", "getAndSet String");
|
assertEquals(o, "bar", "getAndSet String");
|
||||||
String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
||||||
assertEquals(x, "bar", "getAndSet String value");
|
assertEquals(x, "foo", "getAndSet String value");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -105,7 +105,6 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest {
|
|||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE));
|
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE));
|
||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE));
|
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE));
|
||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET));
|
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET));
|
||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_VOLATILE));
|
|
||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE));
|
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE));
|
||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE));
|
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE));
|
||||||
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET));
|
assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET));
|
||||||
@ -115,7 +114,6 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest {
|
|||||||
assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE));
|
assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE));
|
||||||
assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE));
|
assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE));
|
||||||
assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET));
|
assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET));
|
||||||
assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_VOLATILE));
|
|
||||||
assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE));
|
assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE));
|
||||||
assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE));
|
assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE));
|
||||||
assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET));
|
assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET));
|
||||||
@ -298,10 +296,6 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest {
|
|||||||
boolean r = vh.weakCompareAndSet(recv, $value1$, $value2$);
|
boolean r = vh.weakCompareAndSet(recv, $value1$, $value2$);
|
||||||
});
|
});
|
||||||
|
|
||||||
checkUOE(() -> {
|
|
||||||
boolean r = vh.weakCompareAndSetVolatile(recv, $value1$, $value2$);
|
|
||||||
});
|
|
||||||
|
|
||||||
checkUOE(() -> {
|
checkUOE(() -> {
|
||||||
boolean r = vh.weakCompareAndSetAcquire(recv, $value1$, $value2$);
|
boolean r = vh.weakCompareAndSetAcquire(recv, $value1$, $value2$);
|
||||||
});
|
});
|
||||||
@ -388,10 +382,6 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest {
|
|||||||
boolean r = vh.weakCompareAndSet($value1$, $value2$);
|
boolean r = vh.weakCompareAndSet($value1$, $value2$);
|
||||||
});
|
});
|
||||||
|
|
||||||
checkUOE(() -> {
|
|
||||||
boolean r = vh.weakCompareAndSetVolatile($value1$, $value2$);
|
|
||||||
});
|
|
||||||
|
|
||||||
checkUOE(() -> {
|
checkUOE(() -> {
|
||||||
boolean r = vh.weakCompareAndSetAcquire($value1$, $value2$);
|
boolean r = vh.weakCompareAndSetAcquire($value1$, $value2$);
|
||||||
});
|
});
|
||||||
@ -504,39 +494,41 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSet(recv, $value1$, $value2$);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet $type$");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSet(recv, $value1$, $value2$);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet $type$");
|
||||||
$type$ x = ($type$) vh.get(recv);
|
$type$ x = ($type$) vh.get(recv);
|
||||||
assertEquals(x, $value2$, "weakCompareAndSet $type$ value");
|
assertEquals(x, $value2$, "weakCompareAndSet $type$ value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetAcquire(recv, $value2$, $value1$);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire $type$");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetAcquire(recv, $value2$, $value1$);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire $type$");
|
||||||
$type$ x = ($type$) vh.get(recv);
|
$type$ x = ($type$) vh.get(recv);
|
||||||
assertEquals(x, $value1$, "weakCompareAndSetAcquire $type$");
|
assertEquals(x, $value1$, "weakCompareAndSetAcquire $type$");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetRelease(recv, $value1$, $value2$);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease $type$");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetRelease(recv, $value1$, $value2$);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease $type$");
|
||||||
$type$ x = ($type$) vh.get(recv);
|
$type$ x = ($type$) vh.get(recv);
|
||||||
assertEquals(x, $value2$, "weakCompareAndSetRelease $type$");
|
assertEquals(x, $value2$, "weakCompareAndSetRelease $type$");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
boolean r = vh.weakCompareAndSetVolatile(recv, $value2$, $value1$);
|
|
||||||
assertEquals(r, true, "weakCompareAndSetVolatile $type$");
|
|
||||||
$type$ x = ($type$) vh.get(recv);
|
|
||||||
assertEquals(x, $value1$, "weakCompareAndSetVolatile $type$ value");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare set and get
|
// Compare set and get
|
||||||
{
|
{
|
||||||
$type$ o = ($type$) vh.getAndSet(recv, $value2$);
|
$type$ o = ($type$) vh.getAndSet(recv, $value1$);
|
||||||
assertEquals(o, $value1$, "getAndSet $type$");
|
assertEquals(o, $value2$, "getAndSet $type$");
|
||||||
$type$ x = ($type$) vh.get(recv);
|
$type$ x = ($type$) vh.get(recv);
|
||||||
assertEquals(x, $value2$, "getAndSet $type$ value");
|
assertEquals(x, $value1$, "getAndSet $type$ value");
|
||||||
}
|
}
|
||||||
#end[CAS]
|
#end[CAS]
|
||||||
|
|
||||||
@ -575,10 +567,6 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest {
|
|||||||
boolean r = vh.weakCompareAndSet(recv, $value1$, $value2$);
|
boolean r = vh.weakCompareAndSet(recv, $value1$, $value2$);
|
||||||
});
|
});
|
||||||
|
|
||||||
checkUOE(() -> {
|
|
||||||
boolean r = vh.weakCompareAndSetVolatile(recv, $value1$, $value2$);
|
|
||||||
});
|
|
||||||
|
|
||||||
checkUOE(() -> {
|
checkUOE(() -> {
|
||||||
boolean r = vh.weakCompareAndSetAcquire(recv, $value1$, $value2$);
|
boolean r = vh.weakCompareAndSetAcquire(recv, $value1$, $value2$);
|
||||||
});
|
});
|
||||||
@ -691,39 +679,41 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) vh.weakCompareAndSet($value1$, $value2$);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet $type$");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSet($value1$, $value2$);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet $type$");
|
||||||
$type$ x = ($type$) vh.get();
|
$type$ x = ($type$) vh.get();
|
||||||
assertEquals(x, $value2$, "weakCompareAndSet $type$ value");
|
assertEquals(x, $value2$, "weakCompareAndSet $type$ value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) vh.weakCompareAndSetAcquire($value2$, $value1$);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire $type$");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetAcquire($value2$, $value1$);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire $type$");
|
||||||
$type$ x = ($type$) vh.get();
|
$type$ x = ($type$) vh.get();
|
||||||
assertEquals(x, $value1$, "weakCompareAndSetAcquire $type$");
|
assertEquals(x, $value1$, "weakCompareAndSetAcquire $type$");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) vh.weakCompareAndSetRelease($value1$, $value2$);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease $type$");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetRelease($value1$, $value2$);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease $type$");
|
||||||
$type$ x = ($type$) vh.get();
|
$type$ x = ($type$) vh.get();
|
||||||
assertEquals(x, $value2$, "weakCompareAndSetRelease $type$");
|
assertEquals(x, $value2$, "weakCompareAndSetRelease $type$");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
boolean r = (boolean) vh.weakCompareAndSetVolatile($value2$, $value1$);
|
|
||||||
assertEquals(r, true, "weakCompareAndSetVolatile $type$");
|
|
||||||
$type$ x = ($type$) vh.get();
|
|
||||||
assertEquals(x, $value1$, "weakCompareAndSetVolatile $type$ value");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare set and get
|
// Compare set and get
|
||||||
{
|
{
|
||||||
$type$ o = ($type$) vh.getAndSet( $value2$);
|
$type$ o = ($type$) vh.getAndSet( $value1$);
|
||||||
assertEquals(o, $value1$, "getAndSet $type$");
|
assertEquals(o, $value2$, "getAndSet $type$");
|
||||||
$type$ x = ($type$) vh.get();
|
$type$ x = ($type$) vh.get();
|
||||||
assertEquals(x, $value2$, "getAndSet $type$ value");
|
assertEquals(x, $value1$, "getAndSet $type$ value");
|
||||||
}
|
}
|
||||||
#end[CAS]
|
#end[CAS]
|
||||||
|
|
||||||
@ -762,10 +752,6 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest {
|
|||||||
boolean r = vh.weakCompareAndSet($value1$, $value2$);
|
boolean r = vh.weakCompareAndSet($value1$, $value2$);
|
||||||
});
|
});
|
||||||
|
|
||||||
checkUOE(() -> {
|
|
||||||
boolean r = vh.weakCompareAndSetVolatile($value1$, $value2$);
|
|
||||||
});
|
|
||||||
|
|
||||||
checkUOE(() -> {
|
checkUOE(() -> {
|
||||||
boolean r = vh.weakCompareAndSetAcquire($value1$, $value2$);
|
boolean r = vh.weakCompareAndSetAcquire($value1$, $value2$);
|
||||||
});
|
});
|
||||||
@ -881,39 +867,41 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSet(array, i, $value1$, $value2$);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet $type$");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSet(array, i, $value1$, $value2$);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet $type$");
|
||||||
$type$ x = ($type$) vh.get(array, i);
|
$type$ x = ($type$) vh.get(array, i);
|
||||||
assertEquals(x, $value2$, "weakCompareAndSet $type$ value");
|
assertEquals(x, $value2$, "weakCompareAndSet $type$ value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetAcquire(array, i, $value2$, $value1$);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire $type$");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetAcquire(array, i, $value2$, $value1$);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire $type$");
|
||||||
$type$ x = ($type$) vh.get(array, i);
|
$type$ x = ($type$) vh.get(array, i);
|
||||||
assertEquals(x, $value1$, "weakCompareAndSetAcquire $type$");
|
assertEquals(x, $value1$, "weakCompareAndSetAcquire $type$");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetRelease(array, i, $value1$, $value2$);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease $type$");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetRelease(array, i, $value1$, $value2$);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease $type$");
|
||||||
$type$ x = ($type$) vh.get(array, i);
|
$type$ x = ($type$) vh.get(array, i);
|
||||||
assertEquals(x, $value2$, "weakCompareAndSetRelease $type$");
|
assertEquals(x, $value2$, "weakCompareAndSetRelease $type$");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
boolean r = vh.weakCompareAndSetVolatile(array, i, $value2$, $value1$);
|
|
||||||
assertEquals(r, true, "weakCompareAndSetVolatile $type$");
|
|
||||||
$type$ x = ($type$) vh.get(array, i);
|
|
||||||
assertEquals(x, $value1$, "weakCompareAndSetVolatile $type$ value");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare set and get
|
// Compare set and get
|
||||||
{
|
{
|
||||||
$type$ o = ($type$) vh.getAndSet(array, i, $value2$);
|
$type$ o = ($type$) vh.getAndSet(array, i, $value1$);
|
||||||
assertEquals(o, $value1$, "getAndSet $type$");
|
assertEquals(o, $value2$, "getAndSet $type$");
|
||||||
$type$ x = ($type$) vh.get(array, i);
|
$type$ x = ($type$) vh.get(array, i);
|
||||||
assertEquals(x, $value2$, "getAndSet $type$ value");
|
assertEquals(x, $value1$, "getAndSet $type$ value");
|
||||||
}
|
}
|
||||||
#end[CAS]
|
#end[CAS]
|
||||||
|
|
||||||
@ -956,10 +944,6 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest {
|
|||||||
boolean r = vh.weakCompareAndSet(array, i, $value1$, $value2$);
|
boolean r = vh.weakCompareAndSet(array, i, $value1$, $value2$);
|
||||||
});
|
});
|
||||||
|
|
||||||
checkUOE(() -> {
|
|
||||||
boolean r = vh.weakCompareAndSetVolatile(array, i, $value1$, $value2$);
|
|
||||||
});
|
|
||||||
|
|
||||||
checkUOE(() -> {
|
checkUOE(() -> {
|
||||||
boolean r = vh.weakCompareAndSetAcquire(array, i, $value1$, $value2$);
|
boolean r = vh.weakCompareAndSetAcquire(array, i, $value1$, $value2$);
|
||||||
});
|
});
|
||||||
@ -1039,10 +1023,6 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest {
|
|||||||
boolean r = vh.weakCompareAndSet(array, ci, $value1$, $value2$);
|
boolean r = vh.weakCompareAndSet(array, ci, $value1$, $value2$);
|
||||||
});
|
});
|
||||||
|
|
||||||
checkIOOBE(() -> {
|
|
||||||
boolean r = vh.weakCompareAndSetVolatile(array, ci, $value1$, $value2$);
|
|
||||||
});
|
|
||||||
|
|
||||||
checkIOOBE(() -> {
|
checkIOOBE(() -> {
|
||||||
boolean r = vh.weakCompareAndSetAcquire(array, ci, $value1$, $value2$);
|
boolean r = vh.weakCompareAndSetAcquire(array, ci, $value1$, $value2$);
|
||||||
});
|
});
|
||||||
|
@ -884,22 +884,31 @@ public class VarHandleTestByteArrayAs$Type$ extends VarHandleBaseByteArrayTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet $type$");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet $type$");
|
||||||
$type$ x = ($type$) vh.get(array, i);
|
$type$ x = ($type$) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_2, "weakCompareAndSet $type$ value");
|
assertEquals(x, VALUE_2, "weakCompareAndSet $type$ value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire $type$");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire $type$");
|
||||||
$type$ x = ($type$) vh.get(array, i);
|
$type$ x = ($type$) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_1, "weakCompareAndSetAcquire $type$");
|
assertEquals(x, VALUE_1, "weakCompareAndSetAcquire $type$");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease $type$");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease $type$");
|
||||||
$type$ x = ($type$) vh.get(array, i);
|
$type$ x = ($type$) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_2, "weakCompareAndSetRelease $type$");
|
assertEquals(x, VALUE_2, "weakCompareAndSetRelease $type$");
|
||||||
}
|
}
|
||||||
@ -1037,22 +1046,31 @@ public class VarHandleTestByteArrayAs$Type$ extends VarHandleBaseByteArrayTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet $type$");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSet(array, i, VALUE_1, VALUE_2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet $type$");
|
||||||
$type$ x = ($type$) vh.get(array, i);
|
$type$ x = ($type$) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_2, "weakCompareAndSet $type$ value");
|
assertEquals(x, VALUE_2, "weakCompareAndSet $type$ value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire $type$");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetAcquire(array, i, VALUE_2, VALUE_1);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire $type$");
|
||||||
$type$ x = ($type$) vh.get(array, i);
|
$type$ x = ($type$) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_1, "weakCompareAndSetAcquire $type$");
|
assertEquals(x, VALUE_1, "weakCompareAndSetAcquire $type$");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease $type$");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = vh.weakCompareAndSetRelease(array, i, VALUE_1, VALUE_2);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease $type$");
|
||||||
$type$ x = ($type$) vh.get(array, i);
|
$type$ x = ($type$) vh.get(array, i);
|
||||||
assertEquals(x, VALUE_2, "weakCompareAndSetRelease $type$");
|
assertEquals(x, VALUE_2, "weakCompareAndSetRelease $type$");
|
||||||
}
|
}
|
||||||
|
@ -209,39 +209,41 @@ public class VarHandleTestMethodHandleAccess$Type$ extends VarHandleBaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(recv, $value1$, $value2$);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet $type$");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(recv, $value1$, $value2$);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet $type$");
|
||||||
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
|
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
|
||||||
assertEquals(x, $value2$, "weakCompareAndSet $type$ value");
|
assertEquals(x, $value2$, "weakCompareAndSet $type$ value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, $value2$, $value1$);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire $type$");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, $value2$, $value1$);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire $type$");
|
||||||
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
|
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
|
||||||
assertEquals(x, $value1$, "weakCompareAndSetAcquire $type$");
|
assertEquals(x, $value1$, "weakCompareAndSetAcquire $type$");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, $value1$, $value2$);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease $type$");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, $value1$, $value2$);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease $type$");
|
||||||
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
|
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
|
||||||
assertEquals(x, $value2$, "weakCompareAndSetRelease $type$");
|
assertEquals(x, $value2$, "weakCompareAndSetRelease $type$");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(recv, $value2$, $value1$);
|
|
||||||
assertEquals(r, true, "weakCompareAndSetVolatile $type$");
|
|
||||||
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
|
|
||||||
assertEquals(x, $value1$, "weakCompareAndSetVolatile $type$ value");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare set and get
|
// Compare set and get
|
||||||
{
|
{
|
||||||
$type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, $value2$);
|
$type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, $value1$);
|
||||||
assertEquals(o, $value1$, "getAndSet $type$");
|
assertEquals(o, $value2$, "getAndSet $type$");
|
||||||
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
|
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
|
||||||
assertEquals(x, $value2$, "getAndSet $type$ value");
|
assertEquals(x, $value1$, "getAndSet $type$ value");
|
||||||
}
|
}
|
||||||
#end[CAS]
|
#end[CAS]
|
||||||
|
|
||||||
@ -380,39 +382,41 @@ public class VarHandleTestMethodHandleAccess$Type$ extends VarHandleBaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact($value1$, $value2$);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet $type$");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact($value1$, $value2$);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet $type$");
|
||||||
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
|
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
|
||||||
assertEquals(x, $value2$, "weakCompareAndSet $type$ value");
|
assertEquals(x, $value2$, "weakCompareAndSet $type$ value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact($value2$, $value1$);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire $type$");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact($value2$, $value1$);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire $type$");
|
||||||
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
|
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
|
||||||
assertEquals(x, $value1$, "weakCompareAndSetAcquire $type$");
|
assertEquals(x, $value1$, "weakCompareAndSetAcquire $type$");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact($value1$, $value2$);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease $type$");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact($value1$, $value2$);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease $type$");
|
||||||
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
|
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
|
||||||
assertEquals(x, $value2$, "weakCompareAndSetRelease $type$");
|
assertEquals(x, $value2$, "weakCompareAndSetRelease $type$");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact($value2$, $value1$);
|
|
||||||
assertEquals(r, true, "weakCompareAndSetVolatile $type$");
|
|
||||||
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
|
|
||||||
assertEquals(x, $value1$, "weakCompareAndSetVolatile $type$ value");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare set and get
|
// Compare set and get
|
||||||
{
|
{
|
||||||
$type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET).invokeExact($value2$);
|
$type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET).invokeExact( $value1$);
|
||||||
assertEquals(o, $value1$, "getAndSet $type$");
|
assertEquals(o, $value2$, "getAndSet $type$");
|
||||||
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
|
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
|
||||||
assertEquals(x, $value2$, "getAndSet $type$ value");
|
assertEquals(x, $value1$, "getAndSet $type$ value");
|
||||||
}
|
}
|
||||||
#end[CAS]
|
#end[CAS]
|
||||||
|
|
||||||
@ -554,39 +558,41 @@ public class VarHandleTestMethodHandleAccess$Type$ extends VarHandleBaseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, $value1$, $value2$);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSet $type$");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, $value1$, $value2$);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSet $type$");
|
||||||
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
||||||
assertEquals(x, $value2$, "weakCompareAndSet $type$ value");
|
assertEquals(x, $value2$, "weakCompareAndSet $type$ value");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, $value2$, $value1$);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetAcquire $type$");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, $value2$, $value1$);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetAcquire $type$");
|
||||||
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
||||||
assertEquals(x, $value1$, "weakCompareAndSetAcquire $type$");
|
assertEquals(x, $value1$, "weakCompareAndSetAcquire $type$");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(array, i, $value1$, $value2$);
|
boolean success = false;
|
||||||
assertEquals(r, true, "weakCompareAndSetRelease $type$");
|
for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
|
||||||
|
success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(array, i, $value1$, $value2$);
|
||||||
|
}
|
||||||
|
assertEquals(success, true, "weakCompareAndSetRelease $type$");
|
||||||
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
||||||
assertEquals(x, $value2$, "weakCompareAndSetRelease $type$");
|
assertEquals(x, $value2$, "weakCompareAndSetRelease $type$");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(array, i, $value2$, $value1$);
|
|
||||||
assertEquals(r, true, "weakCompareAndSetVolatile $type$");
|
|
||||||
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
|
||||||
assertEquals(x, $value1$, "weakCompareAndSetVolatile $type$ value");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare set and get
|
// Compare set and get
|
||||||
{
|
{
|
||||||
$type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, $value2$);
|
$type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, $value1$);
|
||||||
assertEquals(o, $value1$, "getAndSet $type$");
|
assertEquals(o, $value2$, "getAndSet $type$");
|
||||||
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
$type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
|
||||||
assertEquals(x, $value2$, "getAndSet $type$ value");
|
assertEquals(x, $value1$, "getAndSet $type$ value");
|
||||||
}
|
}
|
||||||
#end[CAS]
|
#end[CAS]
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2015, 2016 Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -23,11 +23,13 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @test
|
* @test
|
||||||
* @summary IndexOutOfBoundsException check index tests
|
* @summary Objects.checkIndex/jdk.internal.util.Preconditions.checkIndex tests
|
||||||
* @run testng CheckIndex
|
* @run testng CheckIndex
|
||||||
* @bug 8135248 8142493
|
* @bug 8135248 8142493 8155794
|
||||||
|
* @modules java.base/jdk.internal.util
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import jdk.internal.util.Preconditions;
|
||||||
import org.testng.annotations.DataProvider;
|
import org.testng.annotations.DataProvider;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
@ -95,7 +97,7 @@ public class CheckIndex {
|
|||||||
public void testCheckIndex(int index, int length, boolean withinBounds) {
|
public void testCheckIndex(int index, int length, boolean withinBounds) {
|
||||||
String expectedMessage = withinBounds
|
String expectedMessage = withinBounds
|
||||||
? null
|
? null
|
||||||
: Objects.outOfBoundsExceptionFormatter(IndexOutOfBoundsException::new).
|
: Preconditions.outOfBoundsExceptionFormatter(IndexOutOfBoundsException::new).
|
||||||
apply("checkIndex", List.of(index, length)).getMessage();
|
apply("checkIndex", List.of(index, length)).getMessage();
|
||||||
|
|
||||||
BiConsumer<Class<? extends RuntimeException>, IntSupplier> checker = (ec, s) -> {
|
BiConsumer<Class<? extends RuntimeException>, IntSupplier> checker = (ec, s) -> {
|
||||||
@ -117,21 +119,21 @@ public class CheckIndex {
|
|||||||
};
|
};
|
||||||
|
|
||||||
checker.accept(AssertingOutOfBoundsException.class,
|
checker.accept(AssertingOutOfBoundsException.class,
|
||||||
() -> Objects.checkIndex(index, length,
|
() -> Preconditions.checkIndex(index, length,
|
||||||
assertingOutOfBounds(expectedMessage, "checkIndex", index, length)));
|
assertingOutOfBounds(expectedMessage, "checkIndex", index, length)));
|
||||||
checker.accept(IndexOutOfBoundsException.class,
|
checker.accept(IndexOutOfBoundsException.class,
|
||||||
() -> Objects.checkIndex(index, length,
|
() -> Preconditions.checkIndex(index, length,
|
||||||
assertingOutOfBoundsReturnNull("checkIndex", index, length)));
|
assertingOutOfBoundsReturnNull("checkIndex", index, length)));
|
||||||
checker.accept(IndexOutOfBoundsException.class,
|
checker.accept(IndexOutOfBoundsException.class,
|
||||||
() -> Objects.checkIndex(index, length, null));
|
() -> Preconditions.checkIndex(index, length, null));
|
||||||
checker.accept(IndexOutOfBoundsException.class,
|
checker.accept(IndexOutOfBoundsException.class,
|
||||||
() -> Objects.checkIndex(index, length));
|
() -> Objects.checkIndex(index, length));
|
||||||
checker.accept(ArrayIndexOutOfBoundsException.class,
|
checker.accept(ArrayIndexOutOfBoundsException.class,
|
||||||
() -> Objects.checkIndex(index, length,
|
() -> Preconditions.checkIndex(index, length,
|
||||||
Objects.outOfBoundsExceptionFormatter(ArrayIndexOutOfBoundsException::new)));
|
Preconditions.outOfBoundsExceptionFormatter(ArrayIndexOutOfBoundsException::new)));
|
||||||
checker.accept(StringIndexOutOfBoundsException.class,
|
checker.accept(StringIndexOutOfBoundsException.class,
|
||||||
() -> Objects.checkIndex(index, length,
|
() -> Preconditions.checkIndex(index, length,
|
||||||
Objects.outOfBoundsExceptionFormatter(StringIndexOutOfBoundsException::new)));
|
Preconditions.outOfBoundsExceptionFormatter(StringIndexOutOfBoundsException::new)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -157,7 +159,7 @@ public class CheckIndex {
|
|||||||
public void testCheckFromToIndex(int fromIndex, int toIndex, int length, boolean withinBounds) {
|
public void testCheckFromToIndex(int fromIndex, int toIndex, int length, boolean withinBounds) {
|
||||||
String expectedMessage = withinBounds
|
String expectedMessage = withinBounds
|
||||||
? null
|
? null
|
||||||
: Objects.outOfBoundsExceptionFormatter(IndexOutOfBoundsException::new).
|
: Preconditions.outOfBoundsExceptionFormatter(IndexOutOfBoundsException::new).
|
||||||
apply("checkFromToIndex", List.of(fromIndex, toIndex, length)).getMessage();
|
apply("checkFromToIndex", List.of(fromIndex, toIndex, length)).getMessage();
|
||||||
|
|
||||||
BiConsumer<Class<? extends RuntimeException>, IntSupplier> check = (ec, s) -> {
|
BiConsumer<Class<? extends RuntimeException>, IntSupplier> check = (ec, s) -> {
|
||||||
@ -179,21 +181,21 @@ public class CheckIndex {
|
|||||||
};
|
};
|
||||||
|
|
||||||
check.accept(AssertingOutOfBoundsException.class,
|
check.accept(AssertingOutOfBoundsException.class,
|
||||||
() -> Objects.checkFromToIndex(fromIndex, toIndex, length,
|
() -> Preconditions.checkFromToIndex(fromIndex, toIndex, length,
|
||||||
assertingOutOfBounds(expectedMessage, "checkFromToIndex", fromIndex, toIndex, length)));
|
assertingOutOfBounds(expectedMessage, "checkFromToIndex", fromIndex, toIndex, length)));
|
||||||
check.accept(IndexOutOfBoundsException.class,
|
check.accept(IndexOutOfBoundsException.class,
|
||||||
() -> Objects.checkFromToIndex(fromIndex, toIndex, length,
|
() -> Preconditions.checkFromToIndex(fromIndex, toIndex, length,
|
||||||
assertingOutOfBoundsReturnNull("checkFromToIndex", fromIndex, toIndex, length)));
|
assertingOutOfBoundsReturnNull("checkFromToIndex", fromIndex, toIndex, length)));
|
||||||
check.accept(IndexOutOfBoundsException.class,
|
check.accept(IndexOutOfBoundsException.class,
|
||||||
() -> Objects.checkFromToIndex(fromIndex, toIndex, length, null));
|
() -> Preconditions.checkFromToIndex(fromIndex, toIndex, length, null));
|
||||||
check.accept(IndexOutOfBoundsException.class,
|
check.accept(IndexOutOfBoundsException.class,
|
||||||
() -> Objects.checkFromToIndex(fromIndex, toIndex, length));
|
() -> Objects.checkFromToIndex(fromIndex, toIndex, length));
|
||||||
check.accept(ArrayIndexOutOfBoundsException.class,
|
check.accept(ArrayIndexOutOfBoundsException.class,
|
||||||
() -> Objects.checkFromToIndex(fromIndex, toIndex, length,
|
() -> Preconditions.checkFromToIndex(fromIndex, toIndex, length,
|
||||||
Objects.outOfBoundsExceptionFormatter(ArrayIndexOutOfBoundsException::new)));
|
Preconditions.outOfBoundsExceptionFormatter(ArrayIndexOutOfBoundsException::new)));
|
||||||
check.accept(StringIndexOutOfBoundsException.class,
|
check.accept(StringIndexOutOfBoundsException.class,
|
||||||
() -> Objects.checkFromToIndex(fromIndex, toIndex, length,
|
() -> Preconditions.checkFromToIndex(fromIndex, toIndex, length,
|
||||||
Objects.outOfBoundsExceptionFormatter(StringIndexOutOfBoundsException::new)));
|
Preconditions.outOfBoundsExceptionFormatter(StringIndexOutOfBoundsException::new)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -226,7 +228,7 @@ public class CheckIndex {
|
|||||||
public void testCheckFromIndexSize(int fromIndex, int size, int length, boolean withinBounds) {
|
public void testCheckFromIndexSize(int fromIndex, int size, int length, boolean withinBounds) {
|
||||||
String expectedMessage = withinBounds
|
String expectedMessage = withinBounds
|
||||||
? null
|
? null
|
||||||
: Objects.outOfBoundsExceptionFormatter(IndexOutOfBoundsException::new).
|
: Preconditions.outOfBoundsExceptionFormatter(IndexOutOfBoundsException::new).
|
||||||
apply("checkFromIndexSize", List.of(fromIndex, size, length)).getMessage();
|
apply("checkFromIndexSize", List.of(fromIndex, size, length)).getMessage();
|
||||||
|
|
||||||
BiConsumer<Class<? extends RuntimeException>, IntSupplier> check = (ec, s) -> {
|
BiConsumer<Class<? extends RuntimeException>, IntSupplier> check = (ec, s) -> {
|
||||||
@ -248,27 +250,27 @@ public class CheckIndex {
|
|||||||
};
|
};
|
||||||
|
|
||||||
check.accept(AssertingOutOfBoundsException.class,
|
check.accept(AssertingOutOfBoundsException.class,
|
||||||
() -> Objects.checkFromIndexSize(fromIndex, size, length,
|
() -> Preconditions.checkFromIndexSize(fromIndex, size, length,
|
||||||
assertingOutOfBounds(expectedMessage, "checkFromIndexSize", fromIndex, size, length)));
|
assertingOutOfBounds(expectedMessage, "checkFromIndexSize", fromIndex, size, length)));
|
||||||
check.accept(IndexOutOfBoundsException.class,
|
check.accept(IndexOutOfBoundsException.class,
|
||||||
() -> Objects.checkFromIndexSize(fromIndex, size, length,
|
() -> Preconditions.checkFromIndexSize(fromIndex, size, length,
|
||||||
assertingOutOfBoundsReturnNull("checkFromIndexSize", fromIndex, size, length)));
|
assertingOutOfBoundsReturnNull("checkFromIndexSize", fromIndex, size, length)));
|
||||||
check.accept(IndexOutOfBoundsException.class,
|
check.accept(IndexOutOfBoundsException.class,
|
||||||
() -> Objects.checkFromIndexSize(fromIndex, size, length, null));
|
() -> Preconditions.checkFromIndexSize(fromIndex, size, length, null));
|
||||||
check.accept(IndexOutOfBoundsException.class,
|
check.accept(IndexOutOfBoundsException.class,
|
||||||
() -> Objects.checkFromIndexSize(fromIndex, size, length));
|
() -> Objects.checkFromIndexSize(fromIndex, size, length));
|
||||||
check.accept(ArrayIndexOutOfBoundsException.class,
|
check.accept(ArrayIndexOutOfBoundsException.class,
|
||||||
() -> Objects.checkFromIndexSize(fromIndex, size, length,
|
() -> Preconditions.checkFromIndexSize(fromIndex, size, length,
|
||||||
Objects.outOfBoundsExceptionFormatter(ArrayIndexOutOfBoundsException::new)));
|
Preconditions.outOfBoundsExceptionFormatter(ArrayIndexOutOfBoundsException::new)));
|
||||||
check.accept(StringIndexOutOfBoundsException.class,
|
check.accept(StringIndexOutOfBoundsException.class,
|
||||||
() -> Objects.checkFromIndexSize(fromIndex, size, length,
|
() -> Preconditions.checkFromIndexSize(fromIndex, size, length,
|
||||||
Objects.outOfBoundsExceptionFormatter(StringIndexOutOfBoundsException::new)));
|
Preconditions.outOfBoundsExceptionFormatter(StringIndexOutOfBoundsException::new)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void uniqueMessagesForCheckKinds() {
|
public void uniqueMessagesForCheckKinds() {
|
||||||
BiFunction<String, List<Integer>, IndexOutOfBoundsException> f =
|
BiFunction<String, List<Integer>, IndexOutOfBoundsException> f =
|
||||||
Objects.outOfBoundsExceptionFormatter(IndexOutOfBoundsException::new);
|
Preconditions.outOfBoundsExceptionFormatter(IndexOutOfBoundsException::new);
|
||||||
|
|
||||||
List<String> messages = new ArrayList<>();
|
List<String> messages = new ArrayList<>();
|
||||||
// Exact arguments
|
// Exact arguments
|
||||||
|
@ -31,7 +31,6 @@
|
|||||||
*
|
*
|
||||||
* @modules java.base/sun.util.logging
|
* @modules java.base/sun.util.logging
|
||||||
* java.logging/sun.util.logging.internal
|
* java.logging/sun.util.logging.internal
|
||||||
* @compile -XDignore.symbol.file PlatformLoggerTest.java
|
|
||||||
* @run main/othervm PlatformLoggerTest
|
* @run main/othervm PlatformLoggerTest
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -42,25 +41,31 @@ import sun.util.logging.PlatformLogger;
|
|||||||
import static sun.util.logging.PlatformLogger.Level.*;
|
import static sun.util.logging.PlatformLogger.Level.*;
|
||||||
|
|
||||||
public class PlatformLoggerTest {
|
public class PlatformLoggerTest {
|
||||||
|
|
||||||
|
static Logger logger;
|
||||||
|
static PlatformLogger bar;
|
||||||
|
static PlatformLogger goo;
|
||||||
|
static PlatformLogger foo;
|
||||||
|
|
||||||
public static void main(String[] args) throws Exception {
|
public static void main(String[] args) throws Exception {
|
||||||
final String FOO_PLATFORM_LOGGER = "test.platformlogger.foo";
|
final String FOO_PLATFORM_LOGGER = "test.platformlogger.foo";
|
||||||
final String BAR_PLATFORM_LOGGER = "test.platformlogger.bar";
|
final String BAR_PLATFORM_LOGGER = "test.platformlogger.bar";
|
||||||
final String GOO_PLATFORM_LOGGER = "test.platformlogger.goo";
|
final String GOO_PLATFORM_LOGGER = "test.platformlogger.goo";
|
||||||
final String BAR_LOGGER = "test.logger.bar";
|
final String BAR_LOGGER = "test.logger.bar";
|
||||||
PlatformLogger goo = PlatformLogger.getLogger(GOO_PLATFORM_LOGGER);
|
goo = PlatformLogger.getLogger(GOO_PLATFORM_LOGGER);
|
||||||
// test the PlatformLogger methods
|
// test the PlatformLogger methods
|
||||||
testLogMethods(goo);
|
testLogMethods(goo);
|
||||||
|
|
||||||
// Create a platform logger using the default
|
// Create a platform logger using the default
|
||||||
PlatformLogger foo = PlatformLogger.getLogger(FOO_PLATFORM_LOGGER);
|
foo = PlatformLogger.getLogger(FOO_PLATFORM_LOGGER);
|
||||||
checkPlatformLogger(foo, FOO_PLATFORM_LOGGER);
|
checkPlatformLogger(foo, FOO_PLATFORM_LOGGER);
|
||||||
|
|
||||||
// create a java.util.logging.Logger
|
// create a java.util.logging.Logger
|
||||||
// now java.util.logging.Logger should be created for each platform logger
|
// now java.util.logging.Logger should be created for each platform logger
|
||||||
Logger logger = Logger.getLogger(BAR_LOGGER);
|
logger = Logger.getLogger(BAR_LOGGER);
|
||||||
logger.setLevel(Level.WARNING);
|
logger.setLevel(Level.WARNING);
|
||||||
|
|
||||||
PlatformLogger bar = PlatformLogger.getLogger(BAR_PLATFORM_LOGGER);
|
bar = PlatformLogger.getLogger(BAR_PLATFORM_LOGGER);
|
||||||
checkPlatformLogger(bar, BAR_PLATFORM_LOGGER);
|
checkPlatformLogger(bar, BAR_PLATFORM_LOGGER);
|
||||||
|
|
||||||
// test the PlatformLogger methods
|
// test the PlatformLogger methods
|
||||||
|
Loading…
x
Reference in New Issue
Block a user