changeset 15826:1891bac562d8

Factor out rule creation in its own method
author Christian Wimmer <christian.wimmer@oracle.com>
date Tue, 20 May 2014 18:52:54 -0700
parents 4fd787b04c92
children 4e770fa50889
files graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/match/MatchRuleRegistry.java
diffstat 1 files changed, 35 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/match/MatchRuleRegistry.java	Tue May 20 18:51:54 2014 -0700
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/match/MatchRuleRegistry.java	Tue May 20 18:52:54 2014 -0700
@@ -95,31 +95,7 @@
 
         if (result == null) {
             NodeClassLookup lookup = new DefaultNodeClassLookup();
-            HashMap<Class<? extends NodeLIRBuilder>, List<MatchStatement>> localRules = new HashMap<>();
-            ServiceLoader<MatchStatementSet> sl = ServiceLoader.loadInstalled(MatchStatementSet.class);
-            for (MatchStatementSet rules : sl) {
-                localRules.put(rules.forClass(), rules.statements(lookup));
-            }
-
-            // Walk the class hierarchy collecting lists and merge them together. The subclass
-            // rules are first which gives them preference over earlier rules.
-            Map<Class<? extends ValueNode>, List<MatchStatement>> rules = new HashMap<>();
-            Class<?> currentClass = theClass;
-            do {
-                List<MatchStatement> statements = localRules.get(currentClass);
-                if (statements != null) {
-                    for (MatchStatement statement : statements) {
-                        Class<? extends ValueNode> nodeClass = statement.getPattern().nodeClass();
-                        List<MatchStatement> current = rules.get(nodeClass);
-                        if (current == null) {
-                            current = new ArrayList<>();
-                            rules.put(nodeClass, current);
-                        }
-                        current.add(statement);
-                    }
-                }
-                currentClass = currentClass.getSuperclass();
-            } while (currentClass != NodeLIRBuilder.class);
+            Map<Class<? extends ValueNode>, List<MatchStatement>> rules = createRules(theClass, lookup);
             registry.put(theClass, rules);
             assert registry.get(theClass) == rules;
             result = rules;
@@ -142,4 +118,38 @@
         }
         return result;
     }
+
+    /*
+     * This is a separate, public method so that external clients can create rules with a custom
+     * lookup and without the default caching behavior.
+     */
+    public static Map<Class<? extends ValueNode>, List<MatchStatement>> createRules(Class<? extends NodeLIRBuilder> theClass, NodeClassLookup lookup) {
+        HashMap<Class<? extends NodeLIRBuilder>, MatchStatementSet> matchSets = new HashMap<>();
+        ServiceLoader<MatchStatementSet> sl = ServiceLoader.loadInstalled(MatchStatementSet.class);
+        for (MatchStatementSet rules : sl) {
+            matchSets.put(rules.forClass(), rules);
+        }
+
+        // Walk the class hierarchy collecting lists and merge them together. The subclass
+        // rules are first which gives them preference over earlier rules.
+        Map<Class<? extends ValueNode>, List<MatchStatement>> rules = new HashMap<>();
+        Class<?> currentClass = theClass;
+        do {
+            MatchStatementSet matchSet = matchSets.get(currentClass);
+            if (matchSet != null) {
+                List<MatchStatement> statements = matchSet.statements(lookup);
+                for (MatchStatement statement : statements) {
+                    Class<? extends ValueNode> nodeClass = statement.getPattern().nodeClass();
+                    List<MatchStatement> current = rules.get(nodeClass);
+                    if (current == null) {
+                        current = new ArrayList<>();
+                        rules.put(nodeClass, current);
+                    }
+                    current.add(statement);
+                }
+            }
+            currentClass = currentClass.getSuperclass();
+        } while (currentClass != NodeLIRBuilder.class);
+        return rules;
+    }
 }