public override bool Match(CFGNode node) { IsMatched = false; Patterns = new List<CostRestrictedStatementPattern>(); MatchedNodes = new Tenpow.Collections.Generic.Set<CFGNode>(); if (!PassesFilter(node)) { return false; } int cost = 0; while (true) { CostRestrictedStatementPattern pattern = new CostRestrictedStatementPattern(CompileInfo); pattern.WorkingSet = WorkingSet; pattern.Matched += PatternMatched; pattern.MaxCost = MaxCost - cost; if (pattern.Match(node)) { cost += pattern.Cost; Patterns.Add(pattern); int topologicalOrder = -1; // TODO: verify that last matched nodes are in topological order foreach (CFGNode n in LastMatchedNodes) { if (CompileInfo.TopologicalOrder[n] > topologicalOrder) { topologicalOrder = CompileInfo.TopologicalOrder[n]; } } if (CompileInfo.TopologicalSort.Count == topologicalOrder + 1 || topologicalOrder == -1) { break; } node = CompileInfo.TopologicalSort[topologicalOrder + 1]; if (!PassesFilter(node)) { break; } } else { break; } } OnMatched(new CFGPatternMatch(MatchedNodes)); IsMatched = true; return true; }
void PatternMatched(object sender, PatternMatchEventArgs<CFGPatternMatch> args) { MatchedNodes |= (LastMatchedNodes = args.Match.MatchedNodes); }