| '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; | |
| };
 |