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

  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 Typeof : UnaryOp
  24.     {
  25.         internal Typeof(Context context, AST operand) : base(context, operand)
  26.         {
  27.         }
  28.        
  29.         internal override object Evaluate()
  30.         {
  31.             try {
  32.                 return JScriptTypeof(this.operand.Evaluate(), VsaEngine.executeForJSEE);
  33.             }
  34.             catch (JScriptException e) {
  35.                 if ((e.Number & 65535) == (int)JSError.UndefinedIdentifier)
  36.                     return "undefined";
  37.                 throw e;
  38.             }
  39.         }
  40.        
  41.         internal override IReflect InferType(JSField inference_target)
  42.         {
  43.             return Typeob.String;
  44.         }
  45.        
  46.         public static string JScriptTypeof(object value)
  47.         {
  48.             return JScriptTypeof(value, false);
  49.         }
  50.        
  51.         static internal string JScriptTypeof(object value, bool checkForDebuggerObject)
  52.         {
  53.             switch (Convert.GetTypeCode(value)) {
  54.                 case TypeCode.Empty:
  55.                     return "undefined";
  56.                 case TypeCode.DBNull:
  57.                     return "object";
  58.                 case TypeCode.Object:
  59.                     if (value is Missing || value is System.Reflection.Missing)
  60.                         return "undefined";
  61.                     return value is ScriptFunction ? "function" : "object";
  62.                 case TypeCode.Boolean:
  63.                     return "boolean";
  64.                 case TypeCode.Char:
  65.                 case TypeCode.String:
  66.                     return "string";
  67.                 case TypeCode.SByte:
  68.                 case TypeCode.Byte:
  69.                 case TypeCode.Int16:
  70.                 case TypeCode.UInt16:
  71.                 case TypeCode.Int32:
  72.                 case TypeCode.UInt32:
  73.                 case TypeCode.Int64:
  74.                 case TypeCode.UInt64:
  75.                 case TypeCode.Single:
  76.                 case TypeCode.Double:
  77.                 case TypeCode.Decimal:
  78.                     return "number";
  79.                 case TypeCode.DateTime:
  80.                     return "date";
  81.             }
  82.             return "unknown";
  83.         }
  84.        
  85.         internal override void TranslateToIL(ILGenerator il, Type rtype)
  86.         {
  87.             if (this.operand is Binding)
  88.                 ((Binding)this.operand).TranslateToIL(il, Typeob.Object, true);
  89.             else
  90.                 //Make sure that no exception is thrown if the operand is an undefined identifier
  91.                 this.operand.TranslateToIL(il, Typeob.Object);
  92.             il.Emit(OpCodes.Call, CompilerGlobals.jScriptTypeofMethod);
  93.             Convert.Emit(this, il, Typeob.String, rtype);
  94.         }
  95.     }
  96. }

Developer Fusion