Ejemplo n.º 1
0
        private static IDynamic Bind(IEnvironment environment, IArgs args)
        {
            var callable = environment.Context.ThisBinding as ICallable;

            if (callable == null)
            {
                throw environment.CreateTypeError("");
            }

            var target   = (IObject)callable;
            var thisArg  = args[0];
            var callArgs = environment.EmptyArgs;
            var func     = new NBoundFunction(environment);

            if (args.Count > 1)
            {
                callArgs = environment.CreateArgs(args.Skip(1));
            }

            func.Class          = "Function";
            func.Extensible     = true;
            func.Prototype      = environment.FunctionPrototype;
            func.TargetFunction = target;
            func.BoundThis      = thisArg;
            func.BoundArguments = callArgs;

            var length = 0.0;

            if (target.Class == "Function")
            {
                length = callArgs.Count - target.Get("length").ConvertToUInt32().BaseValue;
            }

            var lengthNum = environment.CreateNumber(length);
            var thrower   = environment.ThrowTypeErrorFunction;
            var desc      = environment.CreateDataDescriptor(lengthNum, false, false, false);

            func.DefineOwnProperty("length", desc, false);
            desc = environment.CreateAccessorDescriptor(thrower, thrower, false, false);
            func.DefineOwnProperty("caller", desc, false);
            func.DefineOwnProperty("arguments", desc, false);

            return(func);
        }
Ejemplo n.º 2
0
        private static IDynamic Bind(IEnvironment environment, IArgs args)
        {
            var callable = environment.Context.ThisBinding as ICallable;
            if (callable == null)
            {
                throw environment.CreateTypeError("");
            }

            var target = (IObject)callable;
            var thisArg = args[0];
            var callArgs = environment.EmptyArgs;
            var func = new NBoundFunction(environment);

            if (args.Count > 1)
            {
                callArgs = environment.CreateArgs(args.Skip(1));
            }

            func.Class = "Function";
            func.Extensible = true;
            func.Prototype = environment.FunctionPrototype;
            func.TargetFunction = target;
            func.BoundThis = thisArg;
            func.BoundArguments = callArgs;

            var length = 0.0;
            if (target.Class == "Function")
            {
                length = callArgs.Count - target.Get("length").ConvertToUInt32().BaseValue;
            }

            var lengthNum = environment.CreateNumber(length);
            var thrower = environment.ThrowTypeErrorFunction;
            var desc = environment.CreateDataDescriptor(lengthNum, false, false, false);

            func.DefineOwnProperty("length", desc, false);
            desc = environment.CreateAccessorDescriptor(thrower, thrower, false, false);
            func.DefineOwnProperty("caller", desc, false);
            func.DefineOwnProperty("arguments", desc, false);

            return func;
        }