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

  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.    
  21.     public sealed class ArrayConstructor : ScriptFunction
  22.     {
  23.         static internal readonly ArrayConstructor ob = new ArrayConstructor();
  24.        
  25.         private ArrayPrototype originalPrototype;
  26.        
  27.         internal ArrayConstructor() : base(FunctionPrototype.ob, "Array", 1)
  28.         {
  29.             this.originalPrototype = ArrayPrototype.ob;
  30.             ArrayPrototype._constructor = this;
  31.             this.proto = ArrayPrototype.ob;
  32.         }
  33.        
  34.         internal ArrayConstructor(LenientFunctionPrototype parent, LenientArrayPrototype prototypeProp) : base(parent, "Array", 1)
  35.         {
  36.             this.originalPrototype = prototypeProp;
  37.             prototypeProp.constructor = this;
  38.             this.proto = prototypeProp;
  39.             this.noExpando = false;
  40.         }
  41.        
  42.         internal override object Call(object[] args, object thisob)
  43.         {
  44.             return Construct(args);
  45.         }
  46.        
  47.         internal ArrayObject Construct()
  48.         {
  49.             return new ArrayObject(this.originalPrototype, typeof(ArrayObject));
  50.         }
  51.        
  52.         internal override object Construct(object[] args)
  53.         {
  54.             return this.CreateInstance(args);
  55.         }
  56.        
  57.         /// <summary>
  58.         /// Helper method that constructs a new JScript array and initializes it with values.
  59.         /// </summary>
  60.         /// <internalonly/>
  61.         public ArrayObject ConstructArray(object[] args)
  62.         {
  63.             ArrayObject arrayObj = new ArrayObject(originalPrototype, typeof(ArrayObject));
  64.             arrayObj.length = args.Length;
  65.             for (int i = 0; i < args.Length; i++)
  66.                 arrayObj.SetValueAtIndex((uint)i, args[i]);
  67.             return arrayObj;
  68.         }
  69.        
  70.         internal ArrayObject ConstructWrapper()
  71.         {
  72.             return new ArrayWrapper(this.originalPrototype, null, false);
  73.         }
  74.        
  75.         internal ArrayObject ConstructWrapper(Array arr)
  76.         {
  77.             return new ArrayWrapper(this.originalPrototype, arr, false);
  78.         }
  79.        
  80.         internal ArrayObject ConstructImplicitWrapper(Array arr)
  81.         {
  82.             return new ArrayWrapper(this.originalPrototype, arr, true);
  83.         }
  84.        
  85.         /// <internalonly/>
  86.         [JSFunctionAttribute(JSFunctionAttributeEnum.HasVarArgs)]
  87.         public new ArrayObject CreateInstance(params object[] args)
  88.         {
  89.             ArrayObject arrayObj = new ArrayObject(this.originalPrototype, typeof(ArrayObject));
  90.             if (args.Length != 0) {
  91.                 if (args.Length == 1) {
  92.                     object arg0 = args[0];
  93.                     IConvertible ic = Convert.GetIConvertible(arg0);
  94.                     switch (Convert.GetTypeCode(arg0, ic)) {
  95.                         case TypeCode.Char:
  96.                         case TypeCode.SByte:
  97.                         case TypeCode.Byte:
  98.                         case TypeCode.Int16:
  99.                         case TypeCode.UInt16:
  100.                         case TypeCode.Int32:
  101.                         case TypeCode.UInt32:
  102.                         case TypeCode.Int64:
  103.                         case TypeCode.UInt64:
  104.                         case TypeCode.Single:
  105.                         case TypeCode.Double:
  106.                         case TypeCode.Decimal:
  107.                             double d = Convert.ToNumber(arg0, ic);
  108.                             uint len = Convert.ToUint32(arg0, ic);
  109.                             if (d != (double)len)
  110.                                 throw new JScriptException(JSError.ArrayLengthConstructIncorrect);
  111.                             arrayObj.length = len;
  112.                             return arrayObj;
  113.                     }
  114.                 }
  115.                 if (args.Length == 1 && args[0] is Array) {
  116.                     Array array = (Array)args[0];
  117.                     if (array.Rank != 1)
  118.                         throw new JScriptException(JSError.TypeMismatch);
  119.                     arrayObj.length = array.Length;
  120.                     for (int i = 0; i < array.Length; i++)
  121.                         arrayObj.SetValueAtIndex((uint)i, array.GetValue(i));
  122.                 }
  123.                 else {
  124.                     arrayObj.length = args.Length;
  125.                     for (int i = 0; i < args.Length; i++)
  126.                         arrayObj.SetValueAtIndex((uint)i, args[i]);
  127.                 }
  128.             }
  129.             return arrayObj;
  130.         }
  131.        
  132.         [JSFunctionAttribute(JSFunctionAttributeEnum.HasVarArgs)]
  133.         public ArrayObject Invoke(params object[] args)
  134.         {
  135.             if (args.Length == 1 && args[0] is Array)
  136.                 return ConstructWrapper((Array)args[0]);
  137.             else
  138.                 return this.CreateInstance(args);
  139.         }
  140.     }
  141. }

Developer Fusion