# HG changeset patch # User Tom Rodriguez # Date 1422645867 28800 # Node ID eb6af69e0195c35c9fa1cd6f7e6146ee0ffe1be4 # Parent 173bdcc85ab8322e39dd65f27476686084c89bb7 Properly handle multiple class names for ClassSubstitution diff -r 173bdcc85ab8 -r eb6af69e0195 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 Fri Jan 30 10:54:09 2015 -0800 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java Fri Jan 30 11:24:27 2015 -0800 @@ -113,11 +113,13 @@ } String originalName = originalName(substituteMethod, methodSubstitution.value()); JavaSignature originalSignature = originalSignature(substituteMethod, methodSubstitution.signature(), methodSubstitution.isStatic()); - Executable originalMethod = originalMethod(classSubstitution, methodSubstitution.optional(), originalName, originalSignature); - if (originalMethod != null && (guard == null || guard.execute())) { - ResolvedJavaMethod original = registerMethodSubstitution(this, originalMethod, substituteMethod); - if (original != null && methodSubstitution.forced() && shouldIntrinsify(original)) { - forcedSubstitutions.add(original); + Executable[] originalMethods = originalMethods(classSubstitution, methodSubstitution.optional(), originalName, originalSignature); + for (Executable originalMethod : originalMethods) { + if (originalMethod != null && (guard == null || guard.execute())) { + ResolvedJavaMethod original = registerMethodSubstitution(this, originalMethod, substituteMethod); + if (original != null && methodSubstitution.forced() && shouldIntrinsify(original)) { + forcedSubstitutions.add(original); + } } } } @@ -126,11 +128,13 @@ if (macroSubstitution != null && (defaultGuard == null || defaultGuard.execute())) { String originalName = originalName(substituteMethod, macroSubstitution.value()); JavaSignature originalSignature = originalSignature(substituteMethod, macroSubstitution.signature(), macroSubstitution.isStatic()); - Executable originalMethod = originalMethod(classSubstitution, macroSubstitution.optional(), originalName, originalSignature); - if (originalMethod != null) { - ResolvedJavaMethod original = registerMacroSubstitution(this, originalMethod, macroSubstitution.macro()); - if (original != null && macroSubstitution.forced() && shouldIntrinsify(original)) { - forcedSubstitutions.add(original); + Executable[] originalMethods = originalMethods(classSubstitution, macroSubstitution.optional(), originalName, originalSignature); + for (Executable originalMethod : originalMethods) { + if (originalMethod != null) { + ResolvedJavaMethod original = registerMacroSubstitution(this, originalMethod, macroSubstitution.macro()); + if (original != null && macroSubstitution.forced() && shouldIntrinsify(original)) { + forcedSubstitutions.add(original); + } } } } @@ -159,20 +163,30 @@ return new JavaSignature(returnType, parameters); } - private Executable originalMethod(ClassSubstitution classSubstitution, boolean optional, String name, JavaSignature signature) { + private Executable[] originalMethods(ClassSubstitution classSubstitution, boolean optional, String name, JavaSignature signature) { Class originalClass = classSubstitution.value(); if (originalClass == ClassSubstitution.class) { + ArrayList result = new ArrayList<>(); for (String className : classSubstitution.className()) { originalClass = resolveClass(className, classSubstitution.optional()); if (originalClass != null) { - break; + result.add(lookupOriginalMethod(originalClass, name, signature, optional)); } } - if (originalClass == null) { + if (result.size() == 0) { // optional class was not found return null; } + return result.toArray(new Executable[result.size()]); } + Executable original = lookupOriginalMethod(originalClass, name, signature, optional); + if (original != null) { + return new Executable[]{original}; + } + return null; + } + + private Executable lookupOriginalMethod(Class originalClass, String name, JavaSignature signature, boolean optional) throws GraalInternalError { try { if (name.equals("")) { assert signature.returnType.equals(void.class) : signature;