From: Alex Lam S.L Date: Thu, 26 Oct 2017 18:33:37 +0000 (+0800) Subject: fix `reduce_vars` on `AST_Array.length` (#2404) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=9b0f86f5a136f57dece826c3ec9b632a0d0cb53a;p=UglifyJS.git fix `reduce_vars` on `AST_Array.length` (#2404) --- diff --git a/lib/compress.js b/lib/compress.js index 073399b5..a2dd243f 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -572,7 +572,9 @@ merge(Compressor.prototype, { if (key instanceof AST_Node) return null; var value; if (obj instanceof AST_Array) { - value = obj.elements[key]; + var elements = obj.elements; + if (key == "length") return make_node_from_constant(elements.length, obj); + if (typeof key == "number" && key in elements) value = elements[key]; } else if (obj instanceof AST_Object) { var props = obj.properties; for (var i = props.length; --i >= 0;) { diff --git a/test/compress/arrays.js b/test/compress/arrays.js index 539dfb04..27400901 100644 --- a/test/compress/arrays.js +++ b/test/compress/arrays.js @@ -131,6 +131,7 @@ for_loop: { evaluate: true, reduce_vars: true, unsafe: true, + unused: true, }; input: { function f0() { @@ -166,7 +167,7 @@ for_loop: { function f1() { var a = [1, 2, 3]; var b = 0; - for (var i = 0, len = a.length; i < len; i++) + for (var i = 0; i < 3; i++) b += a[i]; return b; } @@ -180,3 +181,57 @@ for_loop: { } expect_stdout: "6 6 4" } + +index: { + options = { + evaluate: true, + reduce_vars: true, + toplevel: true, + unsafe: true, + unused: true, + } + input: { + var a = [ 1, 2 ]; + console.log(a[0], a[1]); + } + expect: { + console.log(1, 2); + } + expect_stdout: "1 2" +} + +length: { + options = { + evaluate: true, + reduce_vars: true, + toplevel: true, + unsafe: true, + unused: true, + } + input: { + var a = [ 1, 2 ]; + console.log(a.length); + } + expect: { + console.log(2); + } + expect_stdout: "2" +} + +index_length: { + options = { + evaluate: true, + reduce_vars: true, + toplevel: true, + unsafe: true, + unused: true, + } + input: { + var a = [ 1, 2 ]; + console.log(a[0], a.length); + } + expect: { + console.log(1, 2); + } + expect_stdout: "1 2" +}