Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ VisitLoop()

override QilNode System.Xml.Xsl.IlGen.XmlILOptimizerVisitor.VisitLoop ( QilLoop local0)
inlineprotectedvirtual

Reimplemented from System.Xml.Xsl.Qil.QilVisitor.

Definition at line 1471 of file XmlILOptimizerVisitor.cs.

1472 {
1473 QilNode qilNode = local0[0];
1474 QilNode qilNode2 = local0[1];
1475 if (this[XmlILOptimization.FoldNone] && (object)qilNode.XmlType == XmlQueryTypeFactory.None && AllowReplace(XmlILOptimization.FoldNone, local0))
1476 {
1477 return Replace(XmlILOptimization.FoldNone, local0, VisitNop(f.Nop(qilNode[0])));
1478 }
1479 if (this[XmlILOptimization.EliminateIterator] && qilNode.NodeType == QilNodeType.For)
1480 {
1482 if (qilNode3.NodeType == QilNodeType.For && !OptimizerPatterns.Read(qilNode).MatchesPattern(OptimizerPatternName.IsPositional) && AllowReplace(XmlILOptimization.EliminateIterator, local0))
1483 {
1484 return Replace(XmlILOptimization.EliminateIterator, local0, Subs(qilNode2, qilNode, qilNode3));
1485 }
1486 }
1487 if (this[XmlILOptimization.EliminateLoop] && qilNode.NodeType == QilNodeType.For)
1488 {
1490 if (qilNode4.NodeType == QilNodeType.Sequence && qilNode4.Count == 0 && AllowReplace(XmlILOptimization.EliminateLoop, local0))
1491 {
1492 return Replace(XmlILOptimization.EliminateLoop, local0, VisitSequence(f.Sequence()));
1493 }
1494 }
1495 if (this[XmlILOptimization.EliminateLoop] && !OptimizerPatterns.Read(qilNode).MatchesPattern(OptimizerPatternName.MaybeSideEffects) && qilNode2.NodeType == QilNodeType.Sequence && qilNode2.Count == 0 && AllowReplace(XmlILOptimization.EliminateLoop, local0))
1496 {
1497 return Replace(XmlILOptimization.EliminateLoop, local0, VisitSequence(f.Sequence()));
1498 }
1499 if (this[XmlILOptimization.EliminateLoop] && qilNode2 == qilNode && AllowReplace(XmlILOptimization.EliminateLoop, local0))
1500 {
1501 return Replace(XmlILOptimization.EliminateLoop, local0, qilNode[0]);
1502 }
1503 if (this[XmlILOptimization.NormalizeLoopText] && qilNode.NodeType == QilNodeType.For)
1504 {
1506 if (qilNode5.XmlType.IsSingleton && qilNode2.NodeType == QilNodeType.TextCtor)
1507 {
1508 QilNode body = qilNode2[0];
1509 if (AllowReplace(XmlILOptimization.NormalizeLoopText, local0))
1510 {
1511 return Replace(XmlILOptimization.NormalizeLoopText, local0, VisitTextCtor(f.TextCtor(VisitLoop(f.Loop(qilNode, body)))));
1512 }
1513 }
1514 }
1515 if (this[XmlILOptimization.EliminateIteratorUsedAtMostOnce] && (qilNode.NodeType == QilNodeType.Let || qilNode[0].XmlType.IsSingleton) && !OptimizerPatterns.Read(qilNode).MatchesPattern(OptimizerPatternName.MaybeSideEffects) && _nodeCounter.Count(qilNode2, qilNode) <= 1 && AllowReplace(XmlILOptimization.EliminateIteratorUsedAtMostOnce, local0))
1516 {
1517 return Replace(XmlILOptimization.EliminateIteratorUsedAtMostOnce, local0, Subs(qilNode2, qilNode, qilNode[0]));
1518 }
1519 if (this[XmlILOptimization.NormalizeLoopConditional] && qilNode2.NodeType == QilNodeType.Conditional)
1520 {
1521 QilNode child = qilNode2[0];
1524 if (qilNode6.NodeType == QilNodeType.Sequence && qilNode6.Count == 0 && qilNode7 == qilNode && AllowReplace(XmlILOptimization.NormalizeLoopConditional, local0))
1525 {
1526 return Replace(XmlILOptimization.NormalizeLoopConditional, local0, VisitFilter(f.Filter(qilNode, VisitNot(f.Not(child)))));
1527 }
1528 }
1529 if (this[XmlILOptimization.NormalizeLoopConditional] && qilNode2.NodeType == QilNodeType.Conditional)
1530 {
1531 QilNode body2 = qilNode2[0];
1534 if (qilNode8 == qilNode && qilNode9.NodeType == QilNodeType.Sequence && qilNode9.Count == 0 && AllowReplace(XmlILOptimization.NormalizeLoopConditional, local0))
1535 {
1536 return Replace(XmlILOptimization.NormalizeLoopConditional, local0, VisitFilter(f.Filter(qilNode, body2)));
1537 }
1538 }
1539 if (this[XmlILOptimization.NormalizeLoopConditional] && qilNode.NodeType == QilNodeType.For && qilNode2.NodeType == QilNodeType.Conditional)
1540 {
1541 QilNode child2 = qilNode2[0];
1543 QilNode expr = qilNode2[2];
1544 if (qilNode10.NodeType == QilNodeType.Sequence && qilNode10.Count == 0 && NonPositional(expr, qilNode) && AllowReplace(XmlILOptimization.NormalizeLoopConditional, local0))
1545 {
1547 return Replace(XmlILOptimization.NormalizeLoopConditional, local0, VisitLoop(f.Loop(qilNode11, Subs(expr, qilNode, qilNode11))));
1548 }
1549 }
1550 if (this[XmlILOptimization.NormalizeLoopConditional] && qilNode.NodeType == QilNodeType.For && qilNode2.NodeType == QilNodeType.Conditional)
1551 {
1552 QilNode body3 = qilNode2[0];
1553 QilNode expr2 = qilNode2[1];
1555 if (NonPositional(expr2, qilNode) && qilNode12.NodeType == QilNodeType.Sequence && qilNode12.Count == 0 && AllowReplace(XmlILOptimization.NormalizeLoopConditional, local0))
1556 {
1558 return Replace(XmlILOptimization.NormalizeLoopConditional, local0, VisitLoop(f.Loop(qilNode13, Subs(expr2, qilNode, qilNode13))));
1559 }
1560 }
1561 if (this[XmlILOptimization.NormalizeLoopLoop] && qilNode2.NodeType == QilNodeType.Loop)
1562 {
1564 QilNode expr3 = qilNode2[1];
1565 if (qilNode14.NodeType == QilNodeType.For)
1566 {
1567 QilNode body4 = qilNode14[0];
1569 {
1572 }
1573 }
1574 }
1575 if (this[XmlILOptimization.AnnotateSingletonLoop] && qilNode.NodeType == QilNodeType.For)
1576 {
1578 if (!qilNode16.XmlType.MaybeMany && AllowReplace(XmlILOptimization.AnnotateSingletonLoop, local0))
1579 {
1580 OptimizerPatterns.Inherit(qilNode2, local0, OptimizerPatternName.IsDocOrderDistinct);
1581 OptimizerPatterns.Inherit(qilNode2, local0, OptimizerPatternName.SameDepth);
1582 }
1583 }
1584 if (this[XmlILOptimization.AnnotateRootLoop] && IsStepPattern(qilNode2, QilNodeType.Root) && AllowReplace(XmlILOptimization.AnnotateRootLoop, local0))
1585 {
1586 OptimizerPatterns.Write(local0).AddPattern(OptimizerPatternName.SameDepth);
1587 }
1588 if (this[XmlILOptimization.AnnotateContentLoop] && qilNode.NodeType == QilNodeType.For)
1589 {
1591 if (OptimizerPatterns.Read(qilNode17).MatchesPattern(OptimizerPatternName.SameDepth) && (IsStepPattern(qilNode2, QilNodeType.Content) || IsStepPattern(qilNode2, QilNodeType.Union)) && qilNode == OptimizerPatterns.Read(qilNode2).GetArgument(OptimizerPatternArgument.StepInput) && AllowReplace(XmlILOptimization.AnnotateContentLoop, local0))
1592 {
1593 OptimizerPatterns.Write(local0).AddPattern(OptimizerPatternName.SameDepth);
1594 OptimizerPatterns.Inherit(qilNode17, local0, OptimizerPatternName.IsDocOrderDistinct);
1595 }
1596 }
1597 if (this[XmlILOptimization.AnnotateAttrNmspLoop] && qilNode.NodeType == QilNodeType.For)
1598 {
1599 QilNode ndSrc = qilNode[0];
1600 if ((IsStepPattern(qilNode2, QilNodeType.Attribute) || IsStepPattern(qilNode2, QilNodeType.XPathNamespace) || OptimizerPatterns.Read(qilNode2).MatchesPattern(OptimizerPatternName.FilterAttributeKind)) && qilNode == OptimizerPatterns.Read(qilNode2).GetArgument(OptimizerPatternArgument.StepInput) && AllowReplace(XmlILOptimization.AnnotateAttrNmspLoop, local0))
1601 {
1602 OptimizerPatterns.Inherit(ndSrc, local0, OptimizerPatternName.SameDepth);
1603 OptimizerPatterns.Inherit(ndSrc, local0, OptimizerPatternName.IsDocOrderDistinct);
1604 }
1605 }
1606 if (this[XmlILOptimization.AnnotateDescendantLoop] && qilNode.NodeType == QilNodeType.For)
1607 {
1609 if (OptimizerPatterns.Read(qilNode18).MatchesPattern(OptimizerPatternName.SameDepth) && (IsStepPattern(qilNode2, QilNodeType.Descendant) || IsStepPattern(qilNode2, QilNodeType.DescendantOrSelf)) && qilNode == OptimizerPatterns.Read(qilNode2).GetArgument(OptimizerPatternArgument.StepInput) && AllowReplace(XmlILOptimization.AnnotateDescendantLoop, local0))
1610 {
1611 OptimizerPatterns.Inherit(qilNode18, local0, OptimizerPatternName.IsDocOrderDistinct);
1612 }
1613 }
1614 return NoReplace(local0);
1615 }
override QilNode VisitNot(QilUnary local0)
bool AllowReplace(XmlILOptimization pattern, QilNode original)
QilNode Subs(QilNode expr, QilNode refOld, QilNode refNew)
bool DependsOn(QilNode expr, QilNode target)
override QilNode VisitTextCtor(QilUnary local0)
bool IsStepPattern(QilNode nd, QilNodeType stepType)
override QilNode VisitNop(QilUnary local0)
bool NonPositional(QilNode expr, QilNode iter)
override QilNode VisitSequence(QilList local0)
QilList Sequence(IList< QilNode > values)
Definition QilFactory.cs:44
QilUnary TextCtor(QilNode child)
QilUnary Nop(QilNode child)
QilUnary Not(QilNode child)
QilLoop Filter(QilNode variable, QilNode body)
QilLoop Loop(QilNode variable, QilNode body)
QilIterator For(QilNode binding)
override QilNode VisitFor(QilIterator n)

References System.Xml.Xsl.IlGen.XmlILOptimizerVisitor._nodeCounter, System.Xml.Xsl.IlGen.XmlILOptimizerVisitor.AllowReplace(), System.Collections.Generic.Dictionary< TKey, TValue >.Count, System.Xml.Xsl.IlGen.XmlILOptimizerVisitor.NodeCounter.Count(), System.Xml.Xsl.IlGen.XmlILOptimizerVisitor.DependsOn(), System.Xml.Xsl.Qil.QilReplaceVisitor.f, System.Xml.Xsl.Qil.QilFactory.Filter(), System.Xml.Xsl.Qil.QilFactory.For(), System.Xml.Xsl.IlGen.OptimizerPatterns.Inherit(), System.Xml.Xsl.IlGen.XmlILOptimizerVisitor.IsStepPattern(), System.Xml.Xsl.Qil.QilFactory.Loop(), System.Xml.Xsl.XmlQueryTypeFactory.None, System.Xml.Xsl.IlGen.XmlILOptimizerVisitor.NonPositional(), System.Xml.Xsl.Qil.QilFactory.Nop(), System.Xml.Xsl.IlGen.XmlILOptimizerVisitor.NoReplace(), System.Xml.Xsl.Qil.QilFactory.Not(), System.Xml.Xsl.IlGen.OptimizerPatterns.Read(), System.Xml.Replace, System.Xml.Xsl.Qil.QilFactory.Sequence(), System.Xml.Xsl.IlGen.XmlILOptimizerVisitor.Subs(), System.Xml.Xsl.Qil.QilFactory.TextCtor(), System.Xml.Xsl.IlGen.XmlILOptimizerVisitor.VisitFilter(), System.Xml.Xsl.Qil.QilPatternVisitor.VisitFor(), System.Xml.Xsl.IlGen.XmlILOptimizerVisitor.VisitLoop(), System.Xml.Xsl.IlGen.XmlILOptimizerVisitor.VisitNop(), System.Xml.Xsl.IlGen.XmlILOptimizerVisitor.VisitNot(), System.Xml.Xsl.IlGen.XmlILOptimizerVisitor.VisitSequence(), System.Xml.Xsl.IlGen.XmlILOptimizerVisitor.VisitTextCtor(), and System.Xml.Xsl.IlGen.OptimizerPatterns.Write().

Referenced by System.Xml.Xsl.IlGen.XmlILOptimizerVisitor.VisitDocOrderDistinct(), System.Xml.Xsl.IlGen.XmlILOptimizerVisitor.VisitFilter(), System.Xml.Xsl.IlGen.XmlILOptimizerVisitor.VisitIsEmpty(), System.Xml.Xsl.IlGen.XmlILOptimizerVisitor.VisitIsType(), and System.Xml.Xsl.IlGen.XmlILOptimizerVisitor.VisitLoop().