Skip to content

Commit 27b23c0

Browse files
committed
fixed detection of free vars while evaluating
1 parent a648f11 commit 27b23c0

2 files changed

Lines changed: 33 additions & 15 deletions

File tree

lib/Parser.js

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -167,21 +167,26 @@ Parser.prototype.initializeEvaluating = function() {
167167
this.plugin("evaluate UnaryExpression", function(expr) {
168168
if(expr.operator === "typeof") {
169169
if(expr.argument.type === "Identifier") {
170-
var res = this.applyPluginsBailResult("evaluate typeof " + expr.argument.name, expr);
171-
if(res !== undefined) return res;
170+
var name = this.scope.renames["$"+expr.argument.name] || expr.argument.name;
171+
if(this.scope.definitions.indexOf(name) === -1) {
172+
var res = this.applyPluginsBailResult("evaluate typeof " + name, expr);
173+
if(res !== undefined) return res;
174+
}
172175
}
173176
if(expr.argument.type === "MemberExpression") {
174177
var expression = expr.argument;
175178
var exprName = [];
176179
while(expression.type === "MemberExpression" && expression.property.type === "Identifier") {
177-
exprName.unshift(expression.property.name);
180+
exprName.unshift(this.scope.renames["$"+expression.property.name] || expression.property.name);
178181
expression = expression.object;
179182
}
180-
if(expression.type === "Identifier" && this.scope.definitions.indexOf(expression.name) === -1) {
183+
if(expression.type === "Identifier") {
181184
exprName.unshift(this.scope.renames["$"+expression.name] || expression.name);
182-
exprName = exprName.join(".");
183-
var res = this.applyPluginsBailResult("evaluate typeof " + exprName, expr);
184-
if(res !== undefined) return res;
185+
if(this.scope.definitions.indexOf(name) === -1) {
186+
exprName = exprName.join(".");
187+
var res = this.applyPluginsBailResult("evaluate typeof " + exprName, expr);
188+
if(res !== undefined) return res;
189+
}
185190
}
186191
}
187192
if(expr.argument.type === "FunctionExpression") {
@@ -222,14 +227,17 @@ Parser.prototype.initializeEvaluating = function() {
222227
expr = expr.object;
223228
}
224229
if(expr.type === "Identifier") {
225-
exprName.unshift(this.scope.renames["$"+expr.name] || expr.name);
226-
exprName = exprName.join(".");
227-
if(this.scope.definitions.indexOf(expr.name) === -1) {
228-
var result = this.applyPluginsBailResult("evaluate Identifier " + exprName, expression);
229-
if(result) return result;
230-
return new BasicEvaluatedExpression().setIdentifier(exprName).setRange(expression.range);
231-
} else {
232-
return this.applyPluginsBailResult("evaluate defined Identifier " + exprName, expression);
230+
var name = this.scope.renames["$"+expr.name] || expr.name;
231+
if(this.scope.definitions.indexOf(name) === -1) {
232+
exprName.unshift(name);
233+
exprName = exprName.join(".");
234+
if(this.scope.definitions.indexOf(expr.name) === -1) {
235+
var result = this.applyPluginsBailResult("evaluate Identifier " + exprName, expression);
236+
if(result) return result;
237+
return new BasicEvaluatedExpression().setIdentifier(exprName).setRange(expression.range);
238+
} else {
239+
return this.applyPluginsBailResult("evaluate defined Identifier " + exprName, expression);
240+
}
233241
}
234242
}
235243
});
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
var fn = function(module) {
2+
if (typeof module !== 'number') {
3+
throw new Error("module should be a number");
4+
}
5+
(typeof module).should.be.eql("number");
6+
};
7+
8+
it("should hide a free var by function argument", function() {
9+
fn(1);
10+
});

0 commit comments

Comments
 (0)