fix corner case in `functions` (#3367)
authorAlex Lam S.L <alexlamsl@gmail.com>
Thu, 18 Apr 2019 18:55:43 +0000 (02:55 +0800)
committerGitHub <noreply@github.com>
Thu, 18 Apr 2019 18:55:43 +0000 (02:55 +0800)
fixes #3366

lib/compress.js
test/compress/functions.js
test/sandbox.js

index f5479be..f72972b 100644 (file)
@@ -3602,7 +3602,7 @@ merge(Compressor.prototype, {
                             compressor.warn("Declaring {name} as function [{file}:{line},{col}]", template(def.name));
                             var defun = make_node(AST_Defun, def, def.value);
                             defun.name = make_node(AST_SymbolDefun, def.name, def.name);
-                            defun.parent_scope.resolve().def_function(defun.name);
+                            def.name.scope.resolve().def_function(defun.name);
                             body.push(defun);
                         } else {
                             if (side_effects.length > 0) {
index c43c17e..7303b91 100644 (file)
@@ -2981,3 +2981,34 @@ issue_3364: {
     }
     expect_stdout: "2"
 }
+
+issue_3366: {
+    options = {
+        functions: true,
+        inline: true,
+        reduce_vars: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        function f() {
+            function g() {
+                return function() {};
+            }
+            var a = g();
+            (function() {
+                this && a && console.log("PASS");
+            })();
+        }
+        f();
+    }
+    expect: {
+        (function() {
+            function a() {}
+            (function() {
+                this && a && console.log("PASS");
+            })();
+        })();
+    }
+    expect_stdout: "PASS"
+}
index 23fb4fc..396a08f 100644 (file)
@@ -73,8 +73,10 @@ exports.run_code = function(code, reuse) {
         process.stdout.write = original_write;
         if (!reuse || code.indexOf(".prototype") >= 0) {
             context = null;
-        } else for (var key in context) {
-            delete context[key];
+        } else {
+            vm.runInContext(Object.keys(context).map(function(name) {
+                return "delete " + name;
+            }).join("\n"), context);
         }
     }
 };