| File: System\Xml\Xsl\XmlILCommand.cs | Web Access |
| Project: src\runtime\src\libraries\System.Private.Xml\src\System.Private.Xml.csproj (System.Private.Xml) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // <spec>http://webdata/xml/specs/querylowlevel.xml</spec> //------------------------------------------------------------------------------ using System.Collections; using System.Diagnostics; using System.IO; using System.Runtime.Versioning; using System.Xml.XPath; using System.Xml.Xsl.Runtime; namespace System.Xml.Xsl { /// <summary> /// This is the executable command generated by the XmlILGenerator. /// </summary> internal sealed class XmlILCommand { private readonly ExecuteDelegate _delExec; private readonly XmlQueryStaticData _staticData; /// <summary> /// Constructor. /// </summary> public XmlILCommand(ExecuteDelegate delExec, XmlQueryStaticData staticData) { Debug.Assert(delExec != null && staticData != null); _delExec = delExec; _staticData = staticData; } /// <summary> /// Return query static data required by the runtime. /// </summary> public XmlQueryStaticData StaticData { get { return _staticData; } } /// <summary> /// Execute the dynamic assembly generated by the XmlILGenerator. /// </summary> public void Execute(object defaultDocument, XmlResolver? dataSources, XsltArgumentList? argumentList, XmlWriter writer) { try { if (writer is XmlAsyncCheckWriter) { writer = ((XmlAsyncCheckWriter)writer).CoreWriter; } // Try to extract a RawWriter XmlWellFormedWriter? wellFormedWriter = writer as XmlWellFormedWriter; if (wellFormedWriter != null && wellFormedWriter.RawWriter != null && wellFormedWriter.WriteState == WriteState.Start && wellFormedWriter.Settings.ConformanceLevel != ConformanceLevel.Document) { // Extracted RawWriter from WellFormedWriter Execute(defaultDocument, dataSources, argumentList, new XmlMergeSequenceWriter(wellFormedWriter.RawWriter)); } else { // Wrap Writer in RawWriter Execute(defaultDocument, dataSources, argumentList, new XmlMergeSequenceWriter(new XmlRawWriterWrapper(writer))); } } finally { writer.Flush(); } } /// <summary> /// Execute the dynamic assembly generated by the XmlILGenerator. /// </summary> private void Execute(object defaultDocument, XmlResolver? dataSources, XsltArgumentList? argumentList, XmlSequenceWriter results) { Debug.Assert(results != null); // Ensure that dataSources is always non-null dataSources ??= XmlResolver.ThrowingResolver; _delExec(new XmlQueryRuntime(_staticData, defaultDocument, dataSources, argumentList, results)); } } }