//------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // // [....] //------------------------------------------------------------------------------ namespace System.Xml.Xsl.XsltOld { using Res = System.Xml.Utils.Res; using System; using System.Collections; using System.Xml; using System.Xml.XPath; using System.Xml.Xsl.XsltOld.Debugger; using System.Diagnostics; using System.Runtime.Versioning; internal class DbgData { private XPathNavigator styleSheet; private VariableAction[] variables; public XPathNavigator StyleSheet { get { return this.styleSheet; } } public VariableAction[] Variables { get { return this.variables; } } public DbgData(Compiler compiler) { DbgCompiler dbgCompiler = (DbgCompiler) compiler; this.styleSheet = dbgCompiler.Input.Navigator.Clone(); this.variables = dbgCompiler.LocalVariables; dbgCompiler.Debugger.OnInstructionCompile(this.StyleSheet); } internal void ReplaceVariables(VariableAction[] vars) { this.variables = vars; } // static Empty: private static DbgData s_nullDbgData = new DbgData(); private DbgData() { this.styleSheet = null; this.variables = new VariableAction[0]; } public static DbgData Empty { get { return s_nullDbgData; } } } internal class DbgCompiler : Compiler { private IXsltDebugger debugger; public DbgCompiler(IXsltDebugger debugger) { this.debugger = debugger; } public override IXsltDebugger Debugger { get { return this.debugger; } } // Variables // // In XsltDebugger we have to know variables that are visible from each action. // We keepping two different sets of wariables because global and local variables have different rules of visibility. // Globals: All global variables are visible avryware (uncalucaled will have null value), // Duplicated globals from different stilesheets are replaced (by import presidence) // Locals: Visible only in scope and after it was defined. // No duplicates posible. private ArrayList globalVars = new ArrayList(); private ArrayList localVars = new ArrayList(); private VariableAction[] globalVarsCache, localVarsCache; public virtual VariableAction[] GlobalVariables { get { Debug.Assert(this.Debugger != null); if (this.globalVarsCache == null) { this.globalVarsCache = (VariableAction[]) this.globalVars.ToArray(typeof(VariableAction)); } return this.globalVarsCache; } } public virtual VariableAction[] LocalVariables { get { Debug.Assert(this.Debugger != null); if (this.localVarsCache == null) { this.localVarsCache = (VariableAction[]) this.localVars.ToArray(typeof(VariableAction)); } return this.localVarsCache; } } private void DefineVariable(VariableAction variable) { Debug.Assert(this.Debugger != null); if (variable.IsGlobal) { for(int i = 0; i < globalVars.Count; i ++) { VariableAction oldVar = (VariableAction)this.globalVars[i]; if(oldVar.Name == variable.Name) { // Duplicate var definition if(variable.Stylesheetid < oldVar.Stylesheetid) { Debug.Assert(variable.VarKey != -1, "Variable was already placed and it should replace prev var."); this.globalVars[i] = variable; this.globalVarsCache = null; } return; } } this.globalVars.Add(variable); this.globalVarsCache = null; } else { // local variables never conflict localVars.Add(variable); this.localVarsCache = null; } } private void UnDefineVariables(int count) { Debug.Assert(0 <= count, "This scope can't have more variables than we have in total"); Debug.Assert(count <= this.localVars.Count, "This scope can't have more variables than we have in total"); if(count != 0) { this.localVars.RemoveRange(this.localVars.Count - count, count); this.localVarsCache = null; } } internal override void PopScope() { this.UnDefineVariables(this.ScopeManager.CurrentScope.GetVeriablesCount()); base.PopScope(); } // ---------------- Actions: --------------- public override ApplyImportsAction CreateApplyImportsAction() { ApplyImportsAction action = new ApplyImportsActionDbg(); action.Compile(this); return action; } public override ApplyTemplatesAction CreateApplyTemplatesAction() { ApplyTemplatesAction action = new ApplyTemplatesActionDbg(); action.Compile(this); return action; } public override AttributeAction CreateAttributeAction() { AttributeAction action = new AttributeActionDbg(); action.Compile(this); return action; } public override AttributeSetAction CreateAttributeSetAction() { AttributeSetAction action = new AttributeSetActionDbg(); action.Compile(this); return action; } public override CallTemplateAction CreateCallTemplateAction() { CallTemplateAction action = new CallTemplateActionDbg(); action.Compile(this); return action; } public override ChooseAction CreateChooseAction() {//!!! don't need to be here ChooseAction action = new ChooseAction(); action.Compile(this); return action; } public override CommentAction CreateCommentAction() { CommentAction action = new CommentActionDbg(); action.Compile(this); return action; } public override CopyAction CreateCopyAction() { CopyAction action = new CopyActionDbg(); action.Compile(this); return action; } public override CopyOfAction CreateCopyOfAction() { CopyOfAction action = new CopyOfActionDbg(); action.Compile(this); return action; } public override ElementAction CreateElementAction() { ElementAction action = new ElementActionDbg(); action.Compile(this); return action; } public override ForEachAction CreateForEachAction() { ForEachAction action = new ForEachActionDbg(); action.Compile(this); return action; } public override IfAction CreateIfAction(IfAction.ConditionType type) { IfAction action = new IfActionDbg(type); action.Compile(this); return action; } public override MessageAction CreateMessageAction() { MessageAction action = new MessageActionDbg(); action.Compile(this); return action; } public override NewInstructionAction CreateNewInstructionAction() { NewInstructionAction action = new NewInstructionActionDbg(); action.Compile(this); return action; } public override NumberAction CreateNumberAction() { NumberAction action = new NumberActionDbg(); action.Compile(this); return action; } public override ProcessingInstructionAction CreateProcessingInstructionAction() { ProcessingInstructionAction action = new ProcessingInstructionActionDbg(); action.Compile(this); return action; } public override void CreateRootAction() { this.RootAction = new RootActionDbg(); this.RootAction.Compile(this); } public override SortAction CreateSortAction() { SortAction action = new SortActionDbg(); action.Compile(this); return action; } public override TemplateAction CreateTemplateAction() { TemplateAction action = new TemplateActionDbg(); action.Compile(this); return action; } public override TemplateAction CreateSingleTemplateAction() { TemplateAction action = new TemplateActionDbg(); action.CompileSingle(this); return action; } public override TextAction CreateTextAction() { TextAction action = new TextActionDbg(); action.Compile(this); return action; } public override UseAttributeSetsAction CreateUseAttributeSetsAction() { UseAttributeSetsAction action = new UseAttributeSetsActionDbg(); action.Compile(this); return action; } public override ValueOfAction CreateValueOfAction() { ValueOfAction action = new ValueOfActionDbg(); action.Compile(this); return action; } public override VariableAction CreateVariableAction(VariableType type) { VariableAction action = new VariableActionDbg(type); action.Compile(this); return action; } public override WithParamAction CreateWithParamAction() { WithParamAction action = new WithParamActionDbg(); action.Compile(this); return action; } // ---------------- Events: --------------- public override BeginEvent CreateBeginEvent() { return new BeginEventDbg(this); } public override TextEvent CreateTextEvent() { return new TextEventDbg(this); } // Debugger enabled implemetation of most compiled actions private class ApplyImportsActionDbg : ApplyImportsAction { private DbgData dbgData; internal override DbgData GetDbgData(ActionFrame frame) { return this.dbgData; } internal override void Compile(Compiler compiler) { dbgData = new DbgData(compiler); base.Compile(compiler); } internal override void Execute(Processor processor, ActionFrame frame) { if(frame.State == Initialized) { processor.OnInstructionExecute(); } base.Execute(processor, frame); } } private class ApplyTemplatesActionDbg : ApplyTemplatesAction { private DbgData dbgData; internal override DbgData GetDbgData(ActionFrame frame) { return this.dbgData; } internal override void Compile(Compiler compiler) { dbgData = new DbgData(compiler); base.Compile(compiler); } internal override void Execute(Processor processor, ActionFrame frame) { if(frame.State == Initialized) { processor.OnInstructionExecute(); } base.Execute(processor, frame); } } private class AttributeActionDbg : AttributeAction { private DbgData dbgData; internal override DbgData GetDbgData(ActionFrame frame) { return this.dbgData; } internal override void Compile(Compiler compiler) { dbgData = new DbgData(compiler); base.Compile(compiler); } internal override void Execute(Processor processor, ActionFrame frame) { if(frame.State == Initialized) { processor.OnInstructionExecute(); } base.Execute(processor, frame); } } private class AttributeSetActionDbg : AttributeSetAction { private DbgData dbgData; internal override DbgData GetDbgData(ActionFrame frame) { return this.dbgData; } internal override void Compile(Compiler compiler) { dbgData = new DbgData(compiler); base.Compile(compiler); } internal override void Execute(Processor processor, ActionFrame frame) { if(frame.State == Initialized) { processor.OnInstructionExecute(); } base.Execute(processor, frame); } } private class CallTemplateActionDbg : CallTemplateAction { private DbgData dbgData; internal override DbgData GetDbgData(ActionFrame frame) { return this.dbgData; } internal override void Compile(Compiler compiler) { dbgData = new DbgData(compiler); base.Compile(compiler); } internal override void Execute(Processor processor, ActionFrame frame) { if(frame.State == Initialized) { processor.OnInstructionExecute(); } base.Execute(processor, frame); } } private class CommentActionDbg : CommentAction { private DbgData dbgData; internal override DbgData GetDbgData(ActionFrame frame) { return this.dbgData; } internal override void Compile(Compiler compiler) { dbgData = new DbgData(compiler); base.Compile(compiler); } internal override void Execute(Processor processor, ActionFrame frame) { if(frame.State == Initialized) { processor.OnInstructionExecute(); } base.Execute(processor, frame); } } private class CopyActionDbg : CopyAction { private DbgData dbgData; internal override DbgData GetDbgData(ActionFrame frame) { return this.dbgData; } internal override void Compile(Compiler compiler) { dbgData = new DbgData(compiler); base.Compile(compiler); } internal override void Execute(Processor processor, ActionFrame frame) { if(frame.State == Initialized) { processor.OnInstructionExecute(); } base.Execute(processor, frame); } } private class CopyOfActionDbg : CopyOfAction { private DbgData dbgData; internal override DbgData GetDbgData(ActionFrame frame) { return this.dbgData; } internal override void Compile(Compiler compiler) { dbgData = new DbgData(compiler); base.Compile(compiler); } internal override void Execute(Processor processor, ActionFrame frame) { if(frame.State == Initialized) { processor.OnInstructionExecute(); } base.Execute(processor, frame); } } private class ElementActionDbg : ElementAction { private DbgData dbgData; internal override DbgData GetDbgData(ActionFrame frame) { return this.dbgData; } internal override void Compile(Compiler compiler) { dbgData = new DbgData(compiler); base.Compile(compiler); } internal override void Execute(Processor processor, ActionFrame frame) { if(frame.State == Initialized) { processor.OnInstructionExecute(); } base.Execute(processor, frame); } } private class ForEachActionDbg : ForEachAction { private DbgData dbgData; internal override DbgData GetDbgData(ActionFrame frame) { return this.dbgData; } internal override void Compile(Compiler compiler) { dbgData = new DbgData(compiler); base.Compile(compiler); } internal override void Execute(Processor processor, ActionFrame frame) { if(frame.State == Initialized) { processor.PushDebuggerStack(); processor.OnInstructionExecute(); } base.Execute(processor, frame); if (frame.State == Finished) { processor.PopDebuggerStack(); } } } private class IfActionDbg : IfAction { internal IfActionDbg(ConditionType type) : base(type) {} private DbgData dbgData; internal override DbgData GetDbgData(ActionFrame frame) { return this.dbgData; } internal override void Compile(Compiler compiler) { dbgData = new DbgData(compiler); base.Compile(compiler); } internal override void Execute(Processor processor, ActionFrame frame) { if(frame.State == Initialized) { processor.OnInstructionExecute(); } base.Execute(processor, frame); } } private class MessageActionDbg : MessageAction { private DbgData dbgData; internal override DbgData GetDbgData(ActionFrame frame) { return this.dbgData; } internal override void Compile(Compiler compiler) { dbgData = new DbgData(compiler); base.Compile(compiler); } internal override void Execute(Processor processor, ActionFrame frame) { if(frame.State == Initialized) { processor.OnInstructionExecute(); } base.Execute(processor, frame); } } private class NewInstructionActionDbg : NewInstructionAction { private DbgData dbgData; internal override DbgData GetDbgData(ActionFrame frame) { return this.dbgData; } internal override void Compile(Compiler compiler) { dbgData = new DbgData(compiler); base.Compile(compiler); } internal override void Execute(Processor processor, ActionFrame frame) { if(frame.State == Initialized) { processor.OnInstructionExecute(); } base.Execute(processor, frame); } } private class NumberActionDbg : NumberAction { private DbgData dbgData; internal override DbgData GetDbgData(ActionFrame frame) { return this.dbgData; } internal override void Compile(Compiler compiler) { dbgData = new DbgData(compiler); base.Compile(compiler); } internal override void Execute(Processor processor, ActionFrame frame) { if(frame.State == Initialized) { processor.OnInstructionExecute(); } base.Execute(processor, frame); } } private class ProcessingInstructionActionDbg : ProcessingInstructionAction { private DbgData dbgData; internal override DbgData GetDbgData(ActionFrame frame) { return this.dbgData; } internal override void Compile(Compiler compiler) { dbgData = new DbgData(compiler); base.Compile(compiler); } internal override void Execute(Processor processor, ActionFrame frame) { if(frame.State == Initialized) { processor.OnInstructionExecute(); } base.Execute(processor, frame); } } private class RootActionDbg : RootAction { private DbgData dbgData; internal override DbgData GetDbgData(ActionFrame frame) { return this.dbgData; } // SxS: This method does not take any resource name and does not expose any resources to the caller. // It's OK to suppress the SxS warning. [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)] [ResourceExposure(ResourceScope.None)] internal override void Compile(Compiler compiler) { dbgData = new DbgData(compiler); base.Compile(compiler); Debug.Assert(compiler.Debugger != null); string builtIn = compiler.Debugger.GetBuiltInTemplatesUri(); if (builtIn != null && builtIn.Length != 0) { compiler.AllowBuiltInMode = true; builtInSheet = compiler.RootAction.CompileImport(compiler, compiler.ResolveUri(builtIn), int.MaxValue); compiler.AllowBuiltInMode = false; } dbgData.ReplaceVariables(((DbgCompiler) compiler).GlobalVariables) ; } internal override void Execute(Processor processor, ActionFrame frame) { if (frame.State == Initialized) { processor.PushDebuggerStack(); processor.OnInstructionExecute(); processor.PushDebuggerStack(); } base.Execute(processor, frame); if (frame.State == Finished) { processor.PopDebuggerStack(); processor.PopDebuggerStack(); } } } private class SortActionDbg : SortAction { private DbgData dbgData; internal override DbgData GetDbgData(ActionFrame frame) { return this.dbgData; } internal override void Compile(Compiler compiler) { dbgData = new DbgData(compiler); base.Compile(compiler); } internal override void Execute(Processor processor, ActionFrame frame) { if(frame.State == Initialized) { processor.OnInstructionExecute(); } base.Execute(processor, frame); } } private class TemplateActionDbg : TemplateAction { private DbgData dbgData; internal override DbgData GetDbgData(ActionFrame frame) { return this.dbgData; } internal override void Compile(Compiler compiler) { dbgData = new DbgData(compiler); base.Compile(compiler); } internal override void Execute(Processor processor, ActionFrame frame) { if(frame.State == Initialized) { processor.PushDebuggerStack(); processor.OnInstructionExecute(); } base.Execute(processor, frame); if (frame.State == Finished) { processor.PopDebuggerStack(); } } } private class TextActionDbg : TextAction { private DbgData dbgData; internal override DbgData GetDbgData(ActionFrame frame) { return this.dbgData; } internal override void Compile(Compiler compiler) { dbgData = new DbgData(compiler); base.Compile(compiler); } internal override void Execute(Processor processor, ActionFrame frame) { if(frame.State == Initialized) { processor.OnInstructionExecute(); } base.Execute(processor, frame); } } private class UseAttributeSetsActionDbg : UseAttributeSetsAction { private DbgData dbgData; internal override DbgData GetDbgData(ActionFrame frame) { return this.dbgData; } internal override void Compile(Compiler compiler) { dbgData = new DbgData(compiler); base.Compile(compiler); } internal override void Execute(Processor processor, ActionFrame frame) { if(frame.State == Initialized) { processor.OnInstructionExecute(); } base.Execute(processor, frame); } } private class ValueOfActionDbg : ValueOfAction { private DbgData dbgData; internal override DbgData GetDbgData(ActionFrame frame) { return this.dbgData; } internal override void Compile(Compiler compiler) { dbgData = new DbgData(compiler); base.Compile(compiler); } internal override void Execute(Processor processor, ActionFrame frame) { if(frame.State == Initialized) { processor.OnInstructionExecute(); } base.Execute(processor, frame); } } private class VariableActionDbg : VariableAction { internal VariableActionDbg(VariableType type) : base(type) {} private DbgData dbgData; internal override DbgData GetDbgData(ActionFrame frame) { return this.dbgData; } internal override void Compile(Compiler compiler) { dbgData = new DbgData(compiler); base.Compile(compiler); ((DbgCompiler) compiler).DefineVariable(this); } internal override void Execute(Processor processor, ActionFrame frame) { if(frame.State == Initialized) { processor.OnInstructionExecute(); } base.Execute(processor, frame); } } private class WithParamActionDbg : WithParamAction { private DbgData dbgData; internal override DbgData GetDbgData(ActionFrame frame) { return this.dbgData; } internal override void Compile(Compiler compiler) { dbgData = new DbgData(compiler); base.Compile(compiler); } internal override void Execute(Processor processor, ActionFrame frame) { if(frame.State == Initialized) { processor.OnInstructionExecute(); } base.Execute(processor, frame); } } // ---------------- Events: --------------- private class BeginEventDbg : BeginEvent { private DbgData dbgData; internal override DbgData DbgData { get { return this.dbgData; } } public BeginEventDbg(Compiler compiler) : base(compiler) { dbgData = new DbgData(compiler); } public override bool Output(Processor processor, ActionFrame frame) { this.OnInstructionExecute(processor); return base.Output(processor, frame); } } private class TextEventDbg : TextEvent { private DbgData dbgData; internal override DbgData DbgData { get { return this.dbgData; } } public TextEventDbg(Compiler compiler) : base(compiler) { dbgData = new DbgData(compiler); } public override bool Output(Processor processor, ActionFrame frame) { this.OnInstructionExecute(processor); return base.Output(processor, frame); } } } }