Skip to content

Commit

Permalink
Merge pull request #5315 from webpack/performance/no-unshift
Browse files Browse the repository at this point in the history
rewrite code which uses unshift to push
  • Loading branch information
sokra committed Jul 19, 2017
2 parents cc459eb + b9adfaa commit 048b300
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 62 deletions.
108 changes: 51 additions & 57 deletions lib/Parser.js
Expand Up @@ -214,19 +214,10 @@ class Parser extends Tapable {
}
}
if(expr.argument.type === "MemberExpression") {
let expression = expr.argument;
let exprName = [];
while(expression.type === "MemberExpression" && !expression.computed) {
exprName.unshift(this.scope.renames["$" + expression.property.name] || expression.property.name);
expression = expression.object;
}
if(expression.type === "Identifier") {
exprName.unshift(this.scope.renames["$" + expression.name] || expression.name);
if(this.scope.definitions.indexOf(name) === -1) {
exprName = exprName.join(".");
res = this.applyPluginsBailResult1("evaluate typeof " + exprName, expr);
if(res !== undefined) return res;
}
const exprName = this.getNameForExpression(expr.argument);
if(exprName && exprName.free) {
res = this.applyPluginsBailResult1("evaluate typeof " + exprName.name, expr);
if(res !== undefined) return res;
}
}
if(expr.argument.type === "FunctionExpression") {
Expand Down Expand Up @@ -275,24 +266,14 @@ class Parser extends Tapable {
}
});
this.plugin("evaluate MemberExpression", function(expression) {
let expr = expression;
let exprName = [];
while(expr.type === "MemberExpression" && expr.property.type === (expr.computed ? "Literal" : "Identifier")) {
exprName.unshift(expr.property.name || expr.property.value);
expr = expr.object;
}
if(expr.type === "Identifier") {
const name = this.scope.renames["$" + expr.name] || expr.name;
if(this.scope.definitions.indexOf(name) === -1) {
exprName.unshift(name);
exprName = exprName.join(".");
if(this.scope.definitions.indexOf(expr.name) === -1) {
const result = this.applyPluginsBailResult1("evaluate Identifier " + exprName, expression);
if(result) return result;
return new BasicEvaluatedExpression().setIdentifier(exprName).setRange(expression.range);
} else {
return this.applyPluginsBailResult1("evaluate defined Identifier " + exprName, expression);
}
let exprName = this.getNameForExpression(expression);
if(exprName) {
if(exprName.free) {
const result = this.applyPluginsBailResult1("evaluate Identifier " + exprName.name, expression);
if(result) return result;
return new BasicEvaluatedExpression().setIdentifier(exprName.name).setRange(expression.range);
} else {
return this.applyPluginsBailResult1("evaluate defined Identifier " + exprName.name, expression);
}
}
});
Expand Down Expand Up @@ -970,16 +951,9 @@ class Parser extends Tapable {

walkUnaryExpression(expression) {
if(expression.operator === "typeof") {
let expr = expression.argument;
let exprName = [];
while(expr.type === "MemberExpression" && expr.property.type === (expr.computed ? "Literal" : "Identifier")) {
exprName.unshift(expr.property.name || expr.property.value);
expr = expr.object;
}
if(expr.type === "Identifier" && this.scope.definitions.indexOf(expr.name) === -1) {
exprName.unshift(this.scope.renames["$" + expr.name] || expr.name);
exprName = exprName.join(".");
const result = this.applyPluginsBailResult1("typeof " + exprName, expression);
const exprName = this.getNameForExpression(expression.argument);
if(exprName && exprName.free) {
const result = this.applyPluginsBailResult1("typeof " + exprName.name, expression);
if(result === true)
return;
}
Expand Down Expand Up @@ -1144,24 +1118,12 @@ class Parser extends Tapable {
}

walkMemberExpression(expression) {
let expr = expression;
let exprName = [];
while(expr.type === "MemberExpression" && expr.property.type === (expr.computed ? "Literal" : "Identifier")) {
exprName.unshift(expr.property.name || expr.property.value);
expr = expr.object;
}
if((expr.type === "Identifier" && this.scope.definitions.indexOf(expr.name) === -1) ||
(expr.type === "ThisExpression" && this.scope.renames.$this)) {
if(expr.type === "ThisExpression") {
exprName.unshift(this.scope.renames.$this);
} else {
exprName.unshift(this.scope.renames["$" + expr.name] || expr.name);
}
let result = this.applyPluginsBailResult1("expression " + exprName.join("."), expression);
const exprName = this.getNameForExpression(expression);
if(exprName && exprName.free) {
let result = this.applyPluginsBailResult1("expression " + exprName.name, expression);
if(result === true)
return;
exprName[exprName.length - 1] = "*";
result = this.applyPluginsBailResult1("expression " + exprName.join("."), expression);
result = this.applyPluginsBailResult1("expression " + exprName.nameGeneral, expression);
if(result === true)
return;
}
Expand Down Expand Up @@ -1430,6 +1392,38 @@ class Parser extends Tapable {
return options.reduce((o, i) => Object.assign(o, i), {});
}

getNameForExpression(expression) {
let expr = expression;
const exprName = [];
while(expr.type === "MemberExpression" && expr.property.type === (expr.computed ? "Literal" : "Identifier")) {
exprName.push(expr.computed ? expr.property.value : expr.property.name);
expr = expr.object;
}
let free;
if(expr.type === "Identifier") {
free = this.scope.definitions.indexOf(expr.name) === -1;
exprName.push(this.scope.renames["$" + expr.name] || expr.name);
} else if(expr.type === "ThisExpression" && this.scope.renames.$this) {
free = true;
exprName.push(this.scope.renames.$this);
} else if(expr.type === "ThisExpression") {
free = false;
exprName.push("this");
} else {
return null;
}
let prefix = "";
for(let i = exprName.length - 1; i >= 1; i--)
prefix += exprName[i] + ".";
const name = prefix + exprName[0];
const nameGeneral = prefix + "*";
return {
name,
nameGeneral,
free
};
}

}

Parser.ECMA_VERSION = ECMA_VERSION;
Expand Down
6 changes: 3 additions & 3 deletions lib/RecordIdsPlugin.js
Expand Up @@ -47,12 +47,12 @@ class RecordIdsPlugin {
const p = block.parent;
const idx = p.blocks.indexOf(block);
const l = p.blocks.length - 1;
ident.unshift(`${idx}/${l}`);
ident.push(`${idx}/${l}`);
block = block.parent;
}
if(!block.identifier) return null;
ident.unshift(identifierUtils.makePathsRelative(compiler.context, block.identifier()));
return ident.join(":");
ident.push(identifierUtils.makePathsRelative(compiler.context, block.identifier()));
return ident.reverse().join(":");
}
compilation.plugin("record-chunks", (chunks, records) => {
records.nextFreeChunkId = compilation.nextFreeChunkId;
Expand Down
4 changes: 2 additions & 2 deletions lib/Stats.js
Expand Up @@ -687,9 +687,9 @@ class Stats {
const path = [];
let current = module;
while(current.issuer) {
path.unshift(current = current.issuer);
path.push(current = current.issuer);
}
path.forEach(module => {
path.reverse().forEach(module => {
colors.normal("[");
colors.normal(module.id);
colors.normal("] ");
Expand Down

0 comments on commit 048b300

Please sign in to comment.