55 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						|
 | 
						|
var toPosInt = require("../number/to-pos-integer");
 | 
						|
 | 
						|
var test = function (arg1, arg2) { return arg2; };
 | 
						|
 | 
						|
var desc, defineProperty, generate, mixin;
 | 
						|
 | 
						|
try {
 | 
						|
	Object.defineProperty(test, "length", {
 | 
						|
		configurable: true,
 | 
						|
		writable: false,
 | 
						|
		enumerable: false,
 | 
						|
		value: 1
 | 
						|
	});
 | 
						|
}
 | 
						|
catch (ignore) {}
 | 
						|
 | 
						|
if (test.length === 1) {
 | 
						|
	// ES6
 | 
						|
	desc = { configurable: true, writable: false, enumerable: false };
 | 
						|
	defineProperty = Object.defineProperty;
 | 
						|
	module.exports = function (fn, length) {
 | 
						|
		length = toPosInt(length);
 | 
						|
		if (fn.length === length) return fn;
 | 
						|
		desc.value = length;
 | 
						|
		return defineProperty(fn, "length", desc);
 | 
						|
	};
 | 
						|
} else {
 | 
						|
	mixin = require("../object/mixin");
 | 
						|
	generate = (function () {
 | 
						|
		var cache = [];
 | 
						|
		return function (length) {
 | 
						|
			var args, i = 0;
 | 
						|
			if (cache[length]) return cache[length];
 | 
						|
			args = [];
 | 
						|
			while (length--) args.push("a" + (++i).toString(36));
 | 
						|
			// eslint-disable-next-line no-new-func
 | 
						|
			return new Function(
 | 
						|
				"fn",
 | 
						|
				"return function (" + args.join(", ") + ") { return fn.apply(this, arguments); };"
 | 
						|
			);
 | 
						|
		};
 | 
						|
	})();
 | 
						|
	module.exports = function (src, length) {
 | 
						|
		var target;
 | 
						|
		length = toPosInt(length);
 | 
						|
		if (src.length === length) return src;
 | 
						|
		target = generate(length)(src);
 | 
						|
		try { mixin(target, src); }
 | 
						|
		catch (ignore) {}
 | 
						|
		return target;
 | 
						|
	};
 | 
						|
}
 |