20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 package org.graalvm.compiler.nodes.virtual; 24 25 import java.nio.ByteOrder; 26 27 import org.graalvm.compiler.graph.NodeClass; 28 import org.graalvm.compiler.nodeinfo.NodeInfo; 29 import org.graalvm.compiler.nodeinfo.Verbosity; 30 import org.graalvm.compiler.nodes.ConstantNode; 31 import org.graalvm.compiler.nodes.FixedNode; 32 import org.graalvm.compiler.nodes.ValueNode; 33 import org.graalvm.compiler.nodes.spi.ArrayLengthProvider; 34 import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool; 35 36 import jdk.vm.ci.meta.JavaKind; 37 import jdk.vm.ci.meta.ResolvedJavaType; 38 import sun.misc.Unsafe; 39 40 @NodeInfo(nameTemplate = "VirtualArray {p#componentType/s}[{p#length}]") 41 public class VirtualArrayNode extends VirtualObjectNode implements ArrayLengthProvider { 42 43 public static final NodeClass<VirtualArrayNode> TYPE = NodeClass.create(VirtualArrayNode.class); 44 protected final ResolvedJavaType componentType; 45 protected final int length; 46 47 public VirtualArrayNode(ResolvedJavaType componentType, int length) { 48 this(TYPE, componentType, length); 49 } 50 51 protected VirtualArrayNode(NodeClass<? extends VirtualObjectNode> c, ResolvedJavaType componentType, int length) { 52 super(c, componentType.getArrayClass(), true); 53 this.componentType = componentType; 54 this.length = length; 55 } 56 57 @Override 58 public ResolvedJavaType type() { 59 return componentType.getArrayClass(); 60 } 61 62 public ResolvedJavaType componentType() { 63 return componentType; 64 } 65 66 @Override 67 public int entryCount() { 68 return length; 69 } 70 71 @Override 72 public void generate(NodeLIRBuilderTool gen) { 73 // nothing to do... 74 } 75 76 @Override 77 public String toString(Verbosity verbosity) { 78 if (verbosity == Verbosity.Name) { 79 return super.toString(Verbosity.Name) + " " + componentType.getName() + "[" + length + "]"; 80 } else { 81 return super.toString(verbosity); 82 } 83 } 84 85 @Override 86 public String entryName(int index) { 87 return "[" + index + "]"; 88 } 89 90 @Override 91 public int entryIndexForOffset(long constantOffset, JavaKind expectedEntryKind) { 92 return entryIndexForOffset(constantOffset, expectedEntryKind, componentType, length); 93 } 94 95 public static int entryIndexForOffset(long constantOffset, JavaKind expectedEntryKind, ResolvedJavaType componentType, int length) { 96 int baseOffset; 97 int indexScale; 98 switch (componentType.getJavaKind()) { 99 case Boolean: | 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 package org.graalvm.compiler.nodes.virtual; 24 25 import java.nio.ByteOrder; 26 27 import org.graalvm.compiler.graph.NodeClass; 28 import org.graalvm.compiler.nodeinfo.NodeInfo; 29 import org.graalvm.compiler.nodeinfo.Verbosity; 30 import org.graalvm.compiler.nodes.ConstantNode; 31 import org.graalvm.compiler.nodes.FixedNode; 32 import org.graalvm.compiler.nodes.ValueNode; 33 import org.graalvm.compiler.nodes.spi.ArrayLengthProvider; 34 import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool; 35 36 import jdk.vm.ci.meta.JavaKind; 37 import jdk.vm.ci.meta.ResolvedJavaType; 38 import sun.misc.Unsafe; 39 40 @NodeInfo(nameTemplate = "VirtualArray({p#objectId}) {p#componentType/s}[{p#length}]") 41 public class VirtualArrayNode extends VirtualObjectNode implements ArrayLengthProvider { 42 43 public static final NodeClass<VirtualArrayNode> TYPE = NodeClass.create(VirtualArrayNode.class); 44 protected final ResolvedJavaType componentType; 45 protected final int length; 46 47 public VirtualArrayNode(ResolvedJavaType componentType, int length) { 48 this(TYPE, componentType, length); 49 } 50 51 protected VirtualArrayNode(NodeClass<? extends VirtualObjectNode> c, ResolvedJavaType componentType, int length) { 52 super(c, componentType.getArrayClass(), true); 53 this.componentType = componentType; 54 this.length = length; 55 } 56 57 @Override 58 public ResolvedJavaType type() { 59 return componentType.getArrayClass(); 60 } 61 62 public ResolvedJavaType componentType() { 63 return componentType; 64 } 65 66 @Override 67 public int entryCount() { 68 return length; 69 } 70 71 @Override 72 public void generate(NodeLIRBuilderTool gen) { 73 // nothing to do... 74 } 75 76 @Override 77 public String toString(Verbosity verbosity) { 78 if (verbosity == Verbosity.Name) { 79 return super.toString(Verbosity.Name) + "(" + getObjectId() + ") " + componentType.getName() + "[" + length + "]"; 80 } else { 81 return super.toString(verbosity); 82 } 83 } 84 85 @Override 86 public String entryName(int index) { 87 return "[" + index + "]"; 88 } 89 90 @Override 91 public int entryIndexForOffset(long constantOffset, JavaKind expectedEntryKind) { 92 return entryIndexForOffset(constantOffset, expectedEntryKind, componentType, length); 93 } 94 95 public static int entryIndexForOffset(long constantOffset, JavaKind expectedEntryKind, ResolvedJavaType componentType, int length) { 96 int baseOffset; 97 int indexScale; 98 switch (componentType.getJavaKind()) { 99 case Boolean: |