fix corner case in `inline` (#2720)
authorAlex Lam S.L <alexlamsl@gmail.com>
Thu, 4 Jan 2018 15:38:37 +0000 (23:38 +0800)
committerGitHub <noreply@github.com>
Thu, 4 Jan 2018 15:38:37 +0000 (23:38 +0800)
lib/compress.js
test/compress/functions.js

index 481af92..3a3aac4 100644 (file)
@@ -4184,16 +4184,18 @@ merge(Compressor.prototype, {
 
         function append_var(decls, expressions, name, value) {
             var def = name.definition();
-            scope.var_names()[name.name] = true;
             scope.variables.set(name.name, def);
             scope.enclosed.push(def);
-            decls.unshift(make_node(AST_VarDef, name, {
-                name: name,
-                value: null
-            }));
+            if (!scope.var_names()[name.name]) {
+                scope.var_names()[name.name] = true;
+                decls.push(make_node(AST_VarDef, name, {
+                    name: name,
+                    value: null
+                }));
+            }
             var sym = make_node(AST_SymbolRef, name, name);
             def.references.push(sym);
-            if (value) expressions.unshift(make_node(AST_Assign, self, {
+            if (value) expressions.push(make_node(AST_Assign, self, {
                 operator: "=",
                 left: sym,
                 right: value
@@ -4203,13 +4205,13 @@ merge(Compressor.prototype, {
         function flatten_args(decls, expressions) {
             var len = fn.argnames.length;
             for (var i = self.args.length; --i >= len;) {
-                expressions.unshift(self.args[i]);
+                expressions.push(self.args[i]);
             }
             for (i = len; --i >= 0;) {
                 var name = fn.argnames[i];
                 var value = self.args[i];
                 if (name.__unused || scope.var_names()[name.name]) {
-                    if (value) expressions.unshift(value);
+                    if (value) expressions.push(value);
                 } else {
                     var symbol = make_node(AST_SymbolVar, name, name);
                     name.definition().orig.push(symbol);
@@ -4217,14 +4219,16 @@ merge(Compressor.prototype, {
                     append_var(decls, expressions, symbol, value);
                 }
             }
+            decls.reverse();
+            expressions.reverse();
         }
 
         function flatten_vars(decls, expressions) {
-            if (in_loop) in_loop.length = 0;
-            for (var i = fn.body.length; --i >= 0;) {
+            var pos = expressions.length;
+            for (var i = 0, lines = fn.body.length; i < lines; i++) {
                 var stat = fn.body[i];
                 if (!(stat instanceof AST_Var)) continue;
-                for (var j = stat.definitions.length; --j >= 0;) {
+                for (var j = 0, defs = stat.definitions.length; j < defs; j++) {
                     var var_def = stat.definitions[j];
                     var name = var_def.name;
                     append_var(decls, expressions, name, var_def.value);
@@ -4232,7 +4236,7 @@ merge(Compressor.prototype, {
                         var def = name.definition();
                         var sym = make_node(AST_SymbolRef, name, name);
                         def.references.push(sym);
-                        in_loop.unshift(make_node(AST_Assign, var_def, {
+                        expressions.splice(pos++, 0, make_node(AST_Assign, var_def, {
                             operator: "=",
                             left: sym,
                             right: make_node(AST_Undefined, name)
@@ -4240,14 +4244,13 @@ merge(Compressor.prototype, {
                     }
                 }
             }
-            if (in_loop) [].unshift.apply(expressions, in_loop);
         }
 
         function flatten_fn() {
             var decls = [];
             var expressions = [];
-            flatten_vars(decls, expressions);
             flatten_args(decls, expressions);
+            flatten_vars(decls, expressions);
             expressions.push(value);
             if (decls.length) {
                 i = scope.body.indexOf(compressor.parent(level - 1)) + 1;
index 5b0c49b..f466208 100644 (file)
@@ -1887,3 +1887,21 @@ use_before_init_in_loop: {
     }
     expect_stdout: "PASS"
 }
+
+duplicate_arg_var: {
+    options = {
+        inline: true,
+        toplevel: true,
+    }
+    input: {
+        console.log(function(b) {
+            return b;
+            var b;
+        }("PASS"));
+    }
+    expect: {
+        console.log((b = "PASS", b));
+        var b;
+    }
+    expect_stdout: "PASS"
+}