Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / fx / src / XmlUtils / System / Xml / Xsl / IlGen / OptimizerPatterns.cs / 1 / OptimizerPatterns.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- using System; using System.Diagnostics; using System.Xml.Xsl.Qil; namespace System.Xml.Xsl.IlGen { internal enum OptimizerPatternName { None, DodReverse, // (Dod $reverse-axis:*) EqualityIndex, // ILGen will build an equality index when this pattern is recognized FilterAttributeKind, // (Filter $iter:(Content *) (IsType $iter Attribute)) FilterContentKind, // (Filter $iter:* (IsType $iter $kind:*)) FilterElements, // (Filter $iter:* (And (IsType $iter Element) (NameOf $iter (LiteralQName * * *)))) IsDocOrderDistinct, // True if the annotated expression always returns nodes in document order, with no duplicates IsPositional, // True if the annotated iterator should track current position during iteration JoinAndDod, // (Dod (Loop $path1:* $path2:*)), where $path2.ContextNode = $path1 MaxPosition, // True if the position range of the annoted iterator or length expression has a maximum SameDepth, // True if the annotated expression always returns nodes at the same depth in the tree Step, // True if the annotated expression returns nodes from one of the simple axis operators, or from a union of Content operators SingleTextRtf, // (RtfCtor (TextCtor *) *) Axis, // (AnyAxis *) MaybeSideEffects, // True if annotated expression might have side effects TailCall, // (Invoke * *) True if invocation can be compiled as using .tailcall DodMerge, // (Dod (Loop * (Invoke * *))), where invoked function returns nodes in document order } internal enum OptimizerPatternArgument { StepNode = 0, // Step, QilNode: The QilNode of the inner step expression (Content, DescendantOrSelf, XPathFollowing, Union, etc.) StepInput = 1, // Step, QilNode: The expression from which navigation begins ElementQName = 2, // FilterElements, QilLiteral: All but elements of this QName are filtered by FilterElements expression KindTestType = 2, // FilterContentKind, XmlType: All but nodes of this XmlType are filtered by FilterContentKind expression IndexedNodes = 0, // EqualityIndex, QilNode: Expression that returns the nodes to be indexed KeyExpression = 1, // EqualityIndex, QilNode: Expression that returns the keys for the index DodStep = 2, // JoinAndDod | DodReverse, QilNode: Last step in a JoinAndDod expression, or only step in DodReverse expression MaxPosition = 2, // MaxPosition, int: Maximum position of the annotated iterator or length expression RtfText = 2, // SingleTextRtf, QilNode: Expression that constructs the text of the simple text Rtf } ////// As the Qil graph is traversed, patterns are identified. Subtrees that match these patterns are /// annotated with this class, which identifies the matching patterns and their arguments. /// internal class OptimizerPatterns : IQilAnnotation { private static readonly int PatternCount = Enum.GetValues(typeof(OptimizerPatternName)).Length; private int patterns; // Set of patterns that the annotated Qil node and its subtree matches private bool isReadOnly; // True if setters are disabled in the case of singleton OptimizerPatterns private object arg0, arg1, arg2; // Arguments to the matching patterns private static OptimizerPatterns ZeroOrOneDefault; private static OptimizerPatterns MaybeManyDefault; private static OptimizerPatterns DodDefault; ////// Get OptimizerPatterns annotation for the specified node. Lazily create if necessary. /// public static OptimizerPatterns Read(QilNode nd) { XmlILAnnotation ann = nd.Annotation as XmlILAnnotation; OptimizerPatterns optPatt = (ann != null) ? ann.Patterns : null; if (optPatt == null) { if (!nd.XmlType.MaybeMany) { // Expressions with ZeroOrOne cardinality should always report IsDocOrderDistinct and NoContainedNodes if (ZeroOrOneDefault == null) { optPatt = new OptimizerPatterns(); optPatt.AddPattern(OptimizerPatternName.IsDocOrderDistinct); optPatt.AddPattern(OptimizerPatternName.SameDepth); optPatt.isReadOnly = true; ZeroOrOneDefault = optPatt; } else { optPatt = ZeroOrOneDefault; } } else if (nd.XmlType.IsDod) { if (DodDefault == null) { optPatt = new OptimizerPatterns(); optPatt.AddPattern(OptimizerPatternName.IsDocOrderDistinct); optPatt.isReadOnly = true; DodDefault = optPatt; } else { optPatt = DodDefault; } } else { if (MaybeManyDefault == null) { optPatt = new OptimizerPatterns(); optPatt.isReadOnly = true; MaybeManyDefault = optPatt; } else { optPatt = MaybeManyDefault; } } } return optPatt; } ////// Create and initialize OptimizerPatterns annotation for the specified node. /// public static OptimizerPatterns Write(QilNode nd) { XmlILAnnotation ann = XmlILAnnotation.Write(nd); OptimizerPatterns optPatt = ann.Patterns; if (optPatt == null || optPatt.isReadOnly) { optPatt = new OptimizerPatterns(); ann.Patterns = optPatt; if (!nd.XmlType.MaybeMany) { optPatt.AddPattern(OptimizerPatternName.IsDocOrderDistinct); optPatt.AddPattern(OptimizerPatternName.SameDepth); } else if (nd.XmlType.IsDod) { optPatt.AddPattern(OptimizerPatternName.IsDocOrderDistinct); } } return optPatt; } ////// Create and initialize OptimizerPatterns annotation for the specified node. /// public static void Inherit(QilNode ndSrc, QilNode ndDst, OptimizerPatternName pattern) { OptimizerPatterns annSrc = OptimizerPatterns.Read(ndSrc); if (annSrc.MatchesPattern(pattern)) { OptimizerPatterns annDst = OptimizerPatterns.Write(ndDst); annDst.AddPattern(pattern); // Inherit pattern arguments switch (pattern) { case OptimizerPatternName.Step: annDst.AddArgument(OptimizerPatternArgument.StepNode, annSrc.GetArgument(OptimizerPatternArgument.StepNode)); annDst.AddArgument(OptimizerPatternArgument.StepInput, annSrc.GetArgument(OptimizerPatternArgument.StepInput)); break; case OptimizerPatternName.FilterElements: annDst.AddArgument(OptimizerPatternArgument.ElementQName, annSrc.GetArgument(OptimizerPatternArgument.ElementQName)); break; case OptimizerPatternName.FilterContentKind: annDst.AddArgument(OptimizerPatternArgument.KindTestType, annSrc.GetArgument(OptimizerPatternArgument.KindTestType)); break; case OptimizerPatternName.EqualityIndex: annDst.AddArgument(OptimizerPatternArgument.IndexedNodes, annSrc.GetArgument(OptimizerPatternArgument.IndexedNodes)); annDst.AddArgument(OptimizerPatternArgument.KeyExpression, annSrc.GetArgument(OptimizerPatternArgument.KeyExpression)); break; case OptimizerPatternName.DodReverse: case OptimizerPatternName.JoinAndDod: annDst.AddArgument(OptimizerPatternArgument.DodStep, annSrc.GetArgument(OptimizerPatternArgument.DodStep)); break; case OptimizerPatternName.MaxPosition: annDst.AddArgument(OptimizerPatternArgument.MaxPosition, annSrc.GetArgument(OptimizerPatternArgument.MaxPosition)); break; case OptimizerPatternName.SingleTextRtf: annDst.AddArgument(OptimizerPatternArgument.RtfText, annSrc.GetArgument(OptimizerPatternArgument.RtfText)); break; } } } ////// Add an argument to one of the matching patterns. /// public void AddArgument(OptimizerPatternArgument argId, object arg) { Debug.Assert(!this.isReadOnly, "This OptimizerPatterns instance is read-only."); switch ((int) argId) { case 0: this.arg0 = arg; break; case 1: this.arg1 = arg; break; case 2: this.arg2 = arg; break; default: Debug.Assert(false, "Cannot handle more than 2 arguments."); break; } } ////// Get an argument of one of the matching patterns. /// public object GetArgument(OptimizerPatternArgument argNum) { object arg = null; switch ((int) argNum) { case 0: arg = this.arg0; break; case 1: arg = this.arg1; break; case 2: arg = this.arg2; break; } Debug.Assert(arg != null, "There is no '" + argNum + "' argument."); return arg; } ////// Add a pattern to the list of patterns that the annotated node matches. /// public void AddPattern(OptimizerPatternName pattern) { Debug.Assert(Enum.IsDefined(typeof(OptimizerPatternName), pattern)); Debug.Assert((int) pattern < 32); Debug.Assert(!this.isReadOnly, "This OptimizerPatterns instance is read-only."); this.patterns |= (1 << (int) pattern); } ////// Return true if the annotated node matches the specified pattern. /// public bool MatchesPattern(OptimizerPatternName pattern) { Debug.Assert(Enum.IsDefined(typeof(OptimizerPatternName), pattern)); return (this.patterns & (1 << (int) pattern)) != 0; } ////// Return name of this annotation. /// public virtual string Name { get { return "Patterns"; } } ////// Return string representation of this annotation. /// public override string ToString() { string s = ""; for (int pattNum = 0; pattNum < PatternCount; pattNum++) { if (MatchesPattern((OptimizerPatternName) pattNum)) { if (s.Length != 0) s += ", "; s += ((OptimizerPatternName) pattNum).ToString(); } } return s; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- using System; using System.Diagnostics; using System.Xml.Xsl.Qil; namespace System.Xml.Xsl.IlGen { internal enum OptimizerPatternName { None, DodReverse, // (Dod $reverse-axis:*) EqualityIndex, // ILGen will build an equality index when this pattern is recognized FilterAttributeKind, // (Filter $iter:(Content *) (IsType $iter Attribute)) FilterContentKind, // (Filter $iter:* (IsType $iter $kind:*)) FilterElements, // (Filter $iter:* (And (IsType $iter Element) (NameOf $iter (LiteralQName * * *)))) IsDocOrderDistinct, // True if the annotated expression always returns nodes in document order, with no duplicates IsPositional, // True if the annotated iterator should track current position during iteration JoinAndDod, // (Dod (Loop $path1:* $path2:*)), where $path2.ContextNode = $path1 MaxPosition, // True if the position range of the annoted iterator or length expression has a maximum SameDepth, // True if the annotated expression always returns nodes at the same depth in the tree Step, // True if the annotated expression returns nodes from one of the simple axis operators, or from a union of Content operators SingleTextRtf, // (RtfCtor (TextCtor *) *) Axis, // (AnyAxis *) MaybeSideEffects, // True if annotated expression might have side effects TailCall, // (Invoke * *) True if invocation can be compiled as using .tailcall DodMerge, // (Dod (Loop * (Invoke * *))), where invoked function returns nodes in document order } internal enum OptimizerPatternArgument { StepNode = 0, // Step, QilNode: The QilNode of the inner step expression (Content, DescendantOrSelf, XPathFollowing, Union, etc.) StepInput = 1, // Step, QilNode: The expression from which navigation begins ElementQName = 2, // FilterElements, QilLiteral: All but elements of this QName are filtered by FilterElements expression KindTestType = 2, // FilterContentKind, XmlType: All but nodes of this XmlType are filtered by FilterContentKind expression IndexedNodes = 0, // EqualityIndex, QilNode: Expression that returns the nodes to be indexed KeyExpression = 1, // EqualityIndex, QilNode: Expression that returns the keys for the index DodStep = 2, // JoinAndDod | DodReverse, QilNode: Last step in a JoinAndDod expression, or only step in DodReverse expression MaxPosition = 2, // MaxPosition, int: Maximum position of the annotated iterator or length expression RtfText = 2, // SingleTextRtf, QilNode: Expression that constructs the text of the simple text Rtf } ////// As the Qil graph is traversed, patterns are identified. Subtrees that match these patterns are /// annotated with this class, which identifies the matching patterns and their arguments. /// internal class OptimizerPatterns : IQilAnnotation { private static readonly int PatternCount = Enum.GetValues(typeof(OptimizerPatternName)).Length; private int patterns; // Set of patterns that the annotated Qil node and its subtree matches private bool isReadOnly; // True if setters are disabled in the case of singleton OptimizerPatterns private object arg0, arg1, arg2; // Arguments to the matching patterns private static OptimizerPatterns ZeroOrOneDefault; private static OptimizerPatterns MaybeManyDefault; private static OptimizerPatterns DodDefault; ////// Get OptimizerPatterns annotation for the specified node. Lazily create if necessary. /// public static OptimizerPatterns Read(QilNode nd) { XmlILAnnotation ann = nd.Annotation as XmlILAnnotation; OptimizerPatterns optPatt = (ann != null) ? ann.Patterns : null; if (optPatt == null) { if (!nd.XmlType.MaybeMany) { // Expressions with ZeroOrOne cardinality should always report IsDocOrderDistinct and NoContainedNodes if (ZeroOrOneDefault == null) { optPatt = new OptimizerPatterns(); optPatt.AddPattern(OptimizerPatternName.IsDocOrderDistinct); optPatt.AddPattern(OptimizerPatternName.SameDepth); optPatt.isReadOnly = true; ZeroOrOneDefault = optPatt; } else { optPatt = ZeroOrOneDefault; } } else if (nd.XmlType.IsDod) { if (DodDefault == null) { optPatt = new OptimizerPatterns(); optPatt.AddPattern(OptimizerPatternName.IsDocOrderDistinct); optPatt.isReadOnly = true; DodDefault = optPatt; } else { optPatt = DodDefault; } } else { if (MaybeManyDefault == null) { optPatt = new OptimizerPatterns(); optPatt.isReadOnly = true; MaybeManyDefault = optPatt; } else { optPatt = MaybeManyDefault; } } } return optPatt; } ////// Create and initialize OptimizerPatterns annotation for the specified node. /// public static OptimizerPatterns Write(QilNode nd) { XmlILAnnotation ann = XmlILAnnotation.Write(nd); OptimizerPatterns optPatt = ann.Patterns; if (optPatt == null || optPatt.isReadOnly) { optPatt = new OptimizerPatterns(); ann.Patterns = optPatt; if (!nd.XmlType.MaybeMany) { optPatt.AddPattern(OptimizerPatternName.IsDocOrderDistinct); optPatt.AddPattern(OptimizerPatternName.SameDepth); } else if (nd.XmlType.IsDod) { optPatt.AddPattern(OptimizerPatternName.IsDocOrderDistinct); } } return optPatt; } ////// Create and initialize OptimizerPatterns annotation for the specified node. /// public static void Inherit(QilNode ndSrc, QilNode ndDst, OptimizerPatternName pattern) { OptimizerPatterns annSrc = OptimizerPatterns.Read(ndSrc); if (annSrc.MatchesPattern(pattern)) { OptimizerPatterns annDst = OptimizerPatterns.Write(ndDst); annDst.AddPattern(pattern); // Inherit pattern arguments switch (pattern) { case OptimizerPatternName.Step: annDst.AddArgument(OptimizerPatternArgument.StepNode, annSrc.GetArgument(OptimizerPatternArgument.StepNode)); annDst.AddArgument(OptimizerPatternArgument.StepInput, annSrc.GetArgument(OptimizerPatternArgument.StepInput)); break; case OptimizerPatternName.FilterElements: annDst.AddArgument(OptimizerPatternArgument.ElementQName, annSrc.GetArgument(OptimizerPatternArgument.ElementQName)); break; case OptimizerPatternName.FilterContentKind: annDst.AddArgument(OptimizerPatternArgument.KindTestType, annSrc.GetArgument(OptimizerPatternArgument.KindTestType)); break; case OptimizerPatternName.EqualityIndex: annDst.AddArgument(OptimizerPatternArgument.IndexedNodes, annSrc.GetArgument(OptimizerPatternArgument.IndexedNodes)); annDst.AddArgument(OptimizerPatternArgument.KeyExpression, annSrc.GetArgument(OptimizerPatternArgument.KeyExpression)); break; case OptimizerPatternName.DodReverse: case OptimizerPatternName.JoinAndDod: annDst.AddArgument(OptimizerPatternArgument.DodStep, annSrc.GetArgument(OptimizerPatternArgument.DodStep)); break; case OptimizerPatternName.MaxPosition: annDst.AddArgument(OptimizerPatternArgument.MaxPosition, annSrc.GetArgument(OptimizerPatternArgument.MaxPosition)); break; case OptimizerPatternName.SingleTextRtf: annDst.AddArgument(OptimizerPatternArgument.RtfText, annSrc.GetArgument(OptimizerPatternArgument.RtfText)); break; } } } ////// Add an argument to one of the matching patterns. /// public void AddArgument(OptimizerPatternArgument argId, object arg) { Debug.Assert(!this.isReadOnly, "This OptimizerPatterns instance is read-only."); switch ((int) argId) { case 0: this.arg0 = arg; break; case 1: this.arg1 = arg; break; case 2: this.arg2 = arg; break; default: Debug.Assert(false, "Cannot handle more than 2 arguments."); break; } } ////// Get an argument of one of the matching patterns. /// public object GetArgument(OptimizerPatternArgument argNum) { object arg = null; switch ((int) argNum) { case 0: arg = this.arg0; break; case 1: arg = this.arg1; break; case 2: arg = this.arg2; break; } Debug.Assert(arg != null, "There is no '" + argNum + "' argument."); return arg; } ////// Add a pattern to the list of patterns that the annotated node matches. /// public void AddPattern(OptimizerPatternName pattern) { Debug.Assert(Enum.IsDefined(typeof(OptimizerPatternName), pattern)); Debug.Assert((int) pattern < 32); Debug.Assert(!this.isReadOnly, "This OptimizerPatterns instance is read-only."); this.patterns |= (1 << (int) pattern); } ////// Return true if the annotated node matches the specified pattern. /// public bool MatchesPattern(OptimizerPatternName pattern) { Debug.Assert(Enum.IsDefined(typeof(OptimizerPatternName), pattern)); return (this.patterns & (1 << (int) pattern)) != 0; } ////// Return name of this annotation. /// public virtual string Name { get { return "Patterns"; } } ////// Return string representation of this annotation. /// public override string ToString() { string s = ""; for (int pattNum = 0; pattNum < PatternCount; pattNum++) { if (MatchesPattern((OptimizerPatternName) pattNum)) { if (s.Length != 0) s += ", "; s += ((OptimizerPatternName) pattNum).ToString(); } } return s; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- NameValuePermission.cs
- Hashtable.cs
- EncoderParameter.cs
- ToolStripItemRenderEventArgs.cs
- Int16Storage.cs
- CompilationUtil.cs
- QueueProcessor.cs
- WebReference.cs
- Buffer.cs
- StreamInfo.cs
- TableAdapterManagerHelper.cs
- FontStyles.cs
- SafeArrayTypeMismatchException.cs
- MailWriter.cs
- PolyBezierSegment.cs
- CommunicationObjectFaultedException.cs
- NavigationEventArgs.cs
- SystemException.cs
- sitestring.cs
- DataRow.cs
- TargetConverter.cs
- TextLineBreak.cs
- BindingsCollection.cs
- DataSysAttribute.cs
- HwndHostAutomationPeer.cs
- ConfigXmlAttribute.cs
- FormViewRow.cs
- BindingBase.cs
- ObjectDataSourceDisposingEventArgs.cs
- ZipIOExtraFieldZip64Element.cs
- TypeDelegator.cs
- TypeUtil.cs
- Bind.cs
- CharacterHit.cs
- CheckStoreFileValidityRequest.cs
- DynamicResourceExtensionConverter.cs
- TimerEventSubscriptionCollection.cs
- DataGridSortCommandEventArgs.cs
- Int16Storage.cs
- HtmlInputSubmit.cs
- HtmlInputControl.cs
- SecurityChannelListener.cs
- SignatureGenerator.cs
- DbProviderFactoriesConfigurationHandler.cs
- ListViewTableRow.cs
- ReverseInheritProperty.cs
- AppModelKnownContentFactory.cs
- BufferBuilder.cs
- InputManager.cs
- MenuItemAutomationPeer.cs
- CardSpaceException.cs
- OAVariantLib.cs
- WindowsNonControl.cs
- ClientRuntimeConfig.cs
- AttributeProviderAttribute.cs
- ItemsControl.cs
- ParseHttpDate.cs
- InkCanvasSelectionAdorner.cs
- NotFiniteNumberException.cs
- Baml6ConstructorInfo.cs
- RolePrincipal.cs
- VarRemapper.cs
- SocketStream.cs
- Maps.cs
- RecordManager.cs
- mediaeventargs.cs
- ConfigurationManagerHelper.cs
- TabletDevice.cs
- ResizeBehavior.cs
- XmlSortKey.cs
- AccessDataSourceDesigner.cs
- CrossContextChannel.cs
- AssemblyResourceLoader.cs
- ProjectionCamera.cs
- _UncName.cs
- DateTimeSerializationSection.cs
- App.cs
- ComponentDispatcherThread.cs
- CodeIdentifier.cs
- XmlRawWriter.cs
- InstanceValue.cs
- DBDataPermission.cs
- StandardRuntimeEnumValidator.cs
- ScrollPattern.cs
- UrlPath.cs
- Helper.cs
- GroupItemAutomationPeer.cs
- DataGridTemplateColumn.cs
- AddToCollection.cs
- WindowInteractionStateTracker.cs
- UserControlParser.cs
- CodeAccessPermission.cs
- ObjectDisposedException.cs
- CompilerGlobalScopeAttribute.cs
- LateBoundBitmapDecoder.cs
- SqlEnums.cs
- PrintingPermission.cs
- LabelEditEvent.cs
- StyleHelper.cs
- SubtreeProcessor.cs