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

  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.Collections;
  21.     using System.Reflection;
  22.     using System.Security;
  23.     using System.Security.Permissions;
  24.     using Microsoft.Vsa;
  25.    
  26.     internal class VsaScriptScope : VsaItem, IVsaScriptScope
  27.     {
  28.        
  29.         private VsaScriptScope parent;
  30.         private GlobalScope scope;
  31.         private ArrayList items;
  32.         private bool isCompiled;
  33.         private bool isClosed;
  34.        
  35.         internal VsaScriptScope(VsaEngine engine, string itemName, VsaScriptScope parent) : base(engine, itemName, (VsaItemType)(int)VSAITEMTYPE2.SCRIPTSCOPE, VsaItemFlag.None)
  36.         {
  37.             this.parent = parent;
  38.             this.scope = null;
  39.             this.items = new ArrayList(8);
  40.             this.isCompiled = false;
  41.             this.isClosed = false;
  42.         }
  43.        
  44.         public virtual object GetObject()
  45.         {
  46.             if (null == this.scope)
  47.                 if (null != this.parent)
  48.                     this.scope = new GlobalScope((GlobalScope)this.parent.GetObject(), this.engine, false);
  49.                 else
  50.                     this.scope = new GlobalScope(null, this.engine);
  51.             return this.scope;
  52.         }
  53.        
  54.         public IVsaScriptScope Parent {
  55.             get { return this.parent; }
  56.         }
  57.        
  58.         public virtual IVsaItem AddItem(string itemName, VsaItemType type)
  59.         {
  60.             VsaItem item = null;
  61.            
  62.             if (this.isClosed)
  63.                 throw new VsaException(VsaError.EngineClosed);
  64.             if (null != GetItem(itemName))
  65.                 throw new VsaException(VsaError.ItemNameInUse);
  66.            
  67.             switch ((int)type) {
  68.                 case (int)VSAITEMTYPE2.HOSTOBJECT:
  69.                 case (int)VSAITEMTYPE2.HOSTSCOPE:
  70.                 case (int)VSAITEMTYPE2.HOSTSCOPEANDOBJECT:
  71.                    
  72.                     item = new VsaHostObject(this.engine, itemName, (VsaItemType)type, this);
  73.                     if (type == (VsaItemType)VSAITEMTYPE2.HOSTSCOPE || type == (VsaItemType)VSAITEMTYPE2.HOSTSCOPEANDOBJECT) {
  74.                         ((VsaHostObject)item).exposeMembers = true;
  75.                     }
  76.                     if (type == (VsaItemType)VSAITEMTYPE2.HOSTOBJECT || type == (VsaItemType)VSAITEMTYPE2.HOSTSCOPEANDOBJECT)
  77.                         ((VsaHostObject)item).isVisible = true;
  78.                     if (this.engine.IsRunning) {
  79.                         ((VsaHostObject)item).Compile();
  80.                         ((VsaHostObject)item).Run();
  81.                     }
  82.                     break;
  83.                 case (int)VSAITEMTYPE2.SCRIPTSCOPE:
  84.                    
  85.                     item = new VsaScriptScope(this.engine, itemName, this);
  86.                     break;
  87.             }
  88.            
  89.             if (null != item) {
  90.                 //if (!this.engine.IsRunning)
  91.                 this.items.Add(item);
  92.             }
  93.             else
  94.                 throw new VsaException(VsaError.ItemTypeNotSupported);
  95.             return item;
  96.         }
  97.        
  98.         public virtual IVsaItem GetItem(string itemName)
  99.         {
  100.             for (int i = 0int n = this.items.Count; i < n; i++) {
  101.                 VsaItem item = (VsaItem)this.items[i];
  102.                 if (null == item.Name && null == itemName || null != item.Name && item.Name.Equals(itemName))
  103.                     return (IVsaItem)this.items[i];
  104.             }
  105.             return null;
  106.         }
  107.        
  108.         public virtual void RemoveItem(string itemName)
  109.         {
  110.             for (int i = 0int n = this.items.Count; i < n; i++) {
  111.                 VsaItem item = (VsaItem)this.items[i];
  112.                 if (null == item.Name && null == itemName || null != item.Name && item.Name.Equals(itemName)) {
  113.                     item.Remove();
  114.                     this.items.Remove(i);
  115.                     return;
  116.                 }
  117.             }
  118.             throw new VsaException(VsaError.ItemNotFound);
  119.         }
  120.        
  121.         public virtual void RemoveItem(IVsaItem item)
  122.         {
  123.             for (int i = 0int n = this.items.Count; i < n; i++) {
  124.                 VsaItem vsaItem = (VsaItem)this.items[i];
  125.                 if (vsaItem == item) {
  126.                     vsaItem.Remove();
  127.                     this.items.Remove(i);
  128.                     return;
  129.                 }
  130.             }
  131.             throw new VsaException(VsaError.ItemNotFound);
  132.         }
  133.        
  134.         public virtual int GetItemCount()
  135.         {
  136.             return this.items.Count;
  137.         }
  138.        
  139.         public virtual IVsaItem GetItemAtIndex(int index)
  140.         {
  141.             if (index < this.items.Count)
  142.                 return (IVsaItem)this.items[index];
  143.             else
  144.                 throw new VsaException(VsaError.ItemNotFound);
  145.         }
  146.        
  147.         public virtual void RemoveItemAtIndex(int index)
  148.         {
  149.             if (index < this.items.Count) {
  150.                 ((VsaItem)this.items[index]).Remove();
  151.                 this.items.Remove(index);
  152.             }
  153.             else
  154.                 throw new VsaException(VsaError.ItemNotFound);
  155.         }
  156.        
  157.         public virtual IVsaItem CreateDynamicItem(string itemName, VsaItemType type)
  158.         {
  159.             if (this.engine.IsRunning)
  160.                 return AddItem(itemName, type);
  161.             else
  162.                 throw new VsaException(VsaError.EngineNotRunning);
  163.         }
  164.        
  165.         internal override void CheckForErrors()
  166.         {
  167.             if (this.items.Count == 0)
  168.                 return;
  169.             try {
  170.                 this.engine.Globals.ScopeStack.Push((ScriptObject)GetObject());
  171.                 // compile all the items in this scope
  172.                 foreach (object item in this.items)
  173.                     ((VsaItem)item).CheckForErrors();
  174.             }
  175.             finally {
  176.                 this.engine.Globals.ScopeStack.Pop();
  177.             }
  178.         }
  179.        
  180.         internal override void Compile()
  181.         {
  182.             if (this.items.Count == 0)
  183.                 return;
  184.             if (!this.isCompiled) {
  185.                 this.isCompiled = true;
  186.                 try {
  187.                     this.engine.Globals.ScopeStack.Push((ScriptObject)GetObject());
  188.                     try {
  189.                         // compile all the items in this scope
  190.                         foreach (object item in this.items)
  191.                             ((VsaItem)item).Compile();
  192.                     }
  193.                     finally {
  194.                         this.engine.Globals.ScopeStack.Pop();
  195.                     }
  196.                 }
  197.                 catch {
  198.                     this.isCompiled = false;
  199.                     throw;
  200.                 }
  201.             }
  202.         }
  203.        
  204.         internal override void Reset()
  205.         {
  206.             //this.scope = null;
  207.             foreach (object item in this.items)
  208.                 ((VsaItem)item).Reset();
  209.         }
  210.        
  211.         internal void ReRun(GlobalScope scope)
  212.         {
  213.             foreach (object item in this.items)
  214.                 if (item is VsaHostObject)
  215.                     ((VsaHostObject)item).ReRun(scope);
  216.             if (this.parent != null)
  217.                 this.parent.ReRun(scope);
  218.         }
  219.        
  220.         internal override void Run()
  221.         {
  222.             if (this.items.Count == 0)
  223.                 return;
  224.             try {
  225.                 this.engine.Globals.ScopeStack.Push((ScriptObject)GetObject());
  226.                 foreach (object item in this.items)
  227.                     ((VsaItem)item).Run();
  228.             }
  229.             finally {
  230.                 this.engine.Globals.ScopeStack.Pop();
  231.             }
  232.         }
  233.        
  234.         internal override void Close()
  235.         {
  236.             foreach (object item in this.items)
  237.                 ((VsaItem)item).Close();
  238.             this.items = null;
  239.             this.parent = null;
  240.             this.scope = null;
  241.             this.isClosed = true;
  242.         }
  243.        
  244.     }
  245. }

Developer Fusion