Skip to content

Commit

Permalink
Merge pull request #32 from spicyj/bugtest
Browse files Browse the repository at this point in the history
Add feature test against buggy V8 versions
  • Loading branch information
sophiebits committed May 2, 2016
1 parent 060d566 commit 0c1671e
Showing 1 changed file with 45 additions and 1 deletion.
46 changes: 45 additions & 1 deletion index.js
Expand Up @@ -11,7 +11,51 @@ function toObject(val) {
return Object(val);
}

module.exports = Object.assign || function (target, source) {
function shouldUseNative() {
try {
if (!Object.assign) {
return false;
}

// Detect buggy property enumeration order in older V8 versions.

// https://bugs.chromium.org/p/v8/issues/detail?id=4118
var test1 = new String('abc'); // eslint-disable-line
test1[5] = 'de';
if (Object.getOwnPropertyNames(test1)[0] === '5') {
return false;
}

// https://bugs.chromium.org/p/v8/issues/detail?id=3056
var test2 = {};
for (var i = 0; i < 10; i++) {
test2['_' + String.fromCharCode(i)] = i;
}
var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
return test2[n];
});
if (order2.join('') !== '0123456789') {
return false;
}

// https://bugs.chromium.org/p/v8/issues/detail?id=3056
var test3 = {};
'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
test3[letter] = letter;
});
if (Object.keys(Object.assign({}, test3)).join('') !==
'abcdefghijklmnopqrst') {
return false;
}

return true;
} catch (e) {
// We don't expect any of the above to throw, but better to be safe.
return false;
}
}

module.exports = shouldUseNative() ? Object.assign : function (target, source) {
var from;
var to = toObject(target);
var symbols;
Expand Down

0 comments on commit 0c1671e

Please sign in to comment.