src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/VirtualArrayNode.java
changeset 48861 47f19ff9903c
parent 47798 9fe9292f5931
child 50330 2cbc42a5764b
--- 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