The Labs \ Source Viewer \ SSCLI \ Microsoft.JScript \ VsaStaticCode

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. namespace Microsoft.JScript
  16. {
  17.    
  18.     using Microsoft.JScript.Vsa;
  19.     using System;
  20.     using System.Reflection;
  21.     using System.Reflection.Emit;
  22.     using Microsoft.Vsa;
  23.     using System.Globalization;
  24.     using System.IO;
  25.     using System.CodeDom;
  26.     using System.Collections.Specialized;
  27.    
  28.     internal class VsaStaticCode : VsaItem, IVsaCodeItem
  29.     {
  30.         internal Context codeContext;
  31.         private Type compiledClass;
  32.         private ScriptBlock block;
  33.        
  34.         internal VsaStaticCode(VsaEngine engine, string itemName, VsaItemFlag flag) : base(engine, itemName, VsaItemType.Code, flag)
  35.         {
  36.             this.compiledClass = null;
  37.             this.codeContext = new Context(new DocumentContext(this), "");
  38.         }
  39.        
  40.         public void AddEventSource(string eventSourceName, string eventSourceType)
  41.         {
  42.             // JScript does not support adding event sources (user must add an AppGlobal instead and manually hook up event handlers)
  43.             if (this.engine == null)
  44.                 throw new VsaException(VsaError.EngineClosed);
  45.             throw new System.NotSupportedException();
  46.         }
  47.        
  48.         public System.CodeDom.CodeObject CodeDOM {
  49.             get {
  50.                 if (this.engine == null)
  51.                     throw new VsaException(VsaError.EngineClosed);
  52.                 throw new VsaException(VsaError.CodeDOMNotAvailable);
  53.             }
  54.         }
  55.        
  56.         public void AppendSourceText(string SourceCode)
  57.         {
  58.             if (this.engine == null)
  59.                 throw new VsaException(VsaError.EngineClosed);
  60.             if (SourceCode == null || SourceCode.Length == 0)
  61.                 return;
  62.             this.codeContext.SetSourceContext(this.codeContext.document, this.codeContext.source_string + SourceCode);
  63.             this.compiledClass = null;
  64.             this.isDirty = true;
  65.             this.engine.IsDirty = true;
  66.         }
  67.        
  68.         internal override void CheckForErrors()
  69.         {
  70.             if (this.compiledClass == null) {
  71.                 JSParser p = new JSParser(this.codeContext);
  72.                 AST prog = (ScriptBlock)p.Parse();
  73.                 //prog.PartiallyEvaluate();
  74.             }
  75.         }
  76.        
  77.         internal override void Close()
  78.         {
  79.             base.Close();
  80.             this.codeContext = null;
  81.             this.compiledClass = null;
  82.         }
  83.        
  84.         internal override Type GetCompiledType()
  85.         {
  86.             TypeBuilder tb = this.compiledClass as TypeBuilder;
  87.             if (tb != null)
  88.                 this.compiledClass = tb.CreateType();
  89.             return this.compiledClass;
  90.         }
  91.        
  92.         public override string Name {
  93.             set {
  94.                 base.Name = value;
  95.                 if (this.codebase == null) {
  96.                     // The codeContext document was named according to the engine's RootMoniker and the item name
  97.                     string rootMoniker = this.engine.RootMoniker;
  98.                     this.codeContext.document.documentName = rootMoniker + (rootMoniker.EndsWith("/", StringComparison.Ordinal) ? "" : "/") + this.name;
  99.                 }
  100.             }
  101.         }
  102.        
  103.         internal void Parse()
  104.         {
  105.             if (this.block == null && this.compiledClass == null) {
  106.                 GlobalScope glob = (GlobalScope)this.engine.GetGlobalScope().GetObject();
  107.                 //Provide for the possibility of forward references to declarations in code blocks yet to come.
  108.                 glob.evilScript = !glob.fast || this.engine.GetStaticCodeBlockCount() > 1;
  109.                 this.engine.Globals.ScopeStack.Push(glob);
  110.                 try {
  111.                     JSParser p = new JSParser(this.codeContext);
  112.                     this.block = (ScriptBlock)p.Parse();
  113.                     if (p.HasAborted)
  114.                         this.block = null;
  115.                 }
  116.                 finally {
  117.                     this.engine.Globals.ScopeStack.Pop();
  118.                 }
  119.             }
  120.         }
  121.        
  122.         internal void ProcessAssemblyAttributeLists()
  123.         {
  124.             if (this.block == null)
  125.                 return;
  126.             this.block.ProcessAssemblyAttributeLists();
  127.         }
  128.        
  129.         internal void PartiallyEvaluate()
  130.         {
  131.             if (this.block != null && this.compiledClass == null) {
  132.                 GlobalScope glob = (GlobalScope)this.engine.GetGlobalScope().GetObject();
  133.                 this.engine.Globals.ScopeStack.Push(glob);
  134.                 try {
  135.                     this.block.PartiallyEvaluate();
  136.                     if (this.engine.HasErrors && !this.engine.alwaysGenerateIL)
  137.                         throw new EndOfFile();
  138.                 }
  139.                 finally {
  140.                     this.engine.Globals.ScopeStack.Pop();
  141.                 }
  142.             }
  143.         }
  144.        
  145.         internal override void Remove()
  146.         {
  147.             if (this.engine == null)
  148.                 throw new VsaException(VsaError.EngineClosed);
  149.             base.Remove();
  150.         }
  151.        
  152.         public void RemoveEventSource(string eventSourceName)
  153.         {
  154.             if (this.engine == null)
  155.                 throw new VsaException(VsaError.EngineClosed);
  156.             throw new System.NotSupportedException();
  157.         }
  158.        
  159.         internal override void Reset()
  160.         {
  161.             this.compiledClass = null;
  162.             this.block = null;
  163.             // We reset codeContext because the DocumentContext holds a reference to engine.compilerGlobals
  164.             // (which we must have set to null before calling Reset on the VsaItems).
  165.             this.codeContext = new Context(new DocumentContext(this), this.codeContext.source_string);
  166.         }
  167.        
  168.         internal override void Run()
  169.         {
  170.             if (this.compiledClass != null) {
  171.                 GlobalScope scriptBlockScope = (GlobalScope)Activator.CreateInstance(this.GetCompiledType(), new object[] {this.engine.GetGlobalScope().GetObject()});
  172.                 this.engine.Globals.ScopeStack.Push(scriptBlockScope);
  173.                 try {
  174.                     MethodInfo main = this.compiledClass.GetMethod("Global Code");
  175.                     try {
  176.                         main.Invoke(scriptBlockScope, null);
  177.                     }
  178.                     catch (TargetInvocationException e) {
  179.                         throw e.InnerException;
  180.                     }
  181.                 }
  182.                 finally {
  183.                     this.engine.Globals.ScopeStack.Pop();
  184.                 }
  185.             }
  186.         }
  187.        
  188.         public override void SetOption(string name, object value)
  189.         {
  190.             if (this.engine == null)
  191.                 throw new VsaException(VsaError.EngineClosed);
  192.             if (0 == String.Compare(name, "codebase", StringComparison.OrdinalIgnoreCase)) {
  193.                 this.codebase = (string)value;
  194.                 this.codeContext.document.documentName = this.codebase;
  195.             }
  196.             else
  197.                 throw new VsaException(VsaError.OptionNotSupported);
  198.             this.isDirty = true;
  199.             this.engine.IsDirty = true;
  200.         }
  201.        
  202.         public object SourceContext {
  203.             get { return null; }
  204.            
  205.             set { }
  206.         }
  207.        
  208.         public string SourceText {
  209.             get {
  210.                 if (this.engine == null)
  211.                     throw new VsaException(VsaError.EngineClosed);
  212.                 return this.codeContext.source_string;
  213.             }
  214.            
  215.             set {
  216.                 if (this.engine == null)
  217.                     throw new VsaException(VsaError.EngineClosed);
  218.                 this.codeContext.SetSourceContext(this.codeContext.document, (value == null ? "" : value));
  219.                 this.compiledClass = null;
  220.                 this.isDirty = true;
  221.                 this.engine.IsDirty = true;
  222.             }
  223.         }
  224.        
  225.         internal void TranslateToIL()
  226.         {
  227.             if (this.block != null && this.compiledClass == null) {
  228.                 GlobalScope glob = (GlobalScope)this.engine.GetGlobalScope().GetObject();
  229.                 this.engine.Globals.ScopeStack.Push(glob);
  230.                 try {
  231.                     this.compiledClass = this.block.TranslateToILClass(this.engine.CompilerGlobals, false);
  232.                 }
  233.                 finally {
  234.                     this.engine.Globals.ScopeStack.Pop();
  235.                 }
  236.             }
  237.         }
  238.        
  239.     }
  240.    
  241. }

Developer Fusion