mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1054426 - Make Object.assign skip null/undefined source arguments if any are passed, to match not-yet-drafted semantics agreed upon in TC39 meeting minutes. Also fixes Facebook bustage. r=mjrosenb over IRC
--HG-- extra : rebase_source : 02f55cca55098b9c72a0dae193bb43c64a4b932b
This commit is contained in:
parent
cd69e77d58
commit
8c16a1018b
@ -14,8 +14,14 @@ function ObjectStaticAssign(target, firstSource) {
|
||||
// Step 4.
|
||||
var i = 1;
|
||||
do {
|
||||
// Step 5.a-b.
|
||||
// Step 5.a-b, plus an unspecified flourish to skip null/undefined, so
|
||||
// any site depending on agreed-upon (but not-yet-drafted) semantics
|
||||
// from TC39 meeting minutes will work. (Yes, implausibly, such a site
|
||||
// exists. See bug 1054426.)
|
||||
var nextSource = arguments[i];
|
||||
if (nextSource === null || nextSource === undefined)
|
||||
continue;
|
||||
|
||||
var from = ToObject(nextSource);
|
||||
|
||||
// Step 5.c-d.
|
||||
@ -58,8 +64,7 @@ function ObjectStaticAssign(target, firstSource) {
|
||||
// Step 5.k.
|
||||
if (pendingException !== MISSING)
|
||||
throw pendingException;
|
||||
i++;
|
||||
} while (i < arguments.length);
|
||||
} while (++i < arguments.length);
|
||||
|
||||
// Step 6.
|
||||
return to;
|
||||
|
@ -38,12 +38,27 @@ function basicSymbols() {
|
||||
}
|
||||
basicSymbols();
|
||||
|
||||
// Calls ToObject() for target and source
|
||||
// Calls ToObject() for target, skips null/undefined sources, uses
|
||||
// ToObject(source) otherwise.
|
||||
function testToObject() {
|
||||
assertThrowsInstanceOf(() => Object.assign(null, null), TypeError);
|
||||
assertThrowsInstanceOf(() => Object.assign(), TypeError);
|
||||
assertThrowsInstanceOf(() => Object.assign(null, {}), TypeError);
|
||||
assertThrowsInstanceOf(() => Object.assign({}, null), TypeError);
|
||||
assertEq(Object.assign({}, null) instanceof Object, true);
|
||||
assertEq(Object.assign({}, undefined) instanceof Object, true);
|
||||
|
||||
// Technically an embedding could have this as extension acting differently
|
||||
// from ours, so a feature-test is inadequate. We can move this subtest
|
||||
// into extensions/ if that ever matters.
|
||||
if (typeof objectEmulatingUndefined === "function") {
|
||||
var falsyObject = objectEmulatingUndefined();
|
||||
falsyObject.foo = 7;
|
||||
|
||||
var obj = Object.assign({}, falsyObject);
|
||||
assertEq(obj instanceof Object, true);
|
||||
assertEq(obj.foo, 7);
|
||||
}
|
||||
|
||||
assertEq(Object.assign(true, {}) instanceof Boolean, true);
|
||||
assertEq(Object.assign(1, {}) instanceof Number, true);
|
||||
assertEq(Object.assign("string", {}) instanceof String, true);
|
||||
|
Loading…
Reference in New Issue
Block a user