protected NewArrayNode createNewArray(ResolvedJavaType elementType, ValueNode length, boolean fillContents) { return new NewArrayNode(elementType, length, fillContents); }
protected NewArrayNode createNewArrayFromVirtual(VirtualObjectNode virtual, ValueNode length) { return new NewArrayNode(((VirtualArrayNode) virtual).componentType(), length, true); }
/** Hook for subclasses to instantiate a subclass of {@link NewArrayNode}. */ protected NewArrayNode createNewArrayNode(ResolvedJavaType type) { return new NewArrayNode(type, length(), fillContents(), stateBefore()); }
@Override public boolean execute(GraphBuilderContext b, ResolvedJavaMethod targetMethod, InvocationPlugin.Receiver receiver, ValueNode[] args) { jdk.vm.ci.meta.ResolvedJavaType arg0; if (args[0].isConstant()) { jdk.vm.ci.meta.JavaConstant cst = args[0].asJavaConstant(); arg0 = b.getConstantReflection().asJavaType(cst); if (arg0 == null) { arg0 = snippetReflection.asObject(jdk.vm.ci.meta.ResolvedJavaType.class, cst); } } else { assert b.canDeferPlugin(this) : b.getClass().toString(); return false; } ValueNode arg1 = args[1]; boolean arg2; if (args[2].isConstant()) { arg2 = args[2].asJavaConstant().asInt() != 0; } else { assert b.canDeferPlugin(this) : b.getClass().toString(); return false; } org.graalvm.compiler.nodes.java.NewArrayNode node = new org.graalvm.compiler.nodes.java.NewArrayNode(arg0, arg1, arg2); b.addPush(JavaKind.Object, node); return true; } @Override
private ValueNode newArray(HostedProviders providers, JNIGraphKit kit, List<ValueNode> arguments) { ResolvedJavaType elementType = providers.getMetaAccess().lookupJavaType(elementKind.toJavaClass()); ValueNode length = arguments.get(1); ConstantNode zero = kit.createInt(0); kit.startIf(new IntegerLessThanNode(length, zero), BranchProbabilityNode.VERY_SLOW_PATH_PROBABILITY); kit.thenPart(); ValueNode nullHandle = kit.createConstant(JavaConstant.INT_0, providers.getWordTypes().getWordKind()); kit.elsePart(); ValueNode array = kit.append(new NewArrayNode(elementType, length, true)); ValueNode arrayHandle = kit.boxObjectInLocalHandle(array); AbstractMergeNode merge = kit.endIf(); Stamp handleStamp = providers.getWordTypes().getWordStamp(providers.getMetaAccess().lookupJavaType(JNIObjectHandle.class)); return kit.unique(new ValuePhiNode(handleStamp, merge, new ValueNode[]{nullHandle, arrayHandle})); }