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

  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.Reflection;
  20.     using System.Reflection.Emit;
  21.    
  22.     public sealed class Throw : AST
  23.     {
  24.         private AST operand;
  25.        
  26.         internal Throw(Context context, AST operand) : base(context)
  27.         {
  28.             this.operand = operand;
  29.         }
  30.        
  31.         internal override object Evaluate()
  32.         {
  33.             if (this.operand == null) {
  34.                 ScriptObject scope = this.Engine.ScriptObjectStackTop();
  35.                 while (scope != null) {
  36.                     BlockScope bscope = scope as BlockScope;
  37.                     if (bscope != null && bscope.catchHanderScope) {
  38.                         throw (Exception)(bscope.GetFields(BindingFlags.Public | BindingFlags.Static)[0].GetValue(null));
  39.                     }
  40.                 }
  41.             }
  42.             throw JScriptThrow(this.operand.Evaluate());
  43.         }
  44.        
  45.         internal override bool HasReturn()
  46.         {
  47.             return true;
  48.         }
  49.        
  50.         public static Exception JScriptThrow(object value)
  51.         {
  52.             if (value is Exception)
  53.                 return (Exception)value;
  54.             else if (value is ErrorObject && ((ErrorObject)value).exception is Exception)
  55.                 return ((Exception)((ErrorObject)value).exception);
  56.             else
  57.                 return new JScriptException(value, null);
  58.         }
  59.        
  60.         internal override AST PartiallyEvaluate()
  61.         {
  62.             if (this.operand == null) {
  63.                 BlockScope bscope = null;
  64.                 for (ScriptObject scope = this.Engine.ScriptObjectStackTop(); scope != null; scope = scope.GetParent()) {
  65.                     if (scope is WithObject)
  66.                         continue;
  67.                     bscope = scope as BlockScope;
  68.                     if (bscope == null)
  69.                         break;
  70.                     if (bscope.catchHanderScope)
  71.                         break;
  72.                 }
  73.                 if (bscope == null) {
  74.                     this.context.HandleError(JSError.BadThrow);
  75.                     this.operand = new ConstantWrapper(null, this.context);
  76.                 }
  77.             }
  78.             else
  79.                 this.operand = this.operand.PartiallyEvaluate();
  80.             return this;
  81.         }
  82.        
  83.         internal override void TranslateToIL(ILGenerator il, Type rtype)
  84.         {
  85.             this.context.EmitLineInfo(il);
  86.             if (this.operand == null) {
  87.                 il.Emit(OpCodes.Rethrow);
  88.                 return;
  89.             }
  90.             IReflect ir = this.operand.InferType(null);
  91.             if (ir is Type && Typeob.Exception.IsAssignableFrom((Type)ir))
  92.                 this.operand.TranslateToIL(il, (Type)ir);
  93.             else {
  94.                 this.operand.TranslateToIL(il, Typeob.Object);
  95.                 il.Emit(OpCodes.Call, CompilerGlobals.jScriptThrowMethod);
  96.             }
  97.             il.Emit(OpCodes.Throw);
  98.         }
  99.        
  100.         internal override void TranslateToILInitializer(ILGenerator il)
  101.         {
  102.             if (this.operand != null)
  103.                 this.operand.TranslateToILInitializer(il);
  104.         }
  105.     }
  106. }

Developer Fusion