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.
		
		
		
		
		
			
		
			
				
					48 lines
				
				1.3 KiB
			
		
		
			
		
	
	
					48 lines
				
				1.3 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var bind = require('function-bind');
							 | 
						||
| 
								 | 
							
								var GetIntrinsic = require('get-intrinsic');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var $apply = GetIntrinsic('%Function.prototype.apply%');
							 | 
						||
| 
								 | 
							
								var $call = GetIntrinsic('%Function.prototype.call%');
							 | 
						||
| 
								 | 
							
								var $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true);
							 | 
						||
| 
								 | 
							
								var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);
							 | 
						||
| 
								 | 
							
								var $max = GetIntrinsic('%Math.max%');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if ($defineProperty) {
							 | 
						||
| 
								 | 
							
									try {
							 | 
						||
| 
								 | 
							
										$defineProperty({}, 'a', { value: 1 });
							 | 
						||
| 
								 | 
							
									} catch (e) {
							 | 
						||
| 
								 | 
							
										// IE 8 has a broken defineProperty
							 | 
						||
| 
								 | 
							
										$defineProperty = null;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = function callBind(originalFunction) {
							 | 
						||
| 
								 | 
							
									var func = $reflectApply(bind, $call, arguments);
							 | 
						||
| 
								 | 
							
									if ($gOPD && $defineProperty) {
							 | 
						||
| 
								 | 
							
										var desc = $gOPD(func, 'length');
							 | 
						||
| 
								 | 
							
										if (desc.configurable) {
							 | 
						||
| 
								 | 
							
											// original length, plus the receiver, minus any additional arguments (after the receiver)
							 | 
						||
| 
								 | 
							
											$defineProperty(
							 | 
						||
| 
								 | 
							
												func,
							 | 
						||
| 
								 | 
							
												'length',
							 | 
						||
| 
								 | 
							
												{ value: 1 + $max(0, originalFunction.length - (arguments.length - 1)) }
							 | 
						||
| 
								 | 
							
											);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return func;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var applyBind = function applyBind() {
							 | 
						||
| 
								 | 
							
									return $reflectApply(bind, $apply, arguments);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if ($defineProperty) {
							 | 
						||
| 
								 | 
							
									$defineProperty(module.exports, 'apply', { value: applyBind });
							 | 
						||
| 
								 | 
							
								} else {
							 | 
						||
| 
								 | 
							
									module.exports.apply = applyBind;
							 | 
						||
| 
								 | 
							
								}
							 |