Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / XmlUtils / System / Xml / Xsl / IlGen / OptimizerPatterns.cs / 1305376 / 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
IsReferenced, // True if the annotated global iterator is referenced at least once
}
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
- DataServiceConfiguration.cs
- ZipIOBlockManager.cs
- PointCollectionValueSerializer.cs
- SmtpSpecifiedPickupDirectoryElement.cs
- UserPersonalizationStateInfo.cs
- URLBuilder.cs
- DispatcherExceptionEventArgs.cs
- SafeWaitHandle.cs
- QilValidationVisitor.cs
- AsyncContentLoadedEventArgs.cs
- EDesignUtil.cs
- DesignBindingEditor.cs
- QuaternionRotation3D.cs
- StandardBindingElementCollection.cs
- FileIOPermission.cs
- PeerValidationBehavior.cs
- Cursors.cs
- ComponentChangedEvent.cs
- CompensatableTransactionScopeActivityDesigner.cs
- TextBoxView.cs
- SocketSettings.cs
- ObjectAssociationEndMapping.cs
- PageAdapter.cs
- IndentTextWriter.cs
- NameScope.cs
- ImmComposition.cs
- ComplexTypeEmitter.cs
- Highlights.cs
- UdpTransportSettings.cs
- FixedPageAutomationPeer.cs
- VirtualPathProvider.cs
- MemberDescriptor.cs
- RegexGroup.cs
- PropertyConverter.cs
- WindowsListViewGroup.cs
- InputLanguage.cs
- _RequestCacheProtocol.cs
- ReturnEventArgs.cs
- XmlIlTypeHelper.cs
- XmlChoiceIdentifierAttribute.cs
- odbcmetadatacollectionnames.cs
- SmiRequestExecutor.cs
- LocatorPart.cs
- DataPagerCommandEventArgs.cs
- ButtonChrome.cs
- ResponseStream.cs
- PeerTransportBindingElement.cs
- LocationUpdates.cs
- CreatingCookieEventArgs.cs
- OrthographicCamera.cs
- SchemaElement.cs
- Utility.cs
- SEHException.cs
- DataSourceGroupCollection.cs
- PreviewPrintController.cs
- CookieHandler.cs
- WCFModelStrings.Designer.cs
- BaseServiceProvider.cs
- VBCodeProvider.cs
- PerfCounterSection.cs
- StylusButtonCollection.cs
- RemotingConfigParser.cs
- EventData.cs
- ManagementPath.cs
- ExclusiveNamedPipeTransportManager.cs
- FileLoadException.cs
- DataGridViewColumnCollection.cs
- SessionPageStateSection.cs
- SQLBoolean.cs
- MultipartContentParser.cs
- XmlSerializerVersionAttribute.cs
- ObjectStateFormatter.cs
- CaseInsensitiveOrdinalStringComparer.cs
- ToolStripTemplateNode.cs
- SqlEnums.cs
- WhiteSpaceTrimStringConverter.cs
- smtppermission.cs
- HtmlFormParameterReader.cs
- ContextDataSourceContextData.cs
- EncoderParameter.cs
- BmpBitmapEncoder.cs
- ListSortDescription.cs
- DecimalStorage.cs
- FixedSOMPage.cs
- SecurityTokenSerializer.cs
- DigestTraceRecordHelper.cs
- EncodingNLS.cs
- DataControlFieldHeaderCell.cs
- UrlAuthorizationModule.cs
- Error.cs
- CollectionViewGroupInternal.cs
- InkPresenter.cs
- FormClosedEvent.cs
- PixelShader.cs
- GradientStop.cs
- ReferenceEqualityComparer.cs
- ConcurrentStack.cs
- XmlComplianceUtil.cs
- CaseStatementSlot.cs
- DataKey.cs