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

  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 System;
  19.     using System.Collections;
  20.     using System.Reflection;
  21.     using System.Reflection.Emit;
  22.    
  23.     public sealed class Block : AST
  24.     {
  25.         private Completion completion;
  26.         private ArrayList list;
  27.        
  28.         internal Block(Context context) : base(context)
  29.         {
  30.             this.completion = new Completion();
  31.             this.list = new ArrayList();
  32.         }
  33.        
  34.         internal void Append(AST elem)
  35.         {
  36.             this.list.Add(elem);
  37.         }
  38.        
  39.         internal void ComplainAboutAnythingOtherThanClassOrPackage()
  40.         {
  41.             for (int i = 0int n = this.list.Count; i < n; i++) {
  42.                 object elem = this.list[i];
  43.                 if (elem is Class || elem is Package || elem is Import)
  44.                     continue;
  45.                 Block b = elem as Block;
  46.                 if (b != null && b.list.Count == 0)
  47.                     continue;
  48.                 Expression e = elem as Expression;
  49.                 if (e != null && e.operand is AssemblyCustomAttributeList)
  50.                     continue;
  51.                 ((AST)elem).context.HandleError(JSError.OnlyClassesAndPackagesAllowed);
  52.                 return;
  53.             }
  54.         }
  55.        
  56.         internal override object Evaluate()
  57.         {
  58.             this.completion.Continue = 0;
  59.             this.completion.Exit = 0;
  60.             this.completion.value = null;
  61.             for (int i = 0int n = this.list.Count; i < n; i++) {
  62.                 AST elem = (AST)(this.list[i]);
  63.                 object val;
  64.                 try {
  65.                     val = elem.Evaluate();
  66.                 }
  67.                 catch (JScriptException e) {
  68.                     if (e.context == null) {
  69.                         e.context = elem.context;
  70.                     }
  71.                     throw e;
  72.                 }
  73.                 Completion c = (Completion)val;
  74.                 if (c.value != null)
  75.                     this.completion.value = c.value;
  76.                 if (c.Continue > 1) {
  77.                     this.completion.Continue = c.Continue - 1;
  78.                     break;
  79.                 }
  80.                 if (c.Exit > 0) {
  81.                     this.completion.Exit = c.Exit - 1;
  82.                     break;
  83.                 }
  84.                 if (c.Return)
  85.                     return c;
  86.             }
  87.             return this.completion;
  88.         }
  89.        
  90.         internal void EvaluateStaticVariableInitializers()
  91.         {
  92.             for (int i = 0int n = this.list.Count; i < n; i++) {
  93.                 object elem = this.list[i];
  94.                 VariableDeclaration vard = elem as VariableDeclaration;
  95.                 if (vard != null && vard.field.IsStatic && !vard.field.IsLiteral) {
  96.                     vard.Evaluate();
  97.                     continue;
  98.                 }
  99.                 StaticInitializer sinit = elem as StaticInitializer;
  100.                 if (sinit != null) {
  101.                     sinit.Evaluate();
  102.                     continue;
  103.                 }
  104.                 Class cl = elem as Class;
  105.                 if (cl != null) {
  106.                     cl.Evaluate();
  107.                     continue;
  108.                 }
  109.                 Constant cnst = elem as Constant;
  110.                 if (cnst != null && cnst.field.IsStatic) {
  111.                     cnst.Evaluate();
  112.                     continue;
  113.                 }
  114.                 Block block = elem as Block;
  115.                 if (block != null)
  116.                     block.EvaluateStaticVariableInitializers();
  117.             }
  118.         }
  119.        
  120.         internal void EvaluateInstanceVariableInitializers()
  121.         {
  122.             for (int i = 0int n = this.list.Count; i < n; i++) {
  123.                 object elem = this.list[i];
  124.                 VariableDeclaration vard = elem as VariableDeclaration;
  125.                 if (vard != null && !vard.field.IsStatic && !vard.field.IsLiteral) {
  126.                     vard.Evaluate();
  127.                     continue;
  128.                 }
  129.                 Block block = elem as Block;
  130.                 if (block != null)
  131.                     block.EvaluateInstanceVariableInitializers();
  132.             }
  133.         }
  134.        
  135.         internal override bool HasReturn()
  136.         {
  137.             for (int i = 0int n = this.list.Count; i < n; i++) {
  138.                 AST elem = (AST)(this.list[i]);
  139.                 if (elem.HasReturn())
  140.                     return true;
  141.             }
  142.             return false;
  143.         }
  144.        
  145.         internal void ProcessAssemblyAttributeLists()
  146.         {
  147.             for (int i = 0int n = this.list.Count; i < n; i++) {
  148.                 Expression expr = this.list[i] as Expression;
  149.                 if (expr != null) {
  150.                     AssemblyCustomAttributeList acl = expr.operand as AssemblyCustomAttributeList;
  151.                     if (acl != null)
  152.                         acl.Process();
  153.                 }
  154.             }
  155.         }
  156.        
  157.         internal void MarkSuperOKIfIsFirstStatement()
  158.         {
  159.             if (this.list.Count > 0 && this.list[0] is ConstructorCall)
  160.                 ((ConstructorCall)this.list[0]).isOK = true;
  161.         }
  162.        
  163.         internal override AST PartiallyEvaluate()
  164.         {
  165.             for (int i = 0int n = this.list.Count; i < n; i++) {
  166.                 AST elem = (AST)(this.list[i]);
  167.                 this.list[i] = elem.PartiallyEvaluate();
  168.             }
  169.             return this;
  170.         }
  171.        
  172.         internal Expression ToExpression()
  173.         {
  174.             if (this.list.Count == 1 && this.list[0] is Expression)
  175.                 return (Expression)this.list[0];
  176.             else
  177.                 return null;
  178.         }
  179.        
  180.         internal override void TranslateToIL(ILGenerator il, Type rtype)
  181.         {
  182.             //This assumes that rtype == Void.class
  183.             Label lab = il.DefineLabel();
  184.             compilerGlobals.BreakLabelStack.Push(lab);
  185.             compilerGlobals.ContinueLabelStack.Push(lab);
  186.             for (int i = 0int n = this.list.Count; i < n; i++) {
  187.                 AST elem = (AST)(this.list[i]);
  188.                 elem.TranslateToIL(il, Typeob.Void);
  189.             }
  190.             il.MarkLabel(lab);
  191.             compilerGlobals.BreakLabelStack.Pop();
  192.             compilerGlobals.ContinueLabelStack.Pop();
  193.         }
  194.        
  195.         internal override void TranslateToILInitializer(ILGenerator il)
  196.         {
  197.             for (int i = 0int n = this.list.Count; i < n; i++) {
  198.                 AST elem = (AST)(this.list[i]);
  199.                 elem.TranslateToILInitializer(il);
  200.             }
  201.         }
  202.        
  203.         internal void TranslateToILInitOnlyInitializers(ILGenerator il)
  204.         {
  205.             for (int i = 0int n = this.list.Count; i < n; i++) {
  206.                 Constant c = this.list[i] as Constant;
  207.                 if (c != null)
  208.                     c.TranslateToILInitOnlyInitializers(il);
  209.             }
  210.         }
  211.        
  212.         internal void TranslateToILInstanceInitializers(ILGenerator il)
  213.         {
  214.             for (int i = 0int n = this.list.Count; i < n; i++) {
  215.                 AST elem = (AST)(this.list[i]);
  216.                 if (elem is VariableDeclaration && !((VariableDeclaration)elem).field.IsStatic && !((VariableDeclaration)elem).field.IsLiteral) {
  217.                     elem.TranslateToILInitializer(il);
  218.                     elem.TranslateToIL(il, Typeob.Void);
  219.                 }
  220.                 else if (elem is FunctionDeclaration && !((FunctionDeclaration)elem).func.isStatic)
  221.                     elem.TranslateToILInitializer(il);
  222.                 else if (elem is Constant && !((Constant)elem).field.IsStatic)
  223.                     elem.TranslateToIL(il, Typeob.Void);
  224.                 else if (elem is Block)
  225.                     ((Block)elem).TranslateToILInstanceInitializers(il);
  226.             }
  227.         }
  228.        
  229.         internal void TranslateToILStaticInitializers(ILGenerator il)
  230.         {
  231.             for (int i = 0int n = this.list.Count; i < n; i++) {
  232.                 AST elem = (AST)(this.list[i]);
  233.                 if (elem is VariableDeclaration && ((VariableDeclaration)elem).field.IsStatic || elem is Constant && ((Constant)elem).field.IsStatic) {
  234.                     elem.TranslateToILInitializer(il);
  235.                     elem.TranslateToIL(il, Typeob.Void);
  236.                 }
  237.                 else if (elem is StaticInitializer)
  238.                     elem.TranslateToIL(il, Typeob.Void);
  239.                 else if (elem is FunctionDeclaration && ((FunctionDeclaration)elem).func.isStatic)
  240.                     elem.TranslateToILInitializer(il);
  241.                 else if (elem is Class)
  242.                     elem.TranslateToIL(il, Typeob.Void);
  243.                 else if (elem is Block)
  244.                     ((Block)elem).TranslateToILStaticInitializers(il);
  245.             }
  246.         }
  247.        
  248.         internal override Context GetFirstExecutableContext()
  249.         {
  250.             for (int i = 0int n = this.list.Count; i < n; i++) {
  251.                 AST elem = (AST)(this.list[i]);
  252.                 Context ctx;
  253.                 if ((ctx = elem.GetFirstExecutableContext()) != null)
  254.                     return ctx;
  255.             }
  256.             return null;
  257.         }
  258.     }
  259. }

Developer Fusion