Fix _.createCallback perf regression.

Former-commit-id: a66821a2c4aa3bae626e19ef638a27689b96dc24
This commit is contained in:
John-David Dalton
2013-07-25 09:05:43 -07:00
parent 56ff8755d4
commit bb58d633c0
2 changed files with 11 additions and 14 deletions

View File

@@ -1634,9 +1634,8 @@
// remove `__bindData__` logic and `setBindData` function calls from `_.createCallback` // remove `__bindData__` logic and `setBindData` function calls from `_.createCallback`
source = source.replace(matchFunction(source, 'createCallback'), function(match) { source = source.replace(matchFunction(source, 'createCallback'), function(match) {
return match return match
.replace(/^( *)var bindData *=[\s\S]+?\n\1}\n/m, '') .replace(/(?:\s*\/\/.*)\n( *)var bindData *=[\s\S]+?\n\1}/, '')
.replace(/\s*\|\|\s*!bindData\b/, '') .replace(/(?:\s*\/\/.*)\n( *)if *\(bindData[\s\S]+?\n\1}/, '');
.replace(/^( *)else if \(bindData[\s\S]+?\n\1}\n/m, '')
}); });
return source; return source;
@@ -2729,7 +2728,7 @@
} }
if (isLegacy || isMobile || isUnderscore) { if (isLegacy || isMobile || isUnderscore) {
_.each(['createBound', 'createCallback'], function(funcName) { _.each(['createBound', 'createCallback'], function(funcName) {
funcDependencyMap[funcName] = _.without(funcDependencyMap[funcName], 'bind', 'setBindData'); funcDependencyMap[funcName] = _.without(funcDependencyMap[funcName], 'setBindData');
}); });
} }
if (_.contains(plusFuncs, 'chain') == !isUnderscore) { if (_.contains(plusFuncs, 'chain') == !isUnderscore) {

View File

@@ -4848,20 +4848,20 @@
return result; return result;
}; };
} }
var bindData = func.__bindData__; // exit early if there is no `thisArg`
if (typeof thisArg == 'undefined') {
return func;
}
var bindData = !func.name || func.__bindData__;
if (typeof bindData == 'undefined') { if (typeof bindData == 'undefined') {
// checks if `func` references the `this` keyword and stores the result // checks if `func` references the `this` keyword and stores the result
bindData = !reThis || reThis.test(fnToString.call(func)); bindData = !reThis || reThis.test(fnToString.call(func));
setBindData(func, bindData); setBindData(func, bindData);
} }
if (typeof thisArg == 'undefined' || !bindData) { // exit early if there are no `this` references or `func` is bound
if (bindData !== true && !(bindData && bindData[4])) {
return func; return func;
} }
else if (bindData !== true) {
// exit early if already bound or leverage bind optimizations if
// created by `_.partial` or `_.partialRight`
return bindData[4] ? bind(func, thisArg) : func;
}
switch (argCount) { switch (argCount) {
case 1: return function(value) { case 1: return function(value) {
return func.call(thisArg, value); return func.call(thisArg, value);
@@ -4876,9 +4876,7 @@
return func.call(thisArg, accumulator, value, index, collection); return func.call(thisArg, accumulator, value, index, collection);
}; };
} }
return function() { return bind(func, thisArg);
return func.apply(thisArg, arguments);
};
} }
/** /**