Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / XmlUtils / System / Xml / Xsl / IlGen / TailCallAnalyzer.cs / 1305376 / TailCallAnalyzer.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- using System; using System.Diagnostics; using System.Xml.Xsl.Qil; namespace System.Xml.Xsl.IlGen { ////// This analyzer walks each function in the graph and annotates Invoke nodes which can /// be compiled using the IL .tailcall instruction. This instruction will discard the /// current stack frame before calling the new function. /// internal static class TailCallAnalyzer { ////// Perform tail-call analysis on the functions in the specified QilExpression. /// public static void Analyze(QilExpression qil) { foreach (QilFunction ndFunc in qil.FunctionList) { // Only analyze functions which are pushed to the writer, since otherwise code // is generated after the call instruction in order to process cached results if (XmlILConstructInfo.Read(ndFunc).ConstructMethod == XmlILConstructMethod.Writer) AnalyzeDefinition(ndFunc.Definition); } } ////// Recursively analyze the definition of a function. /// private static void AnalyzeDefinition(QilNode nd) { Debug.Assert(XmlILConstructInfo.Read(nd).PushToWriterLast, "Only need to analyze expressions which will be compiled in push mode."); switch (nd.NodeType) { case QilNodeType.Invoke: // Invoke node can either be compiled as IteratorThenWriter, or Writer. // Since IteratorThenWriter involves caching the results of the function call // and iterating over them, .tailcall cannot be used if (XmlILConstructInfo.Read(nd).ConstructMethod == XmlILConstructMethod.Writer) OptimizerPatterns.Write(nd).AddPattern(OptimizerPatternName.TailCall); break; case QilNodeType.Loop: { // Recursively analyze Loop return value QilLoop ndLoop = (QilLoop) nd; if (ndLoop.Variable.NodeType == QilNodeType.Let || !ndLoop.Variable.Binding.XmlType.MaybeMany) AnalyzeDefinition(ndLoop.Body); break; } case QilNodeType.Sequence: { // Recursively analyze last expression in Sequence QilList ndSeq = (QilList) nd; if (ndSeq.Count > 0) AnalyzeDefinition(ndSeq[ndSeq.Count - 1]); break; } case QilNodeType.Choice: { // Recursively analyze Choice branches QilChoice ndChoice = (QilChoice) nd; for (int i = 0; i < ndChoice.Branches.Count; i++) AnalyzeDefinition(ndChoice.Branches[i]); break; } case QilNodeType.Conditional: { // Recursively analyze Conditional branches QilTernary ndCond = (QilTernary) nd; AnalyzeDefinition(ndCond.Center); AnalyzeDefinition(ndCond.Right); break; } case QilNodeType.Nop: AnalyzeDefinition(((QilUnary) nd).Child); break; } } } } // 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
- FormatConvertedBitmap.cs
- CalculatedColumn.cs
- ResizeGrip.cs
- HttpResponseBase.cs
- InstallerTypeAttribute.cs
- OpenFileDialog.cs
- RectAnimationClockResource.cs
- DataTableExtensions.cs
- EventsTab.cs
- SafeThreadHandle.cs
- DbCommandDefinition.cs
- CodeDelegateInvokeExpression.cs
- AmbientProperties.cs
- OleDbParameter.cs
- WebSysDefaultValueAttribute.cs
- AsmxEndpointPickerExtension.cs
- AttributeTableBuilder.cs
- RadioButtonAutomationPeer.cs
- SafeArrayTypeMismatchException.cs
- ChildDocumentBlock.cs
- SoapDocumentServiceAttribute.cs
- X509AudioLogo.cs
- DataKeyArray.cs
- ActivityDesignerResources.cs
- RuntimeIdentifierPropertyAttribute.cs
- KeyFrames.cs
- DataErrorValidationRule.cs
- TransformConverter.cs
- ImageUrlEditor.cs
- NotifyCollectionChangedEventArgs.cs
- WeakKeyDictionary.cs
- AsyncOperation.cs
- BehaviorDragDropEventArgs.cs
- ComEventsInfo.cs
- JapaneseLunisolarCalendar.cs
- ScrollData.cs
- DataGridViewRowCollection.cs
- DataGridViewRowsAddedEventArgs.cs
- ApplicationGesture.cs
- TimeoutTimer.cs
- XmlSchemaSubstitutionGroup.cs
- StructuralType.cs
- Array.cs
- TypeDescriptorContext.cs
- SqlBooleanMismatchVisitor.cs
- ComPlusDiagnosticTraceRecords.cs
- XmlRootAttribute.cs
- IndexedGlyphRun.cs
- DataBoundLiteralControl.cs
- Canvas.cs
- ExceptionUtil.cs
- SByteConverter.cs
- OdbcConnectionString.cs
- HttpWebRequest.cs
- Int32.cs
- InputDevice.cs
- FlowDocumentReader.cs
- CoTaskMemUnicodeSafeHandle.cs
- HttpCookiesSection.cs
- DataGridDesigner.cs
- XmlNotation.cs
- HostingEnvironmentException.cs
- CheckBox.cs
- Token.cs
- DrawingBrush.cs
- SqlMultiplexer.cs
- InputReportEventArgs.cs
- TypeConverterHelper.cs
- TypeDelegator.cs
- IdentityReference.cs
- ReceiveMessageRecord.cs
- BitArray.cs
- DataContractSerializerElement.cs
- NativeMethods.cs
- CryptoApi.cs
- FtpWebResponse.cs
- HyperLinkColumn.cs
- SerializationStore.cs
- UnauthorizedWebPart.cs
- SqlProfileProvider.cs
- DataGridViewCellStateChangedEventArgs.cs
- SourceSwitch.cs
- Rect.cs
- ItemCollection.cs
- DataAccessException.cs
- BaseServiceProvider.cs
- DetailsViewInsertEventArgs.cs
- WebPartCancelEventArgs.cs
- X509SecurityTokenProvider.cs
- TemplateKeyConverter.cs
- MetadataItemSerializer.cs
- TraceUtility.cs
- Configuration.cs
- AdornerPresentationContext.cs
- StructuredTypeEmitter.cs
- EntityDataSourceEntityTypeFilterConverter.cs
- ValidationErrorCollection.cs
- FloaterParagraph.cs
- CryptoKeySecurity.cs
- TypeEnumerableViewSchema.cs