Mercurial > hg > graal-compiler
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; + } }