enhance `arguments` (#4296)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 18 Nov 2020 03:39:32 +0000 (03:39 +0000)
committerGitHub <noreply@github.com>
Wed, 18 Nov 2020 03:39:32 +0000 (11:39 +0800)
lib/compress.js
test/compress/arguments.js

index e05b6f2..2a8ba8a 100644 (file)
@@ -9572,13 +9572,14 @@ merge(Compressor.prototype, {
             }
         }
         var parent = compressor.parent();
+        var assigned = is_lhs(compressor.self(), parent);
         var def, fn, fn_parent;
         if (compressor.option("arguments")
             && expr instanceof AST_SymbolRef
             && is_arguments(def = expr.definition())
             && prop instanceof AST_Number
             && (fn = expr.scope.resolve()) === find_lambda()
-            && fn.uses_arguments !== "d") {
+            && !(assigned && fn.uses_arguments === "d")) {
             var index = prop.value;
             if (parent instanceof AST_UnaryPrefix && parent.operator == "delete") {
                 if (!def.deleted) def.deleted = [];
@@ -9616,7 +9617,7 @@ merge(Compressor.prototype, {
                 return sym;
             }
         }
-        if (is_lhs(compressor.self(), parent)) return self;
+        if (assigned) return self;
         if (compressor.option("sequences")
             && parent.TYPE != "Call"
             && !(parent instanceof AST_ForIn && parent.init === self)) {
index 37307ed..4b09a99 100644 (file)
@@ -808,7 +808,7 @@ issue_4200: {
     expect_stdout: "undefined"
 }
 
-issue_4291: {
+issue_4291_1: {
     options = {
         arguments: true,
         keep_fargs: "strict",
@@ -827,3 +827,27 @@ issue_4291: {
     }
     expect_stdout: "PASS"
 }
+
+issue_4291_2: {
+    options = {
+        arguments: true,
+        keep_fargs: "strict",
+    }
+    input: {
+        var a = function() {
+            if (arguments[0])
+                arguments[1] = "PASS";
+            return arguments;
+        }(42);
+        console.log(a[1], a[0], a.length);
+    }
+    expect: {
+        var a = function(argument_0) {
+            if (argument_0)
+                arguments[1] = "PASS";
+            return arguments;
+        }(42);
+        console.log(a[1], a[0], a.length);
+    }
+    expect_stdout: "PASS 42 1"
+}