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

  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.Diagnostics;
  20.     using System.Reflection;
  21.    
  22.     public sealed class ObjectConstructor : ScriptFunction
  23.     {
  24.         static internal readonly ObjectConstructor ob = new ObjectConstructor();
  25.        
  26.         internal ObjectPrototype originalPrototype;
  27.        
  28.         internal ObjectConstructor() : base(FunctionPrototype.ob, "Object", 1)
  29.         {
  30.             this.originalPrototype = ObjectPrototype.ob;
  31.             ObjectPrototype._constructor = this;
  32.             this.proto = ObjectPrototype.ob;
  33.         }
  34.        
  35.         internal ObjectConstructor(LenientFunctionPrototype parent, LenientObjectPrototype prototypeProp) : base(parent, "Object", 1)
  36.         {
  37.             this.originalPrototype = prototypeProp;
  38.             prototypeProp.constructor = this;
  39.             this.proto = prototypeProp;
  40.             this.noExpando = false;
  41.         }
  42.        
  43.         internal override object Call(object[] args, object thisob)
  44.         {
  45.             if (args.Length == 0)
  46.                 return this.ConstructObject();
  47.             object val = args[0];
  48.             if (val == null || val == DBNull.Value)
  49.                 return this.Construct(args);
  50.             else
  51.                 return Convert.ToObject3(val, this.engine);
  52.         }
  53.        
  54.         internal override object Construct(object[] args)
  55.         {
  56.             if (args.Length == 0)
  57.                 return this.ConstructObject();
  58.             object val = args[0];
  59.             switch (Convert.GetTypeCode(val)) {
  60.                 case TypeCode.Empty:
  61.                 case TypeCode.DBNull:
  62.                     return this.ConstructObject();
  63.                 case TypeCode.Object:
  64.                     if (val is ScriptObject)
  65.                         return val;
  66.                     IReflect ir = null;
  67.                     if (val is IReflect)
  68.                         ir = (IReflect)val;
  69.                     else
  70.                         ir = val.GetType();
  71.                     const BindingFlags flags = BindingFlags.Public | BindingFlags.OptionalParamBinding | BindingFlags.CreateInstance;
  72.                     return ir.InvokeMember(String.Empty, flags, JSBinder.ob, val, new object[0], null, null, null);
  73.             }
  74.             return Convert.ToObject3(val, this.engine);
  75.         }
  76.        
  77.         public JSObject ConstructObject()
  78.         {
  79.             return new JSObject(this.originalPrototype, false);
  80.         }
  81.        
  82.         [JSFunctionAttribute(JSFunctionAttributeEnum.HasVarArgs)]
  83.         public new object CreateInstance(params object[] args)
  84.         {
  85.             return this.Construct(args);
  86.         }
  87.        
  88.         [JSFunctionAttribute(JSFunctionAttributeEnum.HasVarArgs)]
  89.         public object Invoke(params object[] args)
  90.         {
  91.             return this.Call(args, null);
  92.         }
  93.        
  94.     }
  95. }

Developer Fusion