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); }
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; }