simplify optimization code

This commit is contained in:
Ondrej Kraus 2015-02-25 12:14:53 +01:00
parent 8f540dfff3
commit 662bddbaca

View File

@ -32,10 +32,10 @@ var memberExpressionVisitor = {
} }
}; };
function optimizeMemberExpression(node, parent, offset) { function optimizeMemberExpression(node, parent, offset, strictMode) {
var newExpr; var newExpr;
var prop = parent.property; var prop = parent.property;
if (t.isLiteral(prop)) { if (t.isLiteral(prop)) {
node.name = 'arguments'; node.name = 'arguments';
prop.value += offset; prop.value += offset;
@ -49,17 +49,12 @@ function optimizeMemberExpression(node, parent, offset) {
newExpr = t.binaryExpression('+', prop, t.literal(offset)); newExpr = t.binaryExpression('+', prop, t.literal(offset));
parent.property = newExpr; parent.property = newExpr;
} }
}
function optimizeMemberExpressionStrict(node, parent, offset) { if (strictMode && node.name !== 'arguments') {
// handle basic expressions specially (especially literals)
optimizeMemberExpression(node, parent, offset);
if (node.name === 'arguments') return;
var prop = parent.property;
node.name = 'arguments'; node.name = 'arguments';
parent.property = t.binaryExpression('+', prop, t.literal(offset)); parent.property = t.binaryExpression('+', prop, t.literal(offset));
} }
}
var hasRest = function (node) { var hasRest = function (node) {
return t.isRestElement(node.params[node.params.length - 1]); return t.isRestElement(node.params[node.params.length - 1]);
@ -98,10 +93,9 @@ exports.Function = function (node, parent, scope, file) {
scope.traverse(node, memberExpressionVisitor, state); scope.traverse(node, memberExpressionVisitor, state);
if (state.isOptimizable) { if (state.isOptimizable) {
var optimize = state.strictMode ? optimizeMemberExpressionStrict : optimizeMemberExpression;
for (var i = 0, count = state.candidates.length; i < count; ++i) { for (var i = 0, count = state.candidates.length; i < count; ++i) {
var candidate = state.candidates[i]; var candidate = state.candidates[i];
optimize(candidate.node, candidate.parent, node.params.length); optimizeMemberExpression(candidate.node, candidate.parent, node.params.length, state.strictMode);
} }
return; return;
} }