fix crash in unsafe replacement of undefined
authoralexlamsl <alexlamsl@gmail.com>
Sat, 18 Feb 2017 10:58:23 +0000 (18:58 +0800)
committeralexlamsl <alexlamsl@gmail.com>
Sat, 18 Feb 2017 10:58:23 +0000 (18:58 +0800)
remove extraneous call to AST_SymbolRef.reference()

closes #1443

lib/compress.js
test/compress/issue-1443.js [new file with mode: 0644]

index 04aa107..a15206e 100644 (file)
@@ -2721,13 +2721,11 @@ merge(Compressor.prototype, {
             var scope = compressor.find_parent(AST_Scope);
             var undef = scope.find_variable("undefined");
             if (undef) {
-                var ref = make_node(AST_SymbolRef, self, {
+                return make_node(AST_SymbolRef, self, {
                     name   : "undefined",
                     scope  : scope,
                     thedef : undef
                 });
-                ref.reference();
-                return ref;
             }
         }
         return self;
diff --git a/test/compress/issue-1443.js b/test/compress/issue-1443.js
new file mode 100644 (file)
index 0000000..a256587
--- /dev/null
@@ -0,0 +1,69 @@
+// tests assume that variable `undefined` not redefined and has `void 0` as value
+
+unsafe_undefined: {
+    options = {
+        if_return: true,
+        unsafe: true
+    }
+    mangle = {}
+    input: {
+        function f(undefined) {
+            return function() {
+                if (a)
+                    return b;
+                if (c)
+                    return d;
+            };
+        }
+    }
+    expect: {
+        function f(n) {
+            return function() {
+                if (a)
+                    return b;
+                if (c)
+                    return d;
+                else
+                    return n;
+            };
+        }
+    }
+}
+
+keep_fnames: {
+    options = {
+        if_return: true,
+        unsafe: true
+    }
+    mangle = {
+        keep_fnames: true
+    }
+    input: {
+        function f(undefined) {
+            return function() {
+                function n(a) {
+                    return a * a;
+                }
+                if (a)
+                    return b;
+                if (c)
+                    return d;
+            };
+        }
+    }
+    expect: {
+        function f(r) {
+            return function() {
+                function n(n) {
+                    return n * n;
+                }
+                if (a)
+                    return b;
+                if (c)
+                    return d;
+                else
+                    return r;
+            };
+        }
+    }
+}