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

  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.    
  23.     public sealed class Package : AST
  24.     {
  25.         private string name;
  26.         private ASTList classList;
  27.         private PackageScope scope;
  28.        
  29.         internal Package(string name, AST id, ASTList classList, Context context) : base(context)
  30.         {
  31.             this.name = name;
  32.             this.classList = classList;
  33.             this.scope = (PackageScope)Globals.ScopeStack.Peek();
  34.             this.scope.owner = this;
  35.             this.Engine.AddPackage(this.scope);
  36.             Lookup simpleId = id as Lookup;
  37.             if (simpleId != null)
  38.                 simpleId.EvaluateAsWrappedNamespace(true);
  39.             else {
  40.                 Member qualifiedId = id as Member;
  41.                 if (qualifiedId != null)
  42.                     qualifiedId.EvaluateAsWrappedNamespace(true);
  43.             }
  44.         }
  45.        
  46.         internal override object Evaluate()
  47.         {
  48.             Globals.ScopeStack.Push(this.scope);
  49.             try {
  50.                 for (int i = 0int n = this.classList.count; i < n; i++)
  51.                     this.classList[i].Evaluate();
  52.                 return new Completion();
  53.             }
  54.             finally {
  55.                 Globals.ScopeStack.Pop();
  56.             }
  57.         }
  58.        
  59.         public static void JScriptPackage(string rootName, VsaEngine engine)
  60.         {
  61.             GlobalScope scope = ((IActivationObject)engine.ScriptObjectStackTop()).GetGlobalScope();
  62.             FieldInfo field = scope.GetLocalField(rootName);
  63.             if (field == null)
  64.                 field = scope.AddNewField(rootName, Namespace.GetNamespace(rootName, engine), FieldAttributes.Public | FieldAttributes.Literal);
  65.         }
  66.        
  67.         internal void MergeWith(Package p)
  68.         {
  69.             for (int i = 0int n = p.classList.count; i < n; i++)
  70.                 this.classList.Append(p.classList[i]);
  71.             this.scope.MergeWith(p.scope);
  72.         }
  73.        
  74.         internal override AST PartiallyEvaluate()
  75.         {
  76.             this.scope.AddOwnName();
  77.             Globals.ScopeStack.Push(this.scope);
  78.             try {
  79.                 for (int i = 0int n = this.classList.count; i < n; i++)
  80.                     this.classList[i].PartiallyEvaluate();
  81.                 return this;
  82.             }
  83.             finally {
  84.                 Globals.ScopeStack.Pop();
  85.             }
  86.         }
  87.        
  88.         internal override void TranslateToIL(ILGenerator il, Type rtype)
  89.         {
  90.             Globals.ScopeStack.Push(this.scope);
  91.             for (int i = 0int n = this.classList.count; i < n; i++)
  92.                 this.classList[i].TranslateToIL(il, Typeob.Void);
  93.             Globals.ScopeStack.Pop();
  94.         }
  95.        
  96.         internal override void TranslateToILInitializer(ILGenerator il)
  97.         {
  98.             string root = this.name;
  99.             int j = root.IndexOf('.');
  100.             if (j > 0)
  101.                 root = root.Substring(0, j);
  102.             il.Emit(OpCodes.Ldstr, root);
  103.             this.EmitILToLoadEngine(il);
  104.             il.Emit(OpCodes.Call, CompilerGlobals.jScriptPackageMethod);
  105.             Globals.ScopeStack.Push(this.scope);
  106.             for (int i = 0int n = this.classList.count; i < n; i++)
  107.                 this.classList[i].TranslateToILInitializer(il);
  108.             Globals.ScopeStack.Pop();
  109.         }
  110.        
  111.         internal override Context GetFirstExecutableContext()
  112.         {
  113.             return null;
  114.         }
  115.     }
  116. }

Developer Fusion