Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Dispatcher / QueryOpcode.cs / 1 / QueryOpcode.cs
//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------- namespace System.ServiceModel.Dispatcher { using System.Diagnostics; using System.ServiceModel.Channels; using System.Collections; using System.Collections.Generic; using System.Threading; internal enum OpcodeID { NoOp, SubExpr, // Flow opcodes Branch, JumpIfNot, Filter, Function, XsltFunction, XsltInternalFunction, Cast, QueryTree, BlockEnd, SubRoutine, // Set Opcodes Ordinal, LiteralOrdinal, Empty, Union, Merge, // Boolean opcodes ApplyBoolean, StartBoolean, EndBoolean, // Relational opcodes Relation, StringEquals, NumberEquals, StringEqualsBranch, NumberEqualsBranch, NumberRelation, NumberInterval, NumberIntervalBranch, // Select/Node Operators Select, InitialSelect, SelectRoot, // Stack operators PushXsltVariable, PushBool, PushString, PushDouble, PushContextNode, PushNodeSequence, PushPosition, PopSequenceToValueStack, PopSequenceToSequenceStack, PopContextNodes, PushContextCopy, PopValueFrame, // Math opcode Plus, Minus, Multiply, Divide, Mod, Negate, // Specialized String operators StringPrefix, StringPrefixBranch, // Results MatchAlways, MatchQueryResult, MatchFilterResult, MatchMultipleFilterResult, MatchSingleFx, MatchMultipleFx } internal enum OpcodeFlags { None = 0x00000000, Single = 0x00000001, Branch = 0x00000002, Result = 0x00000004, Jump = 0x00000008, Literal = 0x00000010, Select = 0x00000020, Deleted = 0x00000040, InConditional = 0x00000080, NoContextCopy = 0x00000100, InitialSelect = 0x00000200, CompressableSelect = 0x00000400, FxMatch = 0x00000800, } internal abstract class Opcode { protected OpcodeFlags flags; protected Opcode next; OpcodeID opcodeID; protected Opcode prev; #if DEBUG // debugging aid. Because C# references do not have displayble numeric values, hard to deduce the // graph structure to see what opcode is connected to what static long nextUniqueId = 0; internal long uniqueID; #endif internal Opcode(OpcodeID id) { this.opcodeID = id; this.flags = OpcodeFlags.Single; #if DEBUG this.uniqueID = Opcode.NextUniqueId(); #endif } internal OpcodeFlags Flags { get { return this.flags; } set { this.flags = value; } } internal OpcodeID ID { get { return this.opcodeID; } } internal Opcode Next { get { return this.next; } set { this.next = value; } } internal Opcode Prev { get { return this.prev; } set { this.prev = value; } } #if DEBUG static long NextUniqueId() { return Interlocked.Increment(ref Opcode.nextUniqueId); } #endif internal virtual void Add(Opcode op) { DiagnosticUtility.DebugAssert(null != op, ""); DiagnosticUtility.DebugAssert(null != this.prev, ""); // Create a branch that will include both this and the new opcode this.prev.AddBranch(op); } internal virtual void AddBranch(Opcode opcode) { DiagnosticUtility.DebugAssert(null != opcode, ""); // Replace what follows this opcode with a branch containing .next and the new opcode // If this opcode is a conditional, then since the tree structure is about to change, conditional // reachability for everything that follows is about to change. // 1. Remove .next from the conditional's AlwaysBranch Table. // 2. Create the new branch structure. // 3. The branch, once in the tree, will fix up all conditional jumps Opcode next = this.next; if (this.TestFlag(OpcodeFlags.InConditional)) { this.DelinkFromConditional(next); } BranchOpcode branch = new BranchOpcode(); this.next = null; this.Attach(branch); if (null != next) { DiagnosticUtility.DebugAssert(OpcodeID.Branch != next.ID, ""); branch.Add(next); } branch.Add(opcode); } internal void Attach(Opcode op) { DiagnosticUtility.DebugAssert(null == this.next, ""); this.next = op; op.prev = this; } internal virtual void CollectXPathFilters(ICollectionfilters) { if(this.next != null) { this.next.CollectXPathFilters(filters); } } internal virtual bool IsEquivalentForAdd(Opcode opcode) { return (this.ID == opcode.ID); } internal virtual void DelinkFromConditional(Opcode child) { DiagnosticUtility.DebugAssert(this.TestFlag(OpcodeFlags.InConditional), ""); if (this.TestFlag(OpcodeFlags.InConditional)) { ((QueryConditionalBranchOpcode) this.prev).RemoveAlwaysBranch(child); } } internal Opcode DetachChild() { Opcode child = this.next; if(child != null) { if (this.IsInConditional()) { this.DelinkFromConditional(child); } } this.next = null; child.prev = null; return child; } internal void DetachFromParent() { Opcode parent = this.prev; if(parent != null) { parent.DetachChild(); } } internal virtual bool Equals(Opcode op) { return (op.ID == this.ID); } internal virtual Opcode Eval(ProcessingContext context) { return this.next; } internal virtual Opcode Eval(NodeSequence sequence, SeekableXPathNavigator node) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperCritical(new QueryProcessingException(QueryProcessingError.Unexpected)); } internal virtual Opcode EvalSpecial(ProcessingContext context) { return this.Eval(context); } internal virtual bool IsInConditional() { return this.TestFlag(OpcodeFlags.InConditional); } internal bool IsReachableFromConditional() { return (null != this.prev && this.prev.IsInConditional()); } internal virtual Opcode Locate(Opcode opcode) { DiagnosticUtility.DebugAssert(null != opcode, ""); if (null != this.next && this.next.Equals(opcode)) { return this.next; } return null; } internal virtual void LinkToConditional(Opcode child) { DiagnosticUtility.DebugAssert(this.TestFlag(OpcodeFlags.InConditional), ""); if (this.TestFlag(OpcodeFlags.InConditional)) { ((QueryConditionalBranchOpcode) this.prev).AddAlwaysBranch(this, child); } } internal virtual void Remove() { if (null == this.next) { Opcode prevOpcode = this.prev; if (null != prevOpcode) { prevOpcode.RemoveChild(this); prevOpcode.Remove(); } } } internal virtual void RemoveChild(Opcode opcode) { DiagnosticUtility.DebugAssert(null != opcode, ""); DiagnosticUtility.DebugAssert(this.next == opcode, ""); if (this.IsInConditional()) { this.DelinkFromConditional(opcode); } opcode.prev = null; this.next = null; opcode.Flags |= OpcodeFlags.Deleted; } internal virtual void Replace(Opcode replace, Opcode with) { DiagnosticUtility.DebugAssert(null != replace && null != with, ""); if (this.next == replace) { bool isConditional = this.IsInConditional(); if (isConditional) { this.DelinkFromConditional(this.next); } this.next.prev = null; this.next = with; with.prev = this; if (isConditional) { this.LinkToConditional(with); } } } internal bool TestFlag(OpcodeFlags flag) { return (0 != (this.flags & flag)); } #if DEBUG_FILTER public override string ToString() { #if DEBUG return string.Format("{0}(#{1})", this.opcodeID.ToString(), this.uniqueID); #else return this.opcodeID.ToString(); #endif } #endif internal virtual void Trim() { if(this.next != null) { this.next.Trim(); } } } internal struct OpcodeBlock { Opcode first; Opcode last; internal OpcodeBlock(Opcode first) { this.first = first; this.first.Prev = null; for(this.last = this.first; this.last.Next != null; this.last = this.last.Next); } #if FILTEROPTIMIZER internal OpcodeBlock(Opcode first, Opcode last) { this.first = first; this.first.Prev = null; this.last = last; this.Last.Next = null; } #endif internal Opcode First { get { return this.first; } } internal Opcode Last { get { return this.last; } } internal void Append(Opcode opcode) { DiagnosticUtility.DebugAssert(null != opcode, ""); if (null == this.last) { this.first = opcode; this.last = opcode; } else { this.last.Attach(opcode); opcode.Next = null; this.last = opcode; } } internal void Append(OpcodeBlock block) { if (null == this.last) { this.first = block.first; this.last = block.last; } else { this.last.Attach(block.first); this.last = block.last; } } internal void DetachLast() { if (null == this.last) { return; } Opcode newLast = this.last.Prev; this.last.Prev = null; this.last = newLast; if (null != this.last) { this.last.Next = null; } } } internal class OpcodeList { QueryBuffer opcodes; public OpcodeList(int capacity) { this.opcodes = new QueryBuffer (capacity); } public int Count { get { return this.opcodes.count; } } public Opcode this[int index] { get { return this.opcodes[index]; } set { this.opcodes[index] = value; } } public void Add(Opcode opcode) { this.opcodes.Add(opcode); } public int IndexOf(Opcode opcode) { return this.opcodes.IndexOf(opcode); } public void Remove(Opcode opcode) { this.opcodes.Remove(opcode); } public void Trim() { this.opcodes.TrimToCount(); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DomNameTable.cs
- Attachment.cs
- DoubleUtil.cs
- ProcessHostServerConfig.cs
- Pen.cs
- VirtualPathProvider.cs
- NullableIntAverageAggregationOperator.cs
- OleDbStruct.cs
- StickyNoteHelper.cs
- HttpWebRequest.cs
- ResourceKey.cs
- SyndicationFeedFormatter.cs
- ApplicationServiceHelper.cs
- tooltip.cs
- XmlMembersMapping.cs
- DesigntimeLicenseContextSerializer.cs
- SessionEndedEventArgs.cs
- RestHandler.cs
- WebServiceResponseDesigner.cs
- COMException.cs
- DodSequenceMerge.cs
- TreeViewAutomationPeer.cs
- SHA256Cng.cs
- HybridDictionary.cs
- EventQueueState.cs
- ContentPlaceHolderDesigner.cs
- httpstaticobjectscollection.cs
- GlobalAllocSafeHandle.cs
- TdsValueSetter.cs
- WebExceptionStatus.cs
- MetadataLocation.cs
- QilLiteral.cs
- PreDigestedSignedInfo.cs
- CharConverter.cs
- ServiceRouteHandler.cs
- EmptyEnumerator.cs
- SecurityChannelFaultConverter.cs
- HttpCookie.cs
- ProxyAttribute.cs
- Reference.cs
- Size.cs
- MaterializeFromAtom.cs
- Inline.cs
- WebChannelFactory.cs
- ConfigurationPropertyAttribute.cs
- ChoiceConverter.cs
- XmlExpressionDumper.cs
- XmlSchemaFacet.cs
- EventSinkHelperWriter.cs
- TreePrinter.cs
- MdiWindowListStrip.cs
- RichTextBox.cs
- SortAction.cs
- UriTemplateMatch.cs
- DesignTimeValidationFeature.cs
- ToolStripMenuItemDesigner.cs
- WorkflowApplicationAbortedEventArgs.cs
- XmlNamespaceDeclarationsAttribute.cs
- DataGridTextBoxColumn.cs
- TouchEventArgs.cs
- PickBranchDesigner.xaml.cs
- Pool.cs
- DataGridViewSelectedColumnCollection.cs
- DataPager.cs
- NamespaceImport.cs
- Color.cs
- ServiceControllerDesigner.cs
- SHA256.cs
- ValueExpressions.cs
- DataGridViewDataConnection.cs
- CharUnicodeInfo.cs
- FontInfo.cs
- GroupBox.cs
- ResourceType.cs
- SkinBuilder.cs
- HtmlTernaryTree.cs
- TypeLoadException.cs
- LongCountAggregationOperator.cs
- DynamicPropertyHolder.cs
- KeyEvent.cs
- SourceFileBuildProvider.cs
- Sql8ConformanceChecker.cs
- WebControlParameterProxy.cs
- OdbcTransaction.cs
- ErrorHandler.cs
- NativeMethods.cs
- mediaeventargs.cs
- ClassValidator.cs
- XmlSchemas.cs
- RunInstallerAttribute.cs
- InternalBase.cs
- ExpandButtonVisibilityConverter.cs
- OleDbFactory.cs
- CardSpaceException.cs
- XmlCharCheckingWriter.cs
- ClockController.cs
- CompareInfo.cs
- RelatedCurrencyManager.cs
- XmlSchemaInfo.cs
- WindowsIPAddress.cs