Skip to content

Commit dffedcc

Browse files
committed
reduce memory usage
1 parent c10da6c commit dffedcc

File tree

1 file changed

+132
-65
lines changed

1 file changed

+132
-65
lines changed

lib/Parser.js

Lines changed: 132 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -311,15 +311,21 @@ class Parser extends Tapable {
311311
if(expr.argument.type === "Identifier") {
312312
name = this.scope.renames.get(expr.argument.name) || expr.argument.name;
313313
if(!this.scope.definitions.has(name)) {
314-
res = this.hooks.evaluateTypeof.for(name).call(expr);
315-
if(res !== undefined) return res;
314+
const hook = this.hooks.evaluateTypeof.get(name);
315+
if(hook !== undefined) {
316+
res = hook.call(expr);
317+
if(res !== undefined) return res;
318+
}
316319
}
317320
}
318321
if(expr.argument.type === "MemberExpression") {
319322
const exprName = this.getNameForExpression(expr.argument);
320323
if(exprName && exprName.free) {
321-
res = this.hooks.evaluateTypeof.for(exprName.name).call(expr);
322-
if(res !== undefined) return res;
324+
const hook = this.hooks.evaluateTypeof.get(exprName.name);
325+
if(hook !== undefined) {
326+
res = hook.call(expr);
327+
if(res !== undefined) return res;
328+
}
323329
}
324330
}
325331
if(expr.argument.type === "FunctionExpression") {
@@ -352,30 +358,45 @@ class Parser extends Tapable {
352358
this.plugin("evaluate Identifier", expr => {
353359
const name = this.scope.renames.get(expr.name) || expr.name;
354360
if(!this.scope.definitions.has(expr.name)) {
355-
const result = this.hooks.evaluateIdentifier.for(name).call(expr);
356-
if(result) return result;
361+
const hook = this.hooks.evaluateIdentifier.get(name);
362+
if(hook !== undefined) {
363+
const result = hook.call(expr);
364+
if(result) return result;
365+
}
357366
return new BasicEvaluatedExpression().setIdentifier(name).setRange(expr.range);
358367
} else {
359-
return this.hooks.evaluateDefinedIdentifier.for(name).call(expr);
368+
const hook = this.hooks.evaluateDefinedIdentifier.get(name);
369+
if(hook !== undefined) {
370+
return hook.call(expr);
371+
}
360372
}
361373
});
362374
this.plugin("evaluate ThisExpression", expr => {
363375
const name = this.scope.renames.get("this");
364376
if(name) {
365-
const result = this.hooks.evaluateIdentifier.for(name).call(expr);
366-
if(result) return result;
377+
const hook = this.hooks.evaluateIdentifier.get(name);
378+
if(hook !== undefined) {
379+
const result = hook.call(expr);
380+
if(result) return result;
381+
}
367382
return new BasicEvaluatedExpression().setIdentifier(name).setRange(expr.range);
368383
}
369384
});
370385
this.plugin("evaluate MemberExpression", expression => {
371386
let exprName = this.getNameForExpression(expression);
372387
if(exprName) {
373388
if(exprName.free) {
374-
const result = this.hooks.evaluateIdentifier.for(exprName.name).call(expression);
375-
if(result) return result;
389+
const hook = this.hooks.evaluateIdentifier.get(exprName.name);
390+
if(hook !== undefined) {
391+
const result = hook.call(expression);
392+
if(result) return result;
393+
}
376394
return new BasicEvaluatedExpression().setIdentifier(exprName.name).setRange(expression.range);
377395
} else {
378-
return this.hooks.evaluateDefinedIdentifier.for(exprName.name).call(expression);
396+
const hook = this.hooks.evaluateDefinedIdentifier.get(exprName.name);
397+
if(hook !== undefined) {
398+
return hook.call(expression);
399+
}
379400
}
380401
}
381402
});
@@ -385,7 +406,10 @@ class Parser extends Tapable {
385406
const param = this.evaluateExpression(expr.callee.object);
386407
if(!param) return;
387408
const property = expr.callee.property.name || expr.callee.property.value;
388-
return this.hooks.evaluateCallExpressionMember.for(property).call(expr, param);
409+
const hook = this.hooks.evaluateCallExpressionMember.get(property);
410+
if(hook !== undefined) {
411+
return hook.call(expr, param);
412+
}
389413
});
390414
this.plugin("evaluate CallExpression .replace", (expr, param) => {
391415
if(!param.isString()) return;
@@ -631,9 +655,13 @@ class Parser extends Tapable {
631655
}
632656

633657
walkLabeledStatement(statement) {
634-
const result = this.hooks.label.for(statement.label.name).call(statement);
635-
if(result !== true)
636-
this.walkStatement(statement.body);
658+
const hook = this.hooks.label.get(statement.label.name);
659+
if(hook !== undefined) {
660+
const result = hook.call(statement);
661+
if(result === true)
662+
return;
663+
}
664+
this.walkStatement(statement.body);
637665
}
638666

639667
prewalkWithStatement(statement) {
@@ -938,8 +966,10 @@ class Parser extends Tapable {
938966
const hookMap = declarator.kind === "const" ? this.hooks.varDeclarationConst :
939967
declarator.kind === "let" ? this.hooks.varDeclarationLet :
940968
this.hooks.varDeclarationVar;
941-
if(!hookMap.for(name).call(decl)) {
942-
if(!this.hooks.varDeclaration.for(name).call(decl)) {
969+
const hook = hookMap.get(name);
970+
if(hook === undefined || !hook.call(decl)) {
971+
const hook = this.hooks.varDeclaration.get(name);
972+
if(hook === undefined || !hook.call(decl)) {
943973
this.scope.renames.set(name, null);
944974
this.scope.definitions.add(name);
945975
}
@@ -957,17 +987,21 @@ class Parser extends Tapable {
957987
case "VariableDeclarator":
958988
{
959989
const renameIdentifier = declarator.init && this.getRenameIdentifier(declarator.init);
960-
if(renameIdentifier && declarator.id.type === "Identifier" && this.hooks.canRename.for(renameIdentifier).call(declarator.init)) {
961-
// renaming with "var a = b;"
962-
if(!this.hooks.rename.for(renameIdentifier).call(declarator.init)) {
963-
this.scope.renames.set(declarator.id.name, this.scope.renames.get(renameIdentifier) || renameIdentifier);
964-
this.scope.definitions.delete(declarator.id.name);
990+
if(renameIdentifier && declarator.id.type === "Identifier") {
991+
const hook = this.hooks.canRename.get(renameIdentifier);
992+
if(hook !== undefined && hook.call(declarator.init)) {
993+
// renaming with "var a = b;"
994+
const hook = this.hooks.rename.get(renameIdentifier);
995+
if(hook === undefined || !hook.call(declarator.init)) {
996+
this.scope.renames.set(declarator.id.name, this.scope.renames.get(renameIdentifier) || renameIdentifier);
997+
this.scope.definitions.delete(declarator.id.name);
998+
}
999+
break;
9651000
}
966-
} else {
967-
this.walkPattern(declarator.id);
968-
if(declarator.init)
969-
this.walkExpression(declarator.init);
9701001
}
1002+
this.walkPattern(declarator.id);
1003+
if(declarator.init)
1004+
this.walkExpression(declarator.init);
9711005
break;
9721006
}
9731007
}
@@ -1093,9 +1127,12 @@ class Parser extends Tapable {
10931127
if(expression.operator === "typeof") {
10941128
const exprName = this.getNameForExpression(expression.argument);
10951129
if(exprName && exprName.free) {
1096-
const result = this.hooks.typeof.for(exprName.name).call(expression);
1097-
if(result === true)
1098-
return;
1130+
const hook = this.hooks.typeof.get(exprName.name);
1131+
if(hook !== undefined) {
1132+
const result = hook.call(expression);
1133+
if(result === true)
1134+
return;
1135+
}
10991136
}
11001137
}
11011138
this.walkExpression(expression.argument);
@@ -1116,27 +1153,35 @@ class Parser extends Tapable {
11161153

11171154
walkAssignmentExpression(expression) {
11181155
const renameIdentifier = this.getRenameIdentifier(expression.right);
1119-
if(expression.left.type === "Identifier" && renameIdentifier && this.hooks.canRename.for(renameIdentifier).call(expression.right)) {
1120-
// renaming "a = b;"
1121-
if(!this.hooks.rename.for(renameIdentifier).call(expression.right)) {
1122-
this.scope.renames.set(expression.left.name, renameIdentifier);
1123-
this.scope.definitions.delete(expression.left.name);
1156+
if(expression.left.type === "Identifier" && renameIdentifier) {
1157+
const hook = this.hooks.canRename.get(renameIdentifier);
1158+
if(hook !== undefined && hook.call(expression.right)) {
1159+
// renaming "a = b;"
1160+
const hook = this.hooks.rename.get(renameIdentifier);
1161+
if(hook === undefined || !hook.call(expression.right)) {
1162+
this.scope.renames.set(expression.left.name, renameIdentifier);
1163+
this.scope.definitions.delete(expression.left.name);
1164+
}
1165+
return;
11241166
}
1125-
} else if(expression.left.type === "Identifier") {
1126-
if(!this.hooks.assigned.for(expression.left.name).call(expression)) {
1167+
}
1168+
if(expression.left.type === "Identifier") {
1169+
const assignedHook = this.hooks.assigned.get(expression.left.name);
1170+
if(assignedHook === undefined || !assignedHook.call(expression)) {
11271171
this.walkExpression(expression.right);
11281172
}
11291173
this.scope.renames.set(expression.left.name, null);
1130-
if(!this.hooks.assign.for(expression.left.name).call(expression)) {
1174+
const assignHook = this.hooks.assign.get(expression.left.name);
1175+
if(assignHook === undefined || !assignHook.call(expression)) {
11311176
this.walkExpression(expression.left);
11321177
}
1133-
} else {
1134-
this.walkExpression(expression.right);
1135-
this.walkPattern(expression.left);
1136-
this.enterPattern(expression.left, (name, decl) => {
1137-
this.scope.renames.set(name, null);
1138-
});
1178+
return;
11391179
}
1180+
this.walkExpression(expression.right);
1181+
this.walkPattern(expression.left);
1182+
this.enterPattern(expression.left, (name, decl) => {
1183+
this.scope.renames.set(name, null);
1184+
});
11401185
}
11411186

11421187
walkConditionalExpression(expression) {
@@ -1187,9 +1232,13 @@ class Parser extends Tapable {
11871232
const walkIIFE = (functionExpression, options, currentThis) => {
11881233
const renameArgOrThis = argOrThis => {
11891234
const renameIdentifier = this.getRenameIdentifier(argOrThis);
1190-
if(renameIdentifier && this.hooks.canRename.for(renameIdentifier).call(argOrThis)) {
1191-
if(!this.hooks.rename.for(renameIdentifier).call(argOrThis))
1192-
return renameIdentifier;
1235+
if(renameIdentifier) {
1236+
const hook = this.hooks.canRename.get(renameIdentifier);
1237+
if(hook !== undefined && hook.call(argOrThis)) {
1238+
const hook = this.hooks.rename.get(renameIdentifier);
1239+
if(hook === undefined || !hook.call(argOrThis))
1240+
return renameIdentifier;
1241+
}
11931242
}
11941243
this.walkExpression(argOrThis);
11951244
};
@@ -1236,15 +1285,21 @@ class Parser extends Tapable {
12361285

12371286
const callee = this.evaluateExpression(expression.callee);
12381287
if(callee.isIdentifier()) {
1239-
result = this.hooks.call.for(callee.identifier).call(expression);
1240-
if(result === true)
1241-
return;
1242-
let identifier = callee.identifier.replace(/\.[^.]+$/, "");
1243-
if(identifier !== callee.identifier) {
1244-
result = this.hooks.callAnyMember.for(identifier).call(expression);
1288+
const callHook = this.hooks.call.get(callee.identifier);
1289+
if(callHook !== undefined) {
1290+
result = callHook.call(expression);
12451291
if(result === true)
12461292
return;
12471293
}
1294+
let identifier = callee.identifier.replace(/\.[^.]+$/, "");
1295+
if(identifier !== callee.identifier) {
1296+
const callAnyHook = this.hooks.callAnyMember.get(identifier);
1297+
if(callAnyHook !== undefined) {
1298+
result = callAnyHook.call(expression);
1299+
if(result === true)
1300+
return;
1301+
}
1302+
}
12481303
}
12491304

12501305
if(expression.callee)
@@ -1257,12 +1312,18 @@ class Parser extends Tapable {
12571312
walkMemberExpression(expression) {
12581313
const exprName = this.getNameForExpression(expression);
12591314
if(exprName && exprName.free) {
1260-
let result = this.hooks.expression.for(exprName.name).call(expression);
1261-
if(result === true)
1262-
return;
1263-
result = this.hooks.expressionAnyMember.for(exprName.nameGeneral).call(expression);
1264-
if(result === true)
1265-
return;
1315+
const expressionHook = this.hooks.expression.get(exprName.name);
1316+
if(expressionHook !== undefined) {
1317+
const result = expressionHook.call(expression);
1318+
if(result === true)
1319+
return;
1320+
}
1321+
const expressionAnyMemberHook = this.hooks.expressionAnyMember.get(exprName.nameGeneral);
1322+
if(expressionAnyMemberHook !== undefined) {
1323+
const result = expressionAnyMemberHook.call(expression);
1324+
if(result === true)
1325+
return;
1326+
}
12661327
}
12671328
this.walkExpression(expression.object);
12681329
if(expression.computed === true)
@@ -1271,9 +1332,12 @@ class Parser extends Tapable {
12711332

12721333
walkIdentifier(expression) {
12731334
if(!this.scope.definitions.has(expression.name)) {
1274-
const result = this.hooks.expression.for(this.scope.renames.get(expression.name) || expression.name).call(expression);
1275-
if(result === true)
1276-
return;
1335+
const hook = this.hooks.expression.for(this.scope.renames.get(expression.name) || expression.name);
1336+
if(hook !== undefined) {
1337+
const result = hook.call(expression);
1338+
if(result === true)
1339+
return;
1340+
}
12771341
}
12781342
}
12791343

@@ -1339,9 +1403,12 @@ class Parser extends Tapable {
13391403

13401404
evaluateExpression(expression) {
13411405
try {
1342-
const result = this.hooks.evaluate.for(expression.type).call(expression);
1343-
if(result !== undefined)
1344-
return result;
1406+
const hook = this.hooks.evaluate.get(expression.type);
1407+
if(hook !== undefined) {
1408+
const result = hook.call(expression);
1409+
if(result !== undefined)
1410+
return result;
1411+
}
13451412
} catch(e) {
13461413
console.warn(e);
13471414
// ignore error

0 commit comments

Comments
 (0)