Skip to content

Commit

Permalink
fix corner case in functions (#3403)
Browse files Browse the repository at this point in the history
fixes #3402
  • Loading branch information
alexlamsl committed May 11, 2019
1 parent 5476cb8 commit 9fc8cd4
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 0 deletions.
8 changes: 8 additions & 0 deletions lib/compress.js
Expand Up @@ -3682,6 +3682,7 @@ merge(Compressor.prototype, {
} else if (compressor.option("functions")
&& def.value === def.name.fixed_value()
&& def.value instanceof AST_Function
&& !(def.value.name && def.value.name.definition().assignments)
&& can_rename(def.value, def.name.name)
&& (!compressor.has_directive("use strict") || parent instanceof AST_Scope)) {
AST_Node.warn("Declaring {name} as function [{file}:{line},{col}]", template(def.name));
Expand Down Expand Up @@ -6301,6 +6302,13 @@ merge(Compressor.prototype, {
expression: self.left
});
}
if (!compressor.option("ie8") && self.left instanceof AST_Symbol && self.left.is_immutable()) {
return (self.operator == "=" ? self.right : make_node(AST_Binary, self, {
operator: self.operator.slice(0, -1),
left: self.left,
right: self.right
})).optimize(compressor);
}
return self;

function in_try(level, node) {
Expand Down
36 changes: 36 additions & 0 deletions test/compress/assignment.js
Expand Up @@ -311,3 +311,39 @@ issue_3375: {
}
expect_stdout: "string"
}

issue_3402: {
options = {
assignments: true,
evaluate: true,
functions: true,
passes: 2,
reduce_vars: true,
side_effects: true,
toplevel: true,
typeofs: true,
unused: true,
}
input: {
var f = function f() {
f = 42;
console.log(typeof f);
};
"function" == typeof f && f();
"function" == typeof f && f();
console.log(typeof f);
}
expect: {
function f() {
console.log(typeof f);
}
f();
f();
console.log(typeof f);
}
expect_stdout: [
"function",
"function",
"function",
]
}
35 changes: 35 additions & 0 deletions test/compress/functions.js
Expand Up @@ -3113,3 +3113,38 @@ issue_3400: {
"42",
]
}

issue_3402: {
options = {
evaluate: true,
functions: true,
reduce_vars: true,
side_effects: true,
toplevel: true,
typeofs: true,
unused: true,
}
input: {
var f = function f() {
f = 42;
console.log(typeof f);
};
"function" == typeof f && f();
"function" == typeof f && f();
console.log(typeof f);
}
expect: {
var f = function f() {
f = 42;
console.log(typeof f);
};
f();
f();
console.log(typeof f);
}
expect_stdout: [
"function",
"function",
"function",
]
}

0 comments on commit 9fc8cd4

Please sign in to comment.