Exemple #1
0
        public static Constant map(Constant _this, Constant[] arguments, Scope scope)
        {
            var array = (Javascript.Array)_this;

            if (arguments.Length != 1)
            {
                throw new Javascript.TypeError("Array.map takes one argument");
            }

            var callback = (Javascript.Function)arguments[0];

            var result = new Javascript.Array();

            for (int i = 0; i < array.List.Count; i++)
            {
                var callbackArguments = new ArgumentList()
                {
                    Arguments = new List <Expression>()
                    {
                        array.List[i],
                        new Javascript.Number(i),
                        array
                    }
                };
                var value = callback.Call(callbackArguments, Static.Undefined, scope);
                result.List.Add(value);
            }

            return(result);
        }
Exemple #2
0
        public static Constant slice(Constant _this, Constant[] arguments, Scope scope)
        {
            var array = (Javascript.Array)_this;

            var begin = (int)(arguments.Length > 0 ? ((Javascript.Number)arguments[0]).Value : 0);
            var end   = (int)(arguments.Length > 1 ? ((Javascript.Number)arguments[1]).Value : array.List.Count);

            var result = new Javascript.Array();

            for (int i = begin; i < end; i++)
            {
                result.List.Add(array.List[i]);
            }

            return(result);
        }
Exemple #3
0
 public Javascript.Object InvokeMember(int index, string[] names, Javascript.Array arguments)
 {
     if (index + 1 == names.Length)
     {
         try{
             return(((FunctionBase)this[names[index]]).Invoke(this, arguments));
         }catch (System.NullReferenceException e) {
             //※: 一回目の NullReferenceException は時間がかかる
             throw new Null.UndefinedException(e);
         }catch (System.InvalidCastException e) {
             throw new System.Exception("指定したオブジェクトは関数ではありません", e);
         }catch (System.Exception e) { throw e; }
     }
     else
     {
         return(this[names[index]].InvokeMember(index + 1, names, arguments));
     }
 }
Exemple #4
0
        public static Constant filter(Constant _this, Constant[] arguments, Scope scope)
        {
            var array = (Javascript.Array)_this;

            if (arguments.Length == 0 || arguments.Length > 2)
            {
                throw new Javascript.TypeError("Array.filter takes one or two argument");
            }

            var callback = (Javascript.Function)arguments[0];

            var result = new Javascript.Array();

            for (int i = 0; i < array.List.Count; i++)
            {
                var element = array.List[i];

                var callbackArguments = new ArgumentList()
                {
                    Arguments = new List <Expression>()
                    {
                        element,
                        new Javascript.Number(i),
                        array
                    }
                };

                var value = callback.Call(callbackArguments, arguments.Length == 1 ? Static.Undefined : arguments[1], scope);
                if (value is Javascript.Boolean)
                {
                    if (((Javascript.Boolean)value).Value)
                    {
                        result.List.Add(element);
                    }
                }
            }

            return(result);
        }
Exemple #5
0
        public static Constant splice(Constant _this, Constant[] arguments, Scope scope)
        {
            var array = (Javascript.Array)_this;

            var start = arguments.Length > 0 ? (int)Tool.GetArgument <Javascript.Number>(arguments, 0, "Array.splice").Value : 0;
            var count = (int)(arguments.Length > 1 ? ((Javascript.Number)arguments[1]).Value : array.List.Count - start);

            // Remove items
            var result = new Javascript.Array();

            result.List.AddRange(array.List.GetRange(start, count));
            array.List.RemoveRange(start, count);

            // Add items
            var addCount = arguments.Length <= 2 ? 0 : arguments.Length - 2;

            for (var i = 0; i < addCount; i++)
            {
                array.List.Insert(start + i, arguments[i + 2]);
            }

            return(result);
        }