Permalink
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
codeql-action/node_modules/object.assign/polyfill.js
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
55 lines (51 sloc)
1.27 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'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; | |
}; |