changeset 19057:eb6af69e0195

Properly handle multiple class names for ClassSubstitution
author Tom Rodriguez <tom.rodriguez@oracle.com>
date Fri, 30 Jan 2015 11:24:27 -0800
parents 173bdcc85ab8
children 60ba8c3b4d93
files graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java
diffstat 1 files changed, 27 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- 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<Executable> 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("<init>")) {
                     assert signature.returnType.equals(void.class) : signature;