8254354: Add a withInvokeExactBehavior() VarHandle combinator

Reviewed-by: psandoz, chegar
This commit is contained in:
Jorn Vernee 2020-11-10 23:26:02 +00:00
parent d6f1463cb3
commit 0a41ca6b75
12 changed files with 1660 additions and 459 deletions

View file

@ -68,8 +68,8 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase {
private static abstract class ByteArrayViewVarHandle extends VarHandle {
final boolean be;
ByteArrayViewVarHandle(VarForm form, boolean be) {
super(form);
ByteArrayViewVarHandle(VarForm form, boolean be, boolean exact) {
super(form, exact);
this.be = be;
}
}
@ -77,12 +77,30 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase {
static final class ArrayHandle extends ByteArrayViewVarHandle {
ArrayHandle(boolean be) {
super(ArrayHandle.FORM, be);
this(be, false);
}
private ArrayHandle(boolean be, boolean exact) {
super(ArrayHandle.FORM, be, exact);
}
@Override
final MethodType accessModeTypeUncached(AccessMode accessMode) {
return accessMode.at.accessModeType(byte[].class, $type$.class, int.class);
public ArrayHandle withInvokeExactBehavior() {
return hasInvokeExactBehavior()
? this
: new ArrayHandle(be, true);
}
@Override
public ArrayHandle withInvokeBehavior() {
return !hasInvokeExactBehavior()
? this
: new ArrayHandle(be, false);
}
@Override
final MethodType accessModeTypeUncached(AccessType at) {
return at.accessModeType(byte[].class, $type$.class, int.class);
}
@ForceInline
@ -555,12 +573,30 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase {
static final class ByteBufferHandle extends ByteArrayViewVarHandle {
ByteBufferHandle(boolean be) {
super(ByteBufferHandle.FORM, be);
this(be, false);
}
private ByteBufferHandle(boolean be, boolean exact) {
super(ByteBufferHandle.FORM, be, exact);
}
@Override
final MethodType accessModeTypeUncached(AccessMode accessMode) {
return accessMode.at.accessModeType(ByteBuffer.class, $type$.class, int.class);
public ByteBufferHandle withInvokeExactBehavior() {
return hasInvokeExactBehavior()
? this
: new ByteBufferHandle(be, true);
}
@Override
public ByteBufferHandle withInvokeBehavior() {
return !hasInvokeExactBehavior()
? this
: new ByteBufferHandle(be, false);
}
@Override
final MethodType accessModeTypeUncached(AccessType at) {
return at.accessModeType(ByteBuffer.class, $type$.class, int.class);
}
@ForceInline