src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/VirtualArrayNode.java
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/VirtualArrayNode.java Fri Feb 02 10:37:48 2018 -0500
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/VirtualArrayNode.java Fri Feb 02 17:28:17 2018 -0800
@@ -24,6 +24,7 @@
import java.nio.ByteOrder;
+import org.graalvm.compiler.core.common.spi.ArrayOffsetProvider;
import org.graalvm.compiler.graph.NodeClass;
import org.graalvm.compiler.nodeinfo.NodeInfo;
import org.graalvm.compiler.nodeinfo.Verbosity;
@@ -35,7 +36,6 @@
import jdk.vm.ci.meta.JavaKind;
import jdk.vm.ci.meta.ResolvedJavaType;
-import sun.misc.Unsafe;
@NodeInfo(nameTemplate = "VirtualArray({p#objectId}) {p#componentType/s}[{p#length}]")
public class VirtualArrayNode extends VirtualObjectNode implements ArrayLengthProvider {
@@ -88,53 +88,14 @@
}
@Override
- public int entryIndexForOffset(long constantOffset, JavaKind expectedEntryKind) {
- return entryIndexForOffset(constantOffset, expectedEntryKind, componentType, length);
+ public int entryIndexForOffset(ArrayOffsetProvider arrayOffsetProvider, long constantOffset, JavaKind expectedEntryKind) {
+ return entryIndexForOffset(arrayOffsetProvider, constantOffset, expectedEntryKind, componentType, length);
}
- public static int entryIndexForOffset(long constantOffset, JavaKind expectedEntryKind, ResolvedJavaType componentType, int length) {
- int baseOffset;
- int indexScale;
- switch (componentType.getJavaKind()) {
- case Boolean:
- baseOffset = Unsafe.ARRAY_BOOLEAN_BASE_OFFSET;
- indexScale = Unsafe.ARRAY_BOOLEAN_INDEX_SCALE;
- break;
- case Byte:
- baseOffset = Unsafe.ARRAY_BYTE_BASE_OFFSET;
- indexScale = Unsafe.ARRAY_BYTE_INDEX_SCALE;
- break;
- case Short:
- baseOffset = Unsafe.ARRAY_SHORT_BASE_OFFSET;
- indexScale = Unsafe.ARRAY_SHORT_INDEX_SCALE;
- break;
- case Char:
- baseOffset = Unsafe.ARRAY_CHAR_BASE_OFFSET;
- indexScale = Unsafe.ARRAY_CHAR_INDEX_SCALE;
- break;
- case Int:
- baseOffset = Unsafe.ARRAY_INT_BASE_OFFSET;
- indexScale = Unsafe.ARRAY_INT_INDEX_SCALE;
- break;
- case Long:
- baseOffset = Unsafe.ARRAY_LONG_BASE_OFFSET;
- indexScale = Unsafe.ARRAY_LONG_INDEX_SCALE;
- break;
- case Float:
- baseOffset = Unsafe.ARRAY_FLOAT_BASE_OFFSET;
- indexScale = Unsafe.ARRAY_FLOAT_INDEX_SCALE;
- break;
- case Double:
- baseOffset = Unsafe.ARRAY_DOUBLE_BASE_OFFSET;
- indexScale = Unsafe.ARRAY_DOUBLE_INDEX_SCALE;
- break;
- case Object:
- baseOffset = Unsafe.ARRAY_OBJECT_BASE_OFFSET;
- indexScale = Unsafe.ARRAY_OBJECT_INDEX_SCALE;
- break;
- default:
- return -1;
- }
+ public static int entryIndexForOffset(ArrayOffsetProvider arrayOffsetProvider, long constantOffset, JavaKind expectedEntryKind, ResolvedJavaType componentType, int length) {
+ int baseOffset = arrayOffsetProvider.arrayBaseOffset(componentType.getJavaKind());
+ int indexScale = arrayOffsetProvider.arrayScalingFactor(componentType.getJavaKind());
+
long offset;
if (ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN && componentType.isPrimitive()) {
// On big endian, we expect the value to be correctly aligned in memory