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

◆ HandleFilterPatterns()

bool System.Xml.Xsl.IlGen.XmlILVisitor.HandleFilterPatterns ( QilLoop ndFilter)
inlineprivate

Definition at line 1124 of file XmlILVisitor.cs.

1125 {
1126 OptimizerPatterns optimizerPatterns = OptimizerPatterns.Read(ndFilter);
1127 bool flag = optimizerPatterns.MatchesPattern(OptimizerPatternName.FilterElements);
1128 if (flag || optimizerPatterns.MatchesPattern(OptimizerPatternName.FilterContentKind))
1129 {
1130 XmlNodeKindFlags xmlNodeKindFlags;
1132 if (flag)
1133 {
1134 xmlNodeKindFlags = XmlNodeKindFlags.Element;
1135 qilName = (QilName)optimizerPatterns.GetArgument(OptimizerPatternArgument.ElementQName);
1136 }
1137 else
1138 {
1139 xmlNodeKindFlags = ((XmlQueryType)optimizerPatterns.GetArgument(OptimizerPatternArgument.ElementQName)).NodeKinds;
1140 qilName = null;
1141 }
1144 switch (qilNode.NodeType)
1145 {
1146 case QilNodeType.Content:
1147 if (flag)
1148 {
1154 _helper.Call(XmlILMethods.ElemContentCreate);
1155 GenerateSimpleIterator(typeof(XPathNavigator), localBuilder, XmlILMethods.ElemContentNext, XmlILMethods.ElemContentCurrent);
1156 }
1157 else if (xmlNodeKindFlags == XmlNodeKindFlags.Content)
1158 {
1159 CreateSimpleIterator(qilNode2, "$$$iterContent", typeof(ContentIterator), XmlILMethods.ContentCreate, XmlILMethods.ContentNext, XmlILMethods.ContentCurrent);
1160 }
1161 else
1162 {
1167 _helper.Call(XmlILMethods.KindContentCreate);
1168 GenerateSimpleIterator(typeof(XPathNavigator), localBuilder, XmlILMethods.KindContentNext, XmlILMethods.KindContentCurrent);
1169 }
1170 return true;
1171 case QilNodeType.Parent:
1172 CreateFilteredIterator(qilNode2, "$$$iterPar", typeof(ParentIterator), XmlILMethods.ParentCreate, XmlILMethods.ParentNext, XmlILMethods.ParentCurrent, xmlNodeKindFlags, qilName, TriState.Unknown, null);
1173 return true;
1174 case QilNodeType.Ancestor:
1175 case QilNodeType.AncestorOrSelf:
1176 CreateFilteredIterator(qilNode2, "$$$iterAnc", typeof(AncestorIterator), XmlILMethods.AncCreate, XmlILMethods.AncNext, XmlILMethods.AncCurrent, xmlNodeKindFlags, qilName, (qilNode.NodeType != QilNodeType.Ancestor) ? TriState.True : TriState.False, null);
1177 return true;
1178 case QilNodeType.Descendant:
1179 case QilNodeType.DescendantOrSelf:
1180 CreateFilteredIterator(qilNode2, "$$$iterDesc", typeof(DescendantIterator), XmlILMethods.DescCreate, XmlILMethods.DescNext, XmlILMethods.DescCurrent, xmlNodeKindFlags, qilName, (qilNode.NodeType != QilNodeType.Descendant) ? TriState.True : TriState.False, null);
1181 return true;
1182 case QilNodeType.Preceding:
1183 CreateFilteredIterator(qilNode2, "$$$iterPrec", typeof(PrecedingIterator), XmlILMethods.PrecCreate, XmlILMethods.PrecNext, XmlILMethods.PrecCurrent, xmlNodeKindFlags, qilName, TriState.Unknown, null);
1184 return true;
1185 case QilNodeType.FollowingSibling:
1186 CreateFilteredIterator(qilNode2, "$$$iterFollSib", typeof(FollowingSiblingIterator), XmlILMethods.FollSibCreate, XmlILMethods.FollSibNext, XmlILMethods.FollSibCurrent, xmlNodeKindFlags, qilName, TriState.Unknown, null);
1187 return true;
1188 case QilNodeType.PrecedingSibling:
1189 CreateFilteredIterator(qilNode2, "$$$iterPreSib", typeof(PrecedingSiblingIterator), XmlILMethods.PreSibCreate, XmlILMethods.PreSibNext, XmlILMethods.PreSibCurrent, xmlNodeKindFlags, qilName, TriState.Unknown, null);
1190 return true;
1191 case QilNodeType.NodeRange:
1192 CreateFilteredIterator(qilNode2, "$$$iterRange", typeof(NodeRangeIterator), XmlILMethods.NodeRangeCreate, XmlILMethods.NodeRangeNext, XmlILMethods.NodeRangeCurrent, xmlNodeKindFlags, qilName, TriState.Unknown, ((QilBinary)qilNode).Right);
1193 return true;
1194 case QilNodeType.XPathFollowing:
1195 CreateFilteredIterator(qilNode2, "$$$iterFoll", typeof(XPathFollowingIterator), XmlILMethods.XPFollCreate, XmlILMethods.XPFollNext, XmlILMethods.XPFollCurrent, xmlNodeKindFlags, qilName, TriState.Unknown, null);
1196 return true;
1197 case QilNodeType.XPathPreceding:
1198 CreateFilteredIterator(qilNode2, "$$$iterPrec", typeof(XPathPrecedingIterator), XmlILMethods.XPPrecCreate, XmlILMethods.XPPrecNext, XmlILMethods.XPPrecCurrent, xmlNodeKindFlags, qilName, TriState.Unknown, null);
1199 return true;
1200 }
1201 }
1202 else
1203 {
1204 if (optimizerPatterns.MatchesPattern(OptimizerPatternName.FilterAttributeKind))
1205 {
1207 CreateSimpleIterator(qilNode2, "$$$iterAttr", typeof(AttributeIterator), XmlILMethods.AttrCreate, XmlILMethods.AttrNext, XmlILMethods.AttrCurrent);
1208 return true;
1209 }
1210 if (optimizerPatterns.MatchesPattern(OptimizerPatternName.EqualityIndex))
1211 {
1221 _helper.Call(XmlILMethods.FindIndex);
1229 Visit(n);
1234 _helper.Call(XmlILMethods.IndexAdd);
1239 _helper.Call(XmlILMethods.AddNewIndex);
1243 _helper.Call(XmlILMethods.IndexLookup);
1244 _iterCurr.Storage = StorageDescriptor.Stack(typeof(XPathNavigator), isCached: true);
1245 _indexId++;
1246 return true;
1247 }
1248 }
1249 return false;
1250 }
static readonly OpCode Ldloca
Definition OpCodes.cs:427
static readonly OpCode Ldarg_2
Definition OpCodes.cs:13
static readonly OpCode Brtrue
Definition OpCodes.cs:119
static readonly OpCode Ldarg_1
Definition OpCodes.cs:11
static readonly OpCode Ldloc
Definition OpCodes.cs:425
LocalBuilder DeclareLocal(string name, Type type)
void EnsureItemStorageType(XmlQueryType xmlType, Type storageTypeDest)
void EndBinding(QilIterator ndIter)
XPathNodeType QilXmlToXPathNodeType(XmlNodeKindFlags xmlTypes)
override QilNode VisitFor(QilIterator ndFor)
void StartBinding(QilIterator ndIter)
void CreateFilteredIterator(QilNode ndCtxt, string iterName, Type iterType, MethodInfo methCreate, MethodInfo methNext, MethodInfo methCurrent, XmlNodeKindFlags kinds, QilName ndName, TriState orSelf, QilNode ndEnd)
void CreateSimpleIterator(QilNode ndCtxt, string iterName, Type iterType, MethodInfo methCreate, MethodInfo methNext, MethodInfo methCurrent)
void Visit(QilExpression qil, GenerateHelper helper, MethodInfo methRoot)
void GenerateSimpleIterator(Type itemStorageType, LocalBuilder locIter, MethodInfo methNext, MethodInfo methCurrent)

References System.Xml.Xsl.IlGen.XmlILVisitor._helper, System.Xml.Xsl.IlGen.XmlILVisitor._indexId, System.Xml.Xsl.IlGen.XmlILVisitor._iterCurr, System.Xml.Xsl.IlGen.XmlILMethods.AddNewIndex, System.Xml.Xsl.IlGen.XmlILMethods.AncCreate, System.Xml.Xsl.IlGen.XmlILMethods.AncCurrent, System.Xml.Xsl.IlGen.XmlILMethods.AncNext, System.Xml.Xsl.IlGen.XmlILMethods.AttrCreate, System.Xml.Xsl.IlGen.XmlILMethods.AttrCurrent, System.Xml.Xsl.IlGen.XmlILMethods.AttrNext, System.Reflection.Emit.OpCodes.Brtrue, System.Xml.Xsl.IlGen.GenerateHelper.Call(), System.Xml.Xsl.IlGen.GenerateHelper.CallGetAtomizedName(), System.Xml.Xsl.IlGen.XmlILMethods.ContentCreate, System.Xml.Xsl.IlGen.XmlILMethods.ContentCurrent, System.Xml.Xsl.IlGen.XmlILMethods.ContentNext, System.Xml.Xsl.IlGen.XmlILVisitor.CreateFilteredIterator(), System.Xml.Xsl.IlGen.XmlILVisitor.CreateSimpleIterator(), System.Xml.Xsl.IlGen.GenerateHelper.DeclareLocal(), System.Xml.Xsl.IlGen.StaticDataManager.DeclareName(), System.Xml.Xsl.IlGen.GenerateHelper.DefineLabel(), System.Xml.Xsl.IlGen.XmlILMethods.DescCreate, System.Xml.Xsl.IlGen.XmlILMethods.DescCurrent, System.Xml.Xsl.IlGen.XmlILMethods.DescNext, System.Xml.Dictionary, System.Xml.Xsl.IlGen.XmlILMethods.ElemContentCreate, System.Xml.Xsl.IlGen.XmlILMethods.ElemContentCurrent, System.Xml.Xsl.IlGen.XmlILMethods.ElemContentNext, System.Xml.Xsl.IlGen.GenerateHelper.Emit(), System.Xml.Xsl.IlGen.XmlILVisitor.EndBinding(), System.Xml.Xsl.IlGen.XmlILVisitor.EndNestedIterator(), System.Xml.Xsl.IlGen.IteratorDescriptor.EnsureItemStorageType(), System.Xml.Xsl.IlGen.IteratorDescriptor.EnsureStackNoCache(), System.Xml.Xsl.IlGen.XmlILMethods.FindIndex, System.Xml.Xsl.IlGen.XmlILMethods.FollSibCreate, System.Xml.Xsl.IlGen.XmlILMethods.FollSibCurrent, System.Xml.Xsl.IlGen.XmlILMethods.FollSibNext, System.Xml.Xsl.IlGen.XmlILVisitor.GenerateSimpleIterator(), System.Xml.Xsl.IlGen.XmlILMethods.IndexAdd, System.Xml.Xsl.IlGen.XmlILMethods.IndexLookup, System.Xml.Xsl.IlGen.XmlILMethods.KindContentCreate, System.Xml.Xsl.IlGen.XmlILMethods.KindContentCurrent, System.Xml.Xsl.IlGen.XmlILMethods.KindContentNext, System.Reflection.Emit.OpCodes.Ldarg_1, System.Reflection.Emit.OpCodes.Ldarg_2, System.Reflection.Emit.OpCodes.Ldloc, System.Reflection.Emit.OpCodes.Ldloca, System.Xml.Xsl.IlGen.GenerateHelper.LoadInteger(), System.Xml.Xsl.IlGen.GenerateHelper.LoadQueryRuntime(), System.Xml.Xsl.IlGen.IteratorDescriptor.LoopToEnd(), System.Xml.Xsl.IlGen.GenerateHelper.MarkLabel(), System.Xml.Xsl.IlGen.XmlILVisitor.NestedVisitEnsureStack(), System.Xml.Xsl.IlGen.XmlILMethods.NodeRangeCreate, System.Xml.Xsl.IlGen.XmlILMethods.NodeRangeCurrent, System.Xml.Xsl.IlGen.XmlILMethods.NodeRangeNext, System.Xml.Xsl.IlGen.XmlILMethods.ParentCreate, System.Xml.Xsl.IlGen.XmlILMethods.ParentCurrent, System.Xml.Xsl.IlGen.XmlILMethods.ParentNext, System.Xml.Xsl.IlGen.XmlILMethods.PrecCreate, System.Xml.Xsl.IlGen.XmlILMethods.PrecCurrent, System.Xml.Xsl.IlGen.XmlILMethods.PrecNext, System.Xml.Xsl.IlGen.XmlILMethods.PreSibCreate, System.Xml.Xsl.IlGen.XmlILMethods.PreSibCurrent, System.Xml.Xsl.IlGen.XmlILMethods.PreSibNext, System.Xml.Xsl.IlGen.XmlILVisitor.QilXmlToXPathNodeType(), System.Xml.Xsl.IlGen.OptimizerPatterns.Read(), System.Xml.Xsl.IlGen.StorageDescriptor.Stack(), System.Xml.Xsl.IlGen.XmlILVisitor.StartBinding(), System.Xml.Xsl.IlGen.XmlILVisitor.StartNestedIterator(), System.Xml.Xsl.IlGen.GenerateHelper.StaticData, System.Xml.Xsl.IlGen.XmlILVisitor.Visit(), System.Xml.Xsl.IlGen.XmlILVisitor.VisitFor(), System.Xml.Xsl.IlGen.XmlILMethods.XPFollCreate, System.Xml.Xsl.IlGen.XmlILMethods.XPFollCurrent, System.Xml.Xsl.IlGen.XmlILMethods.XPFollNext, System.Xml.Xsl.IlGen.XmlILMethods.XPPrecCreate, System.Xml.Xsl.IlGen.XmlILMethods.XPPrecCurrent, and System.Xml.Xsl.IlGen.XmlILMethods.XPPrecNext.

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