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

  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 Instanceof : BinaryOp
  23.     {
  24.        
  25.         internal Instanceof(Context context, AST operand1, AST operand2) : base(context, operand1, operand2)
  26.         {
  27.         }
  28.        
  29.         internal override object Evaluate()
  30.         {
  31.             object v1 = this.operand1.Evaluate();
  32.             object v2 = this.operand2.Evaluate();
  33.             try {
  34.                 return JScriptInstanceof(v1, v2);
  35.             }
  36.             catch (JScriptException e) {
  37.                 if (e.context == null)
  38.                     e.context = this.operand2.context;
  39.                 throw e;
  40.             }
  41.         }
  42.        
  43.         internal override IReflect InferType(JSField inference_target)
  44.         {
  45.             return Typeob.Boolean;
  46.         }
  47.        
  48.         public static bool JScriptInstanceof(object v1, object v2)
  49.         {
  50.             if (v2 is ClassScope)
  51.                 return ((ClassScope)v2).HasInstance(v1);
  52.             if (v2 is ScriptFunction)
  53.                 return ((ScriptFunction)v2).HasInstance(v1);
  54.             if (v1 == null)
  55.                 return false;
  56.             if (v2 is Type) {
  57.                 Type t1 = v1.GetType();
  58.                 if (v1 is IConvertible)
  59.                     try {
  60.                         Convert.CoerceT(v1, (Type)v2);
  61.                         return true;
  62.                     }
  63.                     catch (JScriptException) {
  64.                         return false;
  65.                     }
  66.                 else
  67.                     return ((Type)v2).IsAssignableFrom(t1);
  68.             }
  69.            
  70.            
  71.             throw new JScriptException(JSError.NeedType);
  72.         }
  73.        
  74.         internal override void TranslateToIL(ILGenerator il, Type rtype)
  75.         {
  76.             this.operand1.TranslateToIL(il, Typeob.Object);
  77.             object val = null;
  78.             if (this.operand2 is ConstantWrapper && (val = this.operand2.Evaluate()) is Type && !((Type)val).IsValueType) {
  79.                 il.Emit(OpCodes.Isinst, (Type)val);
  80.                 il.Emit(OpCodes.Ldnull);
  81.                 il.Emit(OpCodes.Cgt_Un);
  82.             }
  83.             else if (val is ClassScope) {
  84.                 il.Emit(OpCodes.Isinst, ((ClassScope)val).GetTypeBuilderOrEnumBuilder());
  85.                 il.Emit(OpCodes.Ldnull);
  86.                 il.Emit(OpCodes.Cgt_Un);
  87.             }
  88.             else {
  89.                 this.operand2.TranslateToIL(il, Typeob.Object);
  90.                 il.Emit(OpCodes.Call, CompilerGlobals.jScriptInstanceofMethod);
  91.             }
  92.             Convert.Emit(this, il, Typeob.Boolean, rtype);
  93.         }
  94.     }
  95. }

Developer Fusion