You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.3 KiB
55 lines
1.3 KiB
'use strict'; |
|
|
|
var implementation = require('./implementation'); |
|
|
|
var lacksProperEnumerationOrder = function () { |
|
if (!Object.assign) { |
|
return false; |
|
} |
|
/* |
|
* v8, specifically in node 4.x, has a bug with incorrect property enumeration order |
|
* note: this does not detect the bug unless there's 20 characters |
|
*/ |
|
var str = 'abcdefghijklmnopqrst'; |
|
var letters = str.split(''); |
|
var map = {}; |
|
for (var i = 0; i < letters.length; ++i) { |
|
map[letters[i]] = letters[i]; |
|
} |
|
var obj = Object.assign({}, map); |
|
var actual = ''; |
|
for (var k in obj) { |
|
actual += k; |
|
} |
|
return str !== actual; |
|
}; |
|
|
|
var assignHasPendingExceptions = function () { |
|
if (!Object.assign || !Object.preventExtensions) { |
|
return false; |
|
} |
|
/* |
|
* Firefox 37 still has "pending exception" logic in its Object.assign implementation, |
|
* which is 72% slower than our shim, and Firefox 40's native implementation. |
|
*/ |
|
var thrower = Object.preventExtensions({ 1: 2 }); |
|
try { |
|
Object.assign(thrower, 'xy'); |
|
} catch (e) { |
|
return thrower[1] === 'y'; |
|
} |
|
return false; |
|
}; |
|
|
|
module.exports = function getPolyfill() { |
|
if (!Object.assign) { |
|
return implementation; |
|
} |
|
if (lacksProperEnumerationOrder()) { |
|
return implementation; |
|
} |
|
if (assignHasPendingExceptions()) { |
|
return implementation; |
|
} |
|
return Object.assign; |
|
};
|
|
|