package org.graalvm.compiler.truffle.test.jdk11;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import org.graalvm.compiler.truffle.test.PartialEvaluationTest;
import org.graalvm.compiler.truffle.test.nodes.AbstractTestNode;
import org.graalvm.compiler.truffle.test.nodes.RootTestNode;
import org.junit.Assert;
import org.junit.Test;
import com.oracle.truffle.api.RootCallTarget;
import com.oracle.truffle.api.Truffle;
import com.oracle.truffle.api.frame.FrameDescriptor;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.RootNode;
public class VarHandlePartialEvaluationTest extends PartialEvaluationTest {
static final VarHandle byteArrayHandle = MethodHandles.byteArrayViewVarHandle(int[].class, ByteOrder.nativeOrder());
static final VarHandle byteBufferHandle = MethodHandles.byteBufferViewVarHandle(int[].class, ByteOrder.nativeOrder());
@Test
public void byteArrayHandleGet() {
byte[] array = ByteBuffer.allocate(42).order(ByteOrder.nativeOrder()).putInt(0, 42).array();
testCommon(new VarHandleTestNode(true, false), "byteArrayHandleGetInt", array, 0);
}
@Test
public void byteArrayHandleSet() {
byte[] array = ByteBuffer.allocate(42).order(ByteOrder.nativeOrder()).putInt(0, 42).array();
testCommon(new VarHandleTestNode(true, true), "byteArrayHandleSetInt", array, 0, 42);
}
@Test
public void byteBufferHandleGet() {
ByteBuffer byteBuffer = ByteBuffer.allocate(42).order(ByteOrder.nativeOrder()).putInt(0, 42);
testCommon(new VarHandleTestNode(false, false), "byteBufferHandleGetInt", byteBuffer, 0);
}
@Test
public void byteBufferHandleSet() {
ByteBuffer byteBuffer = ByteBuffer.allocate(42).order(ByteOrder.nativeOrder()).putInt(0, 42);
testCommon(new VarHandleTestNode(false, true), "byteArrayHandleSetInt", byteBuffer, 0, 42);
}
private void testCommon(AbstractTestNode testNode, String testName, Object... args) {
FrameDescriptor fd = new FrameDescriptor();
RootNode rootNode = new RootTestNode(fd, testName, testNode);
RootCallTarget callTarget = Truffle.getRuntime().createCallTarget(rootNode);
Assert.assertEquals(42, callTarget.call(args));
assertPartialEvalNoInvokes(callTarget, args);
}
static final class VarHandleTestNode extends AbstractTestNode {
private final boolean isArray;
private final boolean set;
VarHandleTestNode(boolean isArray, boolean set) {
this.isArray = isArray;
this.set = set;
}
@Override
public int execute(VirtualFrame frame) {
Object buf = frame.getArguments()[0];
int idx = (int) frame.getArguments()[1];
if (set) {
int val = (int) frame.getArguments()[2];
if (isArray) {
byteArrayHandle.set((byte[]) buf, idx, val);
} else {
byteBufferHandle.set((ByteBuffer) buf, idx, val);
}
return val;
} else {
if (isArray) {
return (int) byteArrayHandle.get((byte[]) buf, idx);
} else {
return (int) byteBufferHandle.get((ByteBuffer) buf, idx);
}
}
}
}
}