blob: 92aaf1a3160b3919887359348bc3d678fec6a91b [file] [log] [blame]
// Copyright (C) 2020 Alexey Shvayka. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-function.prototype.bind
description: >
"length" value of a bound function is non-negative integer.
ToInteger is performed on "length" value of target function.
info: |
Function.prototype.bind ( thisArg, ...args )
[...]
5. Let targetHasLength be ? HasOwnProperty(Target, "length").
6. If targetHasLength is true, then
a. Let targetLen be ? Get(Target, "length").
b. If Type(targetLen) is Number, then
i. If targetLen is +∞𝔽, set L to +∞.
ii. Else if targetLen is -∞𝔽, set L to 0.
iii. Else,
1. Let targetLenAsInt be ! ToIntegerOrInfinity(targetLen).
2. Assert: targetLenAsInt is finite.
3. Let argCount be the number of elements in args.
4. Set L to max(targetLenAsInt - argCount, 0).
7. Perform ! SetFunctionLength(F, L).
[...]
ToInteger ( argument )
1. Let number be ? ToNumber(argument).
2. If number is NaN, +0, or -0, return +0.
3. If number is +∞ or -∞, return number.
4. Let integer be the Number value that is the same sign as number and whose magnitude is floor(abs(number)).
5. If integer is -0, return +0.
6. Return integer.
---*/
function fn() {}
Object.defineProperty(fn, "length", {value: NaN});
assert.sameValue(fn.bind().length, 0);
Object.defineProperty(fn, "length", {value: -0});
assert.sameValue(fn.bind().length, 0);
Object.defineProperty(fn, "length", {value: Infinity});
assert.sameValue(fn.bind().length, Infinity, "target length of infinity, zero bound arguments");
assert.sameValue(fn.bind(0, 0).length, Infinity, "target length of infinity, one bound argument");
Object.defineProperty(fn, "length", {value: -Infinity});
assert.sameValue(fn.bind().length, 0, "target length of negative infinity, zero bound arguments");
assert.sameValue(fn.bind(0, 0).length, 0, "target length of negative infinity, one bound argument");
Object.defineProperty(fn, "length", {value: 3.66});
assert.sameValue(fn.bind().length, 3);
Object.defineProperty(fn, "length", {value: -0.77});
assert.sameValue(fn.bind().length, 0);