# HG changeset patch # User Doug Simon # Date 1385504058 -3600 # Node ID feff37de44653ad89bdced4d93fcddd91edcc0ac # Parent 5c7f67c7ccd483258f505351fbb1988cbe7bf465# Parent 57ea5bfec214499efec03789b3c1793e6d3c843f Merge. diff -r 57ea5bfec214 -r feff37de4465 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CipherBlockChainingSubstitutions.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CipherBlockChainingSubstitutions.java Tue Nov 26 13:03:40 2013 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CipherBlockChainingSubstitutions.java Tue Nov 26 23:14:18 2013 +0100 @@ -69,7 +69,7 @@ return AESCryptSubstitutions.AESCryptClass; } - @MethodSubstitution(isStatic = false) + @MethodSubstitution(isStatic = false, optional = true) static void encrypt(Object rcvr, byte[] in, int inOffset, int inLength, byte[] out, int outOffset) { Object embeddedCipher = UnsafeLoadNode.load(rcvr, embeddedCipherOffset, Kind.Object, embeddedCipherLocationIdentity); if (getAESCryptClass().isInstance(embeddedCipher)) { @@ -79,7 +79,7 @@ } } - @MethodSubstitution(isStatic = false) + @MethodSubstitution(isStatic = false, optional = true) static void decrypt(Object rcvr, byte[] in, int inOffset, int inLength, byte[] out, int outOffset) { Object embeddedCipher = UnsafeLoadNode.load(rcvr, embeddedCipherOffset, Kind.Object, embeddedCipherLocationIdentity); if (in != out && getAESCryptClass().isInstance(embeddedCipher)) { @@ -89,6 +89,28 @@ } } + @MethodSubstitution(value = "encrypt", isStatic = false, optional = true) + static int encryptInt(Object rcvr, byte[] in, int inOffset, int inLength, byte[] out, int outOffset) { + Object embeddedCipher = UnsafeLoadNode.load(rcvr, embeddedCipherOffset, Kind.Object, embeddedCipherLocationIdentity); + if (getAESCryptClass().isInstance(embeddedCipher)) { + crypt(rcvr, in, inOffset, inLength, out, outOffset, embeddedCipher, true); + return inLength; + } else { + return encryptInt(rcvr, in, inOffset, inLength, out, outOffset); + } + } + + @MethodSubstitution(value = "decrypt", isStatic = false, optional = true) + static int decryptInt(Object rcvr, byte[] in, int inOffset, int inLength, byte[] out, int outOffset) { + Object embeddedCipher = UnsafeLoadNode.load(rcvr, embeddedCipherOffset, Kind.Object, embeddedCipherLocationIdentity); + if (in != out && getAESCryptClass().isInstance(embeddedCipher)) { + crypt(rcvr, in, inOffset, inLength, out, outOffset, embeddedCipher, false); + return inLength; + } else { + return decryptInt(rcvr, in, inOffset, inLength, out, outOffset); + } + } + private static void crypt(Object rcvr, byte[] in, int inOffset, int inLength, byte[] out, int outOffset, Object embeddedCipher, boolean encrypt) { Object kObject = UnsafeLoadNode.load(embeddedCipher, AESCryptSubstitutions.kOffset, Kind.Object, AESCryptSubstitutions.kLocationIdentity); Object rObject = UnsafeLoadNode.load(rcvr, rOffset, Kind.Object, rLocationIdentity); diff -r 57ea5bfec214 -r feff37de4465 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java Tue Nov 26 13:03:40 2013 -0800 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java Tue Nov 26 23:14:18 2013 +0100 @@ -165,8 +165,8 @@ throw new GraalInternalError("Substitution method must not be abstract or native: " + substituteMethod); } String originalName = originalName(substituteMethod, methodSubstitution.value()); - Class[] originalParameters = originalParameters(substituteMethod, methodSubstitution.signature(), methodSubstitution.isStatic()); - Member originalMethod = originalMethod(classSubstitution, methodSubstitution.optional(), originalName, originalParameters); + JavaSignature originalSignature = originalSignature(substituteMethod, methodSubstitution.signature(), methodSubstitution.isStatic()); + Member originalMethod = originalMethod(classSubstitution, methodSubstitution.optional(), originalName, originalSignature); if (originalMethod != null) { ResolvedJavaMethod original = registerMethodSubstitution(originalMethod, substituteMethod); if (original != null && methodSubstitution.forced() && shouldIntrinsify(original)) { @@ -176,8 +176,8 @@ } if (macroSubstitution != null) { String originalName = originalName(substituteMethod, macroSubstitution.value()); - Class[] originalParameters = originalParameters(substituteMethod, macroSubstitution.signature(), macroSubstitution.isStatic()); - Member originalMethod = originalMethod(classSubstitution, macroSubstitution.optional(), originalName, originalParameters); + JavaSignature originalSignature = originalSignature(substituteMethod, macroSubstitution.signature(), macroSubstitution.isStatic()); + Member originalMethod = originalMethod(classSubstitution, macroSubstitution.optional(), originalName, originalSignature); if (originalMethod != null) { ResolvedJavaMethod original = registerMacroSubstitution(originalMethod, macroSubstitution.macro()); if (original != null && macroSubstitution.forced() && shouldIntrinsify(original)) { @@ -204,7 +204,7 @@ } else { original = metaAccess.lookupJavaConstructor((Constructor) originalMember); } - Debug.log("substitution: " + MetaUtil.format("%H.%n(%p)", original) + " --> " + MetaUtil.format("%H.%n(%p)", substitute)); + Debug.log("substitution: " + MetaUtil.format("%H.%n(%p) %r", original) + " --> " + MetaUtil.format("%H.%n(%p) %r", substitute)); registeredMethodSubstitutions.put(original, substitute); return original; @@ -507,25 +507,50 @@ return dimensions == 0 ? baseClass : Array.newInstance(baseClass, new int[dimensions]).getClass(); } - private Class[] originalParameters(Method substituteMethod, String methodSubstitution, boolean isStatic) { + static class JavaSignature { + final Class returnType; + final Class[] parameters; + + public JavaSignature(Class returnType, Class[] parameters) { + this.parameters = parameters; + this.returnType = returnType; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("("); + for (int i = 0; i < parameters.length; i++) { + if (i != 0) { + sb.append(", "); + } + sb.append(parameters[i].getName()); + } + return sb.append(") ").append(returnType.getName()).toString(); + } + } + + private JavaSignature originalSignature(Method substituteMethod, String methodSubstitution, boolean isStatic) { Class[] parameters; + Class returnType; if (methodSubstitution.isEmpty()) { parameters = substituteMethod.getParameterTypes(); if (!isStatic) { assert parameters.length > 0 : "must be a static method with the 'this' object as its first parameter"; parameters = Arrays.copyOfRange(parameters, 1, parameters.length); } + returnType = substituteMethod.getReturnType(); } else { Signature signature = providers.getMetaAccess().parseMethodDescriptor(methodSubstitution); parameters = new Class[signature.getParameterCount(false)]; for (int i = 0; i < parameters.length; i++) { parameters[i] = resolveType(signature.getParameterType(i, null)); } + returnType = resolveType(signature.getReturnType(null)); } - return parameters; + return new JavaSignature(returnType, parameters); } - private static Member originalMethod(ClassSubstitution classSubstitution, boolean optional, String name, Class[] parameters) { + private static Member originalMethod(ClassSubstitution classSubstitution, boolean optional, String name, JavaSignature signature) { Class originalClass = classSubstitution.value(); if (originalClass == ClassSubstitution.class) { originalClass = resolveType(classSubstitution.className(), classSubstitution.optional()); @@ -536,9 +561,15 @@ } try { if (name.equals("")) { - return originalClass.getDeclaredConstructor(parameters); + assert signature.returnType.equals(void.class) : signature; + Constructor original = originalClass.getDeclaredConstructor(signature.parameters); + return original; } else { - return originalClass.getDeclaredMethod(name, parameters); + Method original = originalClass.getDeclaredMethod(name, signature.parameters); + if (!original.getReturnType().equals(signature.returnType)) { + throw new NoSuchMethodException(originalClass.getName() + "." + name + signature); + } + return original; } } catch (NoSuchMethodException | SecurityException e) { if (optional) { diff -r 57ea5bfec214 -r feff37de4465 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/FrameWithoutBoxingSubstitutions.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/FrameWithoutBoxingSubstitutions.java Tue Nov 26 13:03:40 2013 -0800 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/FrameWithoutBoxingSubstitutions.java Tue Nov 26 23:14:18 2013 +0100 @@ -24,13 +24,14 @@ import com.oracle.graal.api.replacements.*; import com.oracle.graal.truffle.*; +import com.oracle.truffle.api.frame.*; @ClassSubstitution(FrameWithoutBoxing.class) public class FrameWithoutBoxingSubstitutions { @SuppressWarnings("unused") @MethodSubstitution(isStatic = false, forced = true) - public static Object pack(FrameWithoutBoxing frame) { + public static PackedFrame pack(FrameWithoutBoxing frame) { return null; } }