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

◆ HandleDodPatterns()

bool System.Xml.Xsl.IlGen.XmlILVisitor.HandleDodPatterns ( QilUnary ndDod)
inlineprivate

Definition at line 1435 of file XmlILVisitor.cs.

1436 {
1437 OptimizerPatterns optimizerPatterns = OptimizerPatterns.Read(ndDod);
1438 bool flag = optimizerPatterns.MatchesPattern(OptimizerPatternName.JoinAndDod);
1439 if (flag || optimizerPatterns.MatchesPattern(OptimizerPatternName.DodReverse))
1440 {
1441 OptimizerPatterns optimizerPatterns2 = OptimizerPatterns.Read((QilNode)optimizerPatterns.GetArgument(OptimizerPatternArgument.ElementQName));
1442 XmlNodeKindFlags kinds;
1444 if (optimizerPatterns2.MatchesPattern(OptimizerPatternName.FilterElements))
1445 {
1446 kinds = XmlNodeKindFlags.Element;
1447 ndName = (QilName)optimizerPatterns2.GetArgument(OptimizerPatternArgument.ElementQName);
1448 }
1449 else if (optimizerPatterns2.MatchesPattern(OptimizerPatternName.FilterContentKind))
1450 {
1451 kinds = ((XmlQueryType)optimizerPatterns2.GetArgument(OptimizerPatternArgument.ElementQName)).NodeKinds;
1452 ndName = null;
1453 }
1454 else
1455 {
1456 kinds = (((ndDod.XmlType.NodeKinds & XmlNodeKindFlags.Attribute) != 0) ? XmlNodeKindFlags.Any : XmlNodeKindFlags.Content);
1457 ndName = null;
1458 }
1460 if (flag)
1461 {
1462 switch (qilNode.NodeType)
1463 {
1464 case QilNodeType.Content:
1465 CreateContainerIterator(ndDod, "$$$iterContent", typeof(ContentMergeIterator), XmlILMethods.ContentMergeCreate, XmlILMethods.ContentMergeNext, XmlILMethods.ContentMergeCurrent, kinds, ndName, TriState.Unknown);
1466 return true;
1467 case QilNodeType.Descendant:
1468 case QilNodeType.DescendantOrSelf:
1469 CreateContainerIterator(ndDod, "$$$iterDesc", typeof(DescendantMergeIterator), XmlILMethods.DescMergeCreate, XmlILMethods.DescMergeNext, XmlILMethods.DescMergeCurrent, kinds, ndName, (qilNode.NodeType != QilNodeType.Descendant) ? TriState.True : TriState.False);
1470 return true;
1471 case QilNodeType.XPathFollowing:
1472 CreateContainerIterator(ndDod, "$$$iterFoll", typeof(XPathFollowingMergeIterator), XmlILMethods.XPFollMergeCreate, XmlILMethods.XPFollMergeNext, XmlILMethods.XPFollMergeCurrent, kinds, ndName, TriState.Unknown);
1473 return true;
1474 case QilNodeType.FollowingSibling:
1475 CreateContainerIterator(ndDod, "$$$iterFollSib", typeof(FollowingSiblingMergeIterator), XmlILMethods.FollSibMergeCreate, XmlILMethods.FollSibMergeNext, XmlILMethods.FollSibMergeCurrent, kinds, ndName, TriState.Unknown);
1476 return true;
1477 case QilNodeType.XPathPreceding:
1478 CreateContainerIterator(ndDod, "$$$iterPrec", typeof(XPathPrecedingMergeIterator), XmlILMethods.XPPrecMergeCreate, XmlILMethods.XPPrecMergeNext, XmlILMethods.XPPrecMergeCurrent, kinds, ndName, TriState.Unknown);
1479 return true;
1480 }
1481 }
1482 else
1483 {
1485 switch (qilNode.NodeType)
1486 {
1487 case QilNodeType.Ancestor:
1488 case QilNodeType.AncestorOrSelf:
1489 CreateFilteredIterator(ndCtxt, "$$$iterAnc", typeof(AncestorDocOrderIterator), XmlILMethods.AncDOCreate, XmlILMethods.AncDONext, XmlILMethods.AncDOCurrent, kinds, ndName, (qilNode.NodeType != QilNodeType.Ancestor) ? TriState.True : TriState.False, null);
1490 return true;
1491 case QilNodeType.PrecedingSibling:
1492 CreateFilteredIterator(ndCtxt, "$$$iterPreSib", typeof(PrecedingSiblingDocOrderIterator), XmlILMethods.PreSibDOCreate, XmlILMethods.PreSibDONext, XmlILMethods.PreSibDOCurrent, kinds, ndName, TriState.Unknown, null);
1493 return true;
1494 case QilNodeType.XPathPreceding:
1495 CreateFilteredIterator(ndCtxt, "$$$iterPrec", typeof(XPathPrecedingDocOrderIterator), XmlILMethods.XPPrecDOCreate, XmlILMethods.XPPrecDONext, XmlILMethods.XPPrecDOCurrent, kinds, ndName, TriState.Unknown, null);
1496 return true;
1497 }
1498 }
1499 }
1500 else if (optimizerPatterns.MatchesPattern(OptimizerPatternName.DodMerge))
1501 {
1506 _helper.Call(XmlILMethods.DodMergeCreate);
1509 Visit(ndDod.Child);
1511 _helper.Call(XmlILMethods.DodMergeAdd);
1514 EndNestedIterator(ndDod.Child);
1515 _helper.Call(XmlILMethods.DodMergeSeq);
1516 _iterCurr.Storage = StorageDescriptor.Stack(typeof(XPathNavigator), isCached: true);
1517 return true;
1518 }
1519 return false;
1520 }
static readonly OpCode Ldloca
Definition OpCodes.cs:427
LocalBuilder DeclareLocal(string name, Type type)
void CreateContainerIterator(QilUnary ndDod, string iterName, Type iterType, MethodInfo methCreate, MethodInfo methNext, MethodInfo methCurrent, XmlNodeKindFlags kinds, QilName ndName, TriState orSelf)
void CreateFilteredIterator(QilNode ndCtxt, string iterName, Type iterType, MethodInfo methCreate, MethodInfo methNext, MethodInfo methCurrent, XmlNodeKindFlags kinds, QilName ndName, TriState orSelf, QilNode ndEnd)
void Visit(QilExpression qil, GenerateHelper helper, MethodInfo methRoot)

References System.Xml.Xsl.IlGen.XmlILVisitor._helper, System.Xml.Xsl.IlGen.XmlILVisitor._iterCurr, System.Xml.Xsl.IlGen.XmlILMethods.AncDOCreate, System.Xml.Xsl.IlGen.XmlILMethods.AncDOCurrent, System.Xml.Xsl.IlGen.XmlILMethods.AncDONext, System.Xml.Xsl.IlGen.GenerateHelper.Call(), System.Xml.Xsl.IlGen.XmlILMethods.ContentMergeCreate, System.Xml.Xsl.IlGen.XmlILMethods.ContentMergeCurrent, System.Xml.Xsl.IlGen.XmlILMethods.ContentMergeNext, System.Xml.Xsl.IlGen.XmlILVisitor.CreateContainerIterator(), System.Xml.Xsl.IlGen.XmlILVisitor.CreateFilteredIterator(), System.Xml.Xsl.IlGen.GenerateHelper.DeclareLocal(), System.Xml.Xsl.IlGen.GenerateHelper.DefineLabel(), System.Xml.Xsl.IlGen.XmlILMethods.DescMergeCreate, System.Xml.Xsl.IlGen.XmlILMethods.DescMergeCurrent, System.Xml.Xsl.IlGen.XmlILMethods.DescMergeNext, System.Xml.Dictionary, System.Xml.Xsl.IlGen.XmlILMethods.DodMergeAdd, System.Xml.Xsl.IlGen.XmlILMethods.DodMergeCreate, System.Xml.Xsl.IlGen.XmlILMethods.DodMergeSeq, System.Xml.Xsl.IlGen.GenerateHelper.Emit(), System.Xml.Xsl.IlGen.XmlILVisitor.EndNestedIterator(), System.Xml.Xsl.IlGen.IteratorDescriptor.EnsureStack(), System.Xml.Xsl.IlGen.XmlILMethods.FollSibMergeCreate, System.Xml.Xsl.IlGen.XmlILMethods.FollSibMergeCurrent, System.Xml.Xsl.IlGen.XmlILMethods.FollSibMergeNext, System.Reflection.Emit.OpCodes.Ldloca, System.Xml.Xsl.IlGen.GenerateHelper.LoadQueryRuntime(), System.Xml.Xsl.IlGen.IteratorDescriptor.LoopToEnd(), System.Xml.Xsl.IlGen.XmlILMethods.PreSibDOCreate, System.Xml.Xsl.IlGen.XmlILMethods.PreSibDOCurrent, System.Xml.Xsl.IlGen.XmlILMethods.PreSibDONext, System.Xml.Xsl.IlGen.OptimizerPatterns.Read(), System.Xml.Xsl.IlGen.StorageDescriptor.Stack(), System.Xml.Xsl.IlGen.XmlILVisitor.StartNestedIterator(), System.Xml.Xsl.IlGen.XmlILVisitor.Visit(), System.Xml.Xsl.IlGen.XmlILMethods.XPFollMergeCreate, System.Xml.Xsl.IlGen.XmlILMethods.XPFollMergeCurrent, System.Xml.Xsl.IlGen.XmlILMethods.XPFollMergeNext, System.Xml.Xsl.IlGen.XmlILMethods.XPPrecDOCreate, System.Xml.Xsl.IlGen.XmlILMethods.XPPrecDOCurrent, System.Xml.Xsl.IlGen.XmlILMethods.XPPrecDONext, System.Xml.Xsl.IlGen.XmlILMethods.XPPrecMergeCreate, System.Xml.Xsl.IlGen.XmlILMethods.XPPrecMergeCurrent, and System.Xml.Xsl.IlGen.XmlILMethods.XPPrecMergeNext.

Referenced by System.Xml.Xsl.IlGen.XmlILVisitor.VisitDocOrderDistinct().