# HG changeset patch # User Doug Simon # Date 1402468543 -7200 # Node ID df8d39e2000b09dd3d05341ff5ca05b4040a50d3 # Parent 0dd4bbe37f19b69ee5a314cbe0225dd157de2f2d# Parent 77783d8a45efc26903119725189560e191727621 Merge. diff -r 0dd4bbe37f19 -r df8d39e2000b graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectCloneNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectCloneNode.java Wed Jun 11 08:35:18 2014 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectCloneNode.java Wed Jun 11 08:35:43 2014 +0200 @@ -77,6 +77,7 @@ assert snippetGraph != null : "ObjectCloneSnippets should be installed"; return lowerReplacement(snippetGraph.copy(), tool); } + assert false : "unhandled array type " + type.getComponentType().getKind(); } else { type = getConcreteType(getObject().stamp(), tool.assumptions(), tool.getMetaAccess()); if (type != null) { @@ -106,7 +107,7 @@ /* * Looks at the given stamp and determines if it is an exact type (or can be assumed to be an * exact type) and if it is a cloneable type. - * + * * If yes, then the exact type is returned, otherwise it returns null. */ private static ResolvedJavaType getConcreteType(Stamp stamp, Assumptions assumptions, MetaAccessProvider metaAccess) { diff -r 0dd4bbe37f19 -r df8d39e2000b graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectCloneSnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectCloneSnippets.java Wed Jun 11 08:35:18 2014 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectCloneSnippets.java Wed Jun 11 08:35:43 2014 +0200 @@ -36,10 +36,14 @@ public static final EnumMap arrayCloneMethods = new EnumMap<>(Kind.class); static { + arrayCloneMethods.put(Kind.Boolean, getCloneMethod("booleanArrayClone", boolean[].class)); arrayCloneMethods.put(Kind.Byte, getCloneMethod("byteArrayClone", byte[].class)); arrayCloneMethods.put(Kind.Char, getCloneMethod("charArrayClone", char[].class)); + arrayCloneMethods.put(Kind.Short, getCloneMethod("shortArrayClone", short[].class)); arrayCloneMethods.put(Kind.Int, getCloneMethod("intArrayClone", int[].class)); + arrayCloneMethods.put(Kind.Float, getCloneMethod("floatArrayClone", float[].class)); arrayCloneMethods.put(Kind.Long, getCloneMethod("longArrayClone", long[].class)); + arrayCloneMethods.put(Kind.Double, getCloneMethod("doubleArrayClone", double[].class)); arrayCloneMethods.put(Kind.Object, getCloneMethod("objectArrayClone", Object[].class)); } @@ -52,6 +56,13 @@ } @Snippet(removeAllFrameStates = true) + public static boolean[] booleanArrayClone(boolean[] src) { + boolean[] result = (boolean[]) NewArrayNode.newUninitializedArray(Boolean.TYPE, src.length); + ArrayCopyCallNode.disjointArraycopy(src, 0, result, 0, src.length, Kind.Boolean); + return result; + } + + @Snippet(removeAllFrameStates = true) public static byte[] byteArrayClone(byte[] src) { byte[] result = (byte[]) NewArrayNode.newUninitializedArray(Byte.TYPE, src.length); ArrayCopyCallNode.disjointArraycopy(src, 0, result, 0, src.length, Kind.Byte); @@ -59,6 +70,13 @@ } @Snippet(removeAllFrameStates = true) + public static short[] shortArrayClone(short[] src) { + short[] result = (short[]) NewArrayNode.newUninitializedArray(Short.TYPE, src.length); + ArrayCopyCallNode.disjointArraycopy(src, 0, result, 0, src.length, Kind.Short); + return result; + } + + @Snippet(removeAllFrameStates = true) public static char[] charArrayClone(char[] src) { char[] result = (char[]) NewArrayNode.newUninitializedArray(Character.TYPE, src.length); ArrayCopyCallNode.disjointArraycopy(src, 0, result, 0, src.length, Kind.Char); @@ -73,6 +91,13 @@ } @Snippet(removeAllFrameStates = true) + public static float[] floatArrayClone(float[] src) { + float[] result = (float[]) NewArrayNode.newUninitializedArray(Float.TYPE, src.length); + ArrayCopyCallNode.disjointArraycopy(src, 0, result, 0, src.length, Kind.Float); + return result; + } + + @Snippet(removeAllFrameStates = true) public static long[] longArrayClone(long[] src) { long[] result = (long[]) NewArrayNode.newUninitializedArray(Long.TYPE, src.length); ArrayCopyCallNode.disjointArraycopy(src, 0, result, 0, src.length, Kind.Long); @@ -80,6 +105,13 @@ } @Snippet(removeAllFrameStates = true) + public static double[] doubleArrayClone(double[] src) { + double[] result = (double[]) NewArrayNode.newUninitializedArray(Double.TYPE, src.length); + ArrayCopyCallNode.disjointArraycopy(src, 0, result, 0, src.length, Kind.Double); + return result; + } + + @Snippet(removeAllFrameStates = true) public static Object[] objectArrayClone(Object[] src) { Object[] result = (Object[]) DynamicNewArrayNode.newUninitializedArray(GuardingPiNode.guardingNonNull(src.getClass().getComponentType()), src.length); ArrayCopyCallNode.disjointUninitializedArraycopy(src, 0, result, 0, src.length, Kind.Object);