diff --git a/lib/compress.js b/lib/compress.js index 12b87dd23ce..f6419954f52 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -2791,7 +2791,7 @@ merge(Compressor.prototype, { if (self.args.length != 1) { return make_node(AST_Array, self, { elements: self.args - }).transform(compressor); + }).optimize(compressor); } break; case "Object": @@ -2809,7 +2809,7 @@ merge(Compressor.prototype, { left: self.args[0], operator: "+", right: make_node(AST_String, self, { value: "" }) - }).transform(compressor); + }).optimize(compressor); break; case "Number": if (self.args.length == 0) return make_node(AST_Number, self, { @@ -2818,7 +2818,7 @@ merge(Compressor.prototype, { if (self.args.length == 1) return make_node(AST_UnaryPrefix, self, { expression: self.args[0], operator: "+" - }).transform(compressor); + }).optimize(compressor); case "Boolean": if (self.args.length == 0) return make_node(AST_False, self); if (self.args.length == 1) return make_node(AST_UnaryPrefix, self, { @@ -2827,7 +2827,7 @@ merge(Compressor.prototype, { operator: "!" }), operator: "!" - }).transform(compressor); + }).optimize(compressor); break; case "Function": // new Function() => function(){} @@ -2897,7 +2897,7 @@ merge(Compressor.prototype, { left: make_node(AST_String, self, { value: "" }), operator: "+", right: exp.expression - }).transform(compressor); + }).optimize(compressor); } else if (exp instanceof AST_Dot && exp.expression instanceof AST_Array && exp.property == "join") EXIT: { var separator; @@ -2951,7 +2951,7 @@ merge(Compressor.prototype, { left : prev, right : el }); - }, first).transform(compressor); + }, first).optimize(compressor); } // need this awkward cloning to not affect original element // best_of will decide which one to get through. @@ -2961,6 +2961,16 @@ merge(Compressor.prototype, { node.expression.expression.elements = elements; return best_of(compressor, self, node); } + else if (exp instanceof AST_Dot && exp.expression.is_string(compressor) && exp.property == "charAt") { + var arg = self.args[0]; + var index = arg ? arg.evaluate(compressor) : 0; + if (index !== arg) { + return make_node(AST_Sub, exp, { + expression: exp.expression, + property: make_node_from_constant(index | 0, arg || exp) + }).optimize(compressor); + } + } } if (exp instanceof AST_Function && !self.expression.is_generator) { if (exp.body[0] instanceof AST_Return) { @@ -3129,14 +3139,6 @@ merge(Compressor.prototype, { return self; }); - function has_side_effects_or_prop_access(node, compressor) { - var save_pure_getters = compressor.option("pure_getters"); - compressor.options.pure_getters = false; - var ret = node.has_side_effects(compressor); - compressor.options.pure_getters = save_pure_getters; - return ret; - } - AST_Binary.DEFMETHOD("lift_sequences", function(compressor){ if (compressor.option("sequences")) { if (this.left instanceof AST_Seq) { @@ -3144,18 +3146,23 @@ merge(Compressor.prototype, { var x = seq.to_array(); this.left = x.pop(); x.push(this); - seq = AST_Seq.from_array(x).transform(compressor); - return seq; - } - if (this.right instanceof AST_Seq - && this instanceof AST_Assign - && !has_side_effects_or_prop_access(this.left, compressor)) { - var seq = this.right; - var x = seq.to_array(); - this.right = x.pop(); - x.push(this); - seq = AST_Seq.from_array(x).transform(compressor); - return seq; + return AST_Seq.from_array(x).optimize(compressor); + } + if (this.right instanceof AST_Seq && !this.left.has_side_effects(compressor)) { + var assign = this.operator == "=" && this.left instanceof AST_SymbolRef; + var root = this.right; + var cursor, seq = root; + while (assign || !seq.car.has_side_effects(compressor)) { + cursor = seq; + if (seq.cdr instanceof AST_Seq) { + seq = seq.cdr; + } else break; + } + if (cursor) { + this.right = cursor.cdr; + cursor.cdr = this; + return root.optimize(compressor); + } } } return this; @@ -3190,32 +3197,6 @@ merge(Compressor.prototype, { reverse(); } } - if (/^[!=]==?$/.test(self.operator)) { - if (self.left instanceof AST_SymbolRef && self.right instanceof AST_Conditional) { - if (self.right.consequent instanceof AST_SymbolRef - && self.right.consequent.definition() === self.left.definition()) { - if (/^==/.test(self.operator)) return self.right.condition; - if (/^!=/.test(self.operator)) return self.right.condition.negate(compressor); - } - if (self.right.alternative instanceof AST_SymbolRef - && self.right.alternative.definition() === self.left.definition()) { - if (/^==/.test(self.operator)) return self.right.condition.negate(compressor); - if (/^!=/.test(self.operator)) return self.right.condition; - } - } - if (self.right instanceof AST_SymbolRef && self.left instanceof AST_Conditional) { - if (self.left.consequent instanceof AST_SymbolRef - && self.left.consequent.definition() === self.right.definition()) { - if (/^==/.test(self.operator)) return self.left.condition; - if (/^!=/.test(self.operator)) return self.left.condition.negate(compressor); - } - if (self.left.alternative instanceof AST_SymbolRef - && self.left.alternative.definition() === self.right.definition()) { - if (/^==/.test(self.operator)) return self.left.condition.negate(compressor); - if (/^!=/.test(self.operator)) return self.left.condition; - } - } - } } self = self.lift_sequences(compressor); if (compressor.option("comparisons")) switch (self.operator) { diff --git a/package.json b/package.json index 34b1674a01a..ab0b87e3335 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "homepage": "http://lisperator.net/uglifyjs", "author": "Mihai Bazon (http://lisperator.net/)", "license": "BSD-2-Clause", - "version": "2.8.13", + "version": "2.8.14", "engines": { "node": ">=0.8.0" }, diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js index f46175ddaba..acca9bedf48 100644 --- a/test/compress/collapse_vars.js +++ b/test/compress/collapse_vars.js @@ -43,6 +43,7 @@ collapse_vars_side_effects_1: { z = i += 4; log(x, z, y, i); } + f1(), f2(), f3(), f4(); } expect: { function f1() { @@ -73,7 +74,9 @@ collapse_vars_side_effects_1: { y = i += 3; log(x, i += 4, y, i); } + f1(), f2(), f3(), f4(); } + expect_stdout: true } collapse_vars_side_effects_2: { @@ -823,6 +826,7 @@ collapse_vars_repeated: { console.log(e + "!"); })("!"); } + expect_stdout: true } collapse_vars_closures: { @@ -1109,6 +1113,7 @@ collapse_vars_eval_and_with: { return function() { with (o) console.log(a) }; })()(); } + expect_stdout: true } collapse_vars_constants: { @@ -1168,6 +1173,7 @@ collapse_vars_arguments: { (function(){console.log(arguments);})(7, 1); })(); } + expect_stdout: true } collapse_vars_short_circuit: { @@ -1317,6 +1323,7 @@ collapse_vars_regexp: { console.log(result[0]); })(); } + expect_stdout: true } issue_1537: { diff --git a/test/compress/concat-strings.js b/test/compress/concat-strings.js index 2f99375c4fc..867951ff692 100644 --- a/test/compress/concat-strings.js +++ b/test/compress/concat-strings.js @@ -51,6 +51,7 @@ concat_2: { "1" + "2" + "3" ); } + expect_stdout: true } concat_3: { @@ -79,6 +80,7 @@ concat_3: { 1 + 2 + "3" + "4" + "5" ); } + expect_stdout: true } concat_4: { @@ -107,6 +109,7 @@ concat_4: { 1 + "2" + "3" + "4" + "5" ); } + expect_stdout: true } concat_5: { @@ -135,6 +138,7 @@ concat_5: { "1" + 2 + "3" + "4" + "5" ); } + expect_stdout: true } concat_6: { @@ -163,6 +167,7 @@ concat_6: { "1" + "2" + "3" + "4" + "5" ); } + expect_stdout: true } concat_7: { @@ -188,6 +193,7 @@ concat_7: { x += "foo" ); } + expect_stdout: true } concat_8: { @@ -213,4 +219,5 @@ concat_8: { x += "foo" ); } + expect_stdout: true } diff --git a/test/compress/conditionals.js b/test/compress/conditionals.js index 074d2a651eb..7c81cc80a95 100644 --- a/test/compress/conditionals.js +++ b/test/compress/conditionals.js @@ -797,3 +797,99 @@ no_evaluate: { } } } + +equality_conditionals_false: { + options = { + conditionals: false, + sequences: true, + } + input: { + function f(a, b, c) { + console.log( + a == (b ? a : a), + a == (b ? a : c), + a != (b ? a : a), + a != (b ? a : c), + a === (b ? a : a), + a === (b ? a : c), + a !== (b ? a : a), + a !== (b ? a : c) + ); + } + f(0, 0, 0); + f(0, true, 0); + f(1, 2, 3); + f(1, null, 3); + f(NaN); + f(NaN, "foo"); + } + expect: { + function f(a, b, c) { + console.log( + a == (b ? a : a), + a == (b ? a : c), + a != (b ? a : a), + a != (b ? a : c), + a === (b ? a : a), + a === (b ? a : c), + a !== (b ? a : a), + a !== (b ? a : c) + ); + } + f(0, 0, 0), + f(0, true, 0), + f(1, 2, 3), + f(1, null, 3), + f(NaN), + f(NaN, "foo"); + } + expect_stdout: true +} + +equality_conditionals_true: { + options = { + conditionals: true, + sequences: true, + } + input: { + function f(a, b, c) { + console.log( + a == (b ? a : a), + a == (b ? a : c), + a != (b ? a : a), + a != (b ? a : c), + a === (b ? a : a), + a === (b ? a : c), + a !== (b ? a : a), + a !== (b ? a : c) + ); + } + f(0, 0, 0); + f(0, true, 0); + f(1, 2, 3); + f(1, null, 3); + f(NaN); + f(NaN, "foo"); + } + expect: { + function f(a, b, c) { + console.log( + (b, a == a), + a == (b ? a : c), + (b, a != a), + a != (b ? a : c), + (b, a === a), + a === (b ? a : c), + (b, a !== a), + a !== (b ? a : c) + ); + } + f(0, 0, 0), + f(0, true, 0), + f(1, 2, 3), + f(1, null, 3), + f(NaN), + f(NaN, "foo"); + } + expect_stdout: true +} diff --git a/test/compress/const.js b/test/compress/const.js index f1f13f4998d..a88d5946717 100644 --- a/test/compress/const.js +++ b/test/compress/const.js @@ -162,4 +162,5 @@ regexp_literal_not_const: { while (result = REGEXP_LITERAL.exec("acdabcdeabbb")) console.log(result[0]); })(); } + expect_stdout: true } diff --git a/test/compress/dead-code.js b/test/compress/dead-code.js index fa52496d739..da1b1838911 100644 --- a/test/compress/dead-code.js +++ b/test/compress/dead-code.js @@ -87,6 +87,7 @@ dead_code_constant_boolean_should_warn_more: { var x = 10, y; var moo; } + expect_stdout: true } dead_code_block_decls_die: { @@ -135,6 +136,7 @@ dead_code_const_declaration: { var moo; function bar() {} } + expect_stdout: true } dead_code_const_annotation: { @@ -162,6 +164,7 @@ dead_code_const_annotation: { var moo; function bar() {} } + expect_stdout: true } dead_code_const_annotation_regex: { @@ -185,6 +188,7 @@ dead_code_const_annotation_regex: { var CONST_FOO_ANN = !1; CONST_FOO_ANN && console.log('reachable'); } + expect_stdout: true } dead_code_const_annotation_complex_scope: { @@ -230,4 +234,5 @@ dead_code_const_annotation_complex_scope: { var meat = 'beef'; var pork = 'bad'; } + expect_stdout: true } diff --git a/test/compress/evaluate.js b/test/compress/evaluate.js index 5adbc9ea11b..6b8f0826383 100644 --- a/test/compress/evaluate.js +++ b/test/compress/evaluate.js @@ -200,6 +200,7 @@ negative_zero: { 1 / (-0) ); } + expect_stdout: true } positive_zero: { @@ -220,6 +221,7 @@ positive_zero: { 1 / (0) ); } + expect_stdout: true } pow: { @@ -337,6 +339,7 @@ unsafe_constant: { (void 0).a ); } + expect_stdout: true } unsafe_object: { @@ -360,6 +363,7 @@ unsafe_object: { 1..b + 1 ); } + expect_stdout: true } unsafe_object_nested: { @@ -383,6 +387,7 @@ unsafe_object_nested: { 2 ); } + expect_stdout: true } unsafe_object_complex: { @@ -406,6 +411,7 @@ unsafe_object_complex: { 2 ); } + expect_stdout: true } unsafe_object_repeated: { @@ -429,6 +435,7 @@ unsafe_object_repeated: { 1..b + 1 ); } + expect_stdout: true } unsafe_object_accessor: { @@ -478,6 +485,7 @@ unsafe_function: { ({a:{b:1},b:function(){}}).a.b + 1 ); } + expect_stdout: true } unsafe_integer_key: { @@ -505,6 +513,7 @@ unsafe_integer_key: { 1["1"] + 1 ); } + expect_stdout: true } unsafe_integer_key_complex: { @@ -532,6 +541,7 @@ unsafe_integer_key_complex: { 2 ); } + expect_stdout: true } unsafe_float_key: { @@ -559,6 +569,7 @@ unsafe_float_key: { 1["3.14"] + 1 ); } + expect_stdout: true } unsafe_float_key_complex: { @@ -586,6 +597,7 @@ unsafe_float_key_complex: { 2 ); } + expect_stdout: true } unsafe_array: { @@ -621,6 +633,7 @@ unsafe_array: { (void 0)[1] + 1 ); } + expect_stdout: true } unsafe_string: { @@ -648,6 +661,7 @@ unsafe_string: { "11" ); } + expect_stdout: true } unsafe_array_bad_index: { @@ -669,6 +683,7 @@ unsafe_array_bad_index: { [1, 2, 3, 4][3.14] + 1 ); } + expect_stdout: true } unsafe_string_bad_index: { @@ -690,6 +705,7 @@ unsafe_string_bad_index: { "1234"[3.14] + 1 ); } + expect_stdout: true } unsafe_prototype_function: { @@ -736,6 +752,7 @@ call_args: { console.log(1); +(1, 1); } + expect_stdout: true } call_args_drop_param: { @@ -757,6 +774,7 @@ call_args_drop_param: { console.log(1); +(b, 1); } + expect_stdout: true } in_boolean_context: { @@ -794,4 +812,74 @@ in_boolean_context: { (foo(), !1) ); } + expect_stdout: true +} + +unsafe_charAt: { + options = { + evaluate : true, + unsafe : true + } + input: { + console.log( + "1234" + 1, + "1234".charAt(0) + 1, + "1234".charAt(6 - 5) + 1, + ("12" + "34").charAt(0) + 1, + ("12" + "34").charAt(6 - 5) + 1, + [1, 2, 3, 4].join("").charAt(0) + 1 + ); + } + expect: { + console.log( + "12341", + "11", + "21", + "11", + "21", + "11" + ); + } + expect_stdout: true +} + +unsafe_charAt_bad_index: { + options = { + evaluate : true, + unsafe : true + } + input: { + console.log( + "1234".charAt() + 1, + "1234".charAt("a") + 1, + "1234".charAt(3.14) + 1 + ); + } + expect: { + console.log( + "11", + "11", + "41" + ); + } + expect_stdout: true +} + +unsafe_charAt_noop: { + options = { + evaluate : true, + unsafe : true + } + input: { + console.log( + s.charAt(0), + "string".charAt(x) + ); + } + expect: { + console.log( + s.charAt(0), + "string".charAt(x) + ); + } } diff --git a/test/compress/functions.js b/test/compress/functions.js index a1a515a13d0..dca40623540 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -39,6 +39,7 @@ iifes_returning_constants_keep_fargs_true: { console.log(6); console.log((a(), b(), 6)); } + expect_stdout: true } iifes_returning_constants_keep_fargs_false: { @@ -73,6 +74,7 @@ iifes_returning_constants_keep_fargs_false: { console.log(6); console.log((a(), b(), 6)); } + expect_stdout: true } issue_485_crashing_1530: { diff --git a/test/compress/issue-1275.js b/test/compress/issue-1275.js index 51f696afc25..5d4f5b706eb 100644 --- a/test/compress/issue-1275.js +++ b/test/compress/issue-1275.js @@ -46,4 +46,5 @@ string_plus_optimization: { } foo(); } + expect_stdout: true } diff --git a/test/compress/issue-1321.js b/test/compress/issue-1321.js index 2b6f17bfd6d..7449d3e2b32 100644 --- a/test/compress/issue-1321.js +++ b/test/compress/issue-1321.js @@ -14,6 +14,7 @@ issue_1321_no_debug: { x["a"] = 2 * x.b; console.log(x.b, x["a"]); } + expect_stdout: true } issue_1321_debug: { @@ -33,6 +34,7 @@ issue_1321_debug: { x["_$foo$_"] = 2 * x.a; console.log(x.a, x["_$foo$_"]); } + expect_stdout: true } issue_1321_with_quoted: { @@ -51,4 +53,5 @@ issue_1321_with_quoted: { x["b"] = 2 * x.a; console.log(x.a, x["b"]); } + expect_stdout: true } diff --git a/test/compress/issue-1447.js b/test/compress/issue-1447.js index 163acbc218e..a7f35e5a434 100644 --- a/test/compress/issue-1447.js +++ b/test/compress/issue-1447.js @@ -42,4 +42,5 @@ conditional_false_stray_else_in_loop: { } } expect_exact: "for(var i=1;i<=4;++i)if(!(i<=2))console.log(i);" + expect_stdout: true } diff --git a/test/compress/issue-1466.js b/test/compress/issue-1466.js index 5a323c48c80..9273235b79e 100644 --- a/test/compress/issue-1466.js +++ b/test/compress/issue-1466.js @@ -13,9 +13,9 @@ same_variable_in_multiple_for_loop: { join_vars: true, cascade: true, side_effects: true, - collapse_vars: true - }; - mangle = {}; + collapse_vars: true, + } + mangle = {} input: { for (let i = 0; i < 3; i++) { let a = 100; @@ -38,6 +38,7 @@ same_variable_in_multiple_for_loop: { } } } + expect_stdout: true } same_variable_in_multiple_forOf: { @@ -55,9 +56,9 @@ same_variable_in_multiple_forOf: { join_vars: true, cascade: true, side_effects: true, - collapse_vars: true - }; - mangle = {}; + collapse_vars: true, + } + mangle = {} input: { var test = [ "a", "b", "c" ]; for (let tmp of test) { @@ -75,10 +76,11 @@ same_variable_in_multiple_forOf: { console.log(o); let e; e = [ "e", "f", "g" ]; - for (let o of e) + for (let o of e) console.log(o); } } + expect_stdout: true } same_variable_in_multiple_forIn: { @@ -96,9 +98,9 @@ same_variable_in_multiple_forIn: { join_vars: true, cascade: true, side_effects: true, - collapse_vars: true - }; - mangle = {}; + collapse_vars: true, + } + mangle = {} input: { var test = [ "a", "b", "c" ]; for (let tmp in test) { @@ -120,6 +122,7 @@ same_variable_in_multiple_forIn: { console.log(o); } } + expect_stdout: true } different_variable_in_multiple_for_loop: { @@ -137,9 +140,9 @@ different_variable_in_multiple_for_loop: { join_vars: true, cascade: true, side_effects: true, - collapse_vars: true - }; - mangle = {}; + collapse_vars: true, + } + mangle = {} input: { for (let i = 0; i < 3; i++) { let a = 100; @@ -162,6 +165,7 @@ different_variable_in_multiple_for_loop: { } } } + expect_stdout: true } different_variable_in_multiple_forOf: { @@ -179,9 +183,9 @@ different_variable_in_multiple_forOf: { join_vars: true, cascade: true, side_effects: true, - collapse_vars: true - }; - mangle = {}; + collapse_vars: true, + } + mangle = {} input: { var test = [ "a", "b", "c" ]; for (let tmp of test) { @@ -203,6 +207,7 @@ different_variable_in_multiple_forOf: { console.log(o); } } + expect_stdout: true } different_variable_in_multiple_forIn: { @@ -220,9 +225,9 @@ different_variable_in_multiple_forIn: { join_vars: true, cascade: true, side_effects: true, - collapse_vars: true - }; - mangle = {}; + collapse_vars: true, + } + mangle = {} input: { var test = [ "a", "b", "c" ]; for (let tmp in test) { @@ -244,6 +249,7 @@ different_variable_in_multiple_forIn: { console.log(o); } } + expect_stdout: true } more_variable_in_multiple_for: { @@ -261,9 +267,9 @@ more_variable_in_multiple_for: { join_vars: true, cascade: true, side_effects: true, - collapse_vars: true - }; - mangle = {}; + collapse_vars: true, + } + mangle = {} input: { for (let a = 9, i = 0; i < 20; i += a) { let b = a++ + i; @@ -281,5 +287,5 @@ more_variable_in_multiple_for: { console.log(o, c, e, l, f); } } + expect_stdout: true } - diff --git a/test/compress/issue-640.js b/test/compress/issue-640.js index dd3f3f2196a..fbf5f37fb05 100644 --- a/test/compress/issue-640.js +++ b/test/compress/issue-640.js @@ -48,6 +48,7 @@ dead_code_const_annotation_regex: { var CONST_FOO_ANN = !1; if (CONST_FOO_ANN) console.log('reachable'); } + expect_stdout: true } drop_console_2: { @@ -225,6 +226,7 @@ issue_1254_negate_iife_true: { })()(); } expect_exact: '(function(){return function(){console.log("test")}})()();' + expect_stdout: true } issue_1254_negate_iife_nested: { @@ -240,6 +242,7 @@ issue_1254_negate_iife_nested: { })()()()()(); } expect_exact: '(function(){return function(){console.log("test")}})()()()()();' + expect_stdout: true } conditional: { diff --git a/test/compress/issue-892.js b/test/compress/issue-892.js index 2dab420f045..b6938c42ed7 100644 --- a/test/compress/issue-892.js +++ b/test/compress/issue-892.js @@ -29,4 +29,5 @@ dont_mangle_arguments: { })(5,6,7); } expect_exact: "(function(){var arguments=arguments,o=9;console.log(o,arguments)})(5,6,7);" + expect_stdout: true } diff --git a/test/compress/issue-976.js b/test/compress/issue-976.js index 06e11f40a31..b711051b09e 100644 --- a/test/compress/issue-976.js +++ b/test/compress/issue-976.js @@ -42,6 +42,7 @@ eval_collapse_vars: { eval("console.log(a);"); })(eval); } + expect_stdout: true } eval_unused: { diff --git a/test/compress/labels.js b/test/compress/labels.js index 044b7a7eabc..0d85d10ad93 100644 --- a/test/compress/labels.js +++ b/test/compress/labels.js @@ -9,6 +9,7 @@ labels_1: { expect: { foo || console.log("bar"); } + expect_stdout: true } labels_2: { @@ -40,6 +41,7 @@ labels_3: { for (var i = 0; i < 5; ++i) i < 3 || console.log(i); } + expect_stdout: true } labels_4: { @@ -54,6 +56,7 @@ labels_4: { for (var i = 0; i < 5; ++i) i < 3 || console.log(i); } + expect_stdout: true } labels_5: { diff --git a/test/compress/loops.js b/test/compress/loops.js index 7581e7585b3..b55c616240f 100644 --- a/test/compress/loops.js +++ b/test/compress/loops.js @@ -166,6 +166,7 @@ keep_collapse_const_in_own_block_scope: { console.log(i); console.log(c); } + expect_stdout: true } keep_collapse_const_in_own_block_scope_2: { @@ -186,6 +187,7 @@ keep_collapse_const_in_own_block_scope_2: { console.log(i); console.log(c); } + expect_stdout: true } evaluate: { diff --git a/test/compress/negate-iife.js b/test/compress/negate-iife.js index 9a0b5a46867..e9ad37db5d4 100644 --- a/test/compress/negate-iife.js +++ b/test/compress/negate-iife.js @@ -70,6 +70,7 @@ negate_iife_3_evaluate: { expect: { console.log(true); } + expect_stdout: true } negate_iife_3_side_effects: { @@ -111,6 +112,7 @@ negate_iife_3_off_evaluate: { expect: { console.log(true); } + expect_stdout: true } negate_iife_4: { @@ -243,6 +245,7 @@ negate_iife_nested: { }(7); }).f(); } + expect_stdout: true } negate_iife_nested_off: { @@ -275,6 +278,7 @@ negate_iife_nested_off: { })(7); }).f(); } + expect_stdout: true } negate_iife_issue_1073: { @@ -299,6 +303,7 @@ negate_iife_issue_1073: { }; }(7))(); } + expect_stdout: true } issue_1254_negate_iife_false: { @@ -313,6 +318,7 @@ issue_1254_negate_iife_false: { })()(); } expect_exact: '(function(){return function(){console.log("test")}})()();' + expect_stdout: true } issue_1254_negate_iife_true: { @@ -327,6 +333,7 @@ issue_1254_negate_iife_true: { })()(); } expect_exact: '!function(){return function(){console.log("test")}}()();' + expect_stdout: true } issue_1254_negate_iife_nested: { @@ -341,6 +348,7 @@ issue_1254_negate_iife_nested: { })()()()()(); } expect_exact: '!function(){return function(){console.log("test")}}()()()()();' + expect_stdout: true } issue_1288: { diff --git a/test/compress/reduce_vars.js b/test/compress/reduce_vars.js index bc6c72d473c..3d5612cfbb4 100644 --- a/test/compress/reduce_vars.js +++ b/test/compress/reduce_vars.js @@ -58,6 +58,7 @@ reduce_vars: { })(); console.log(2); } + expect_stdout: true } modified: { @@ -166,7 +167,7 @@ modified: { console.log(A ? 'yes' : 'no'); console.log(B ? 'yes' : 'no'); } - } + } } unsafe_evaluate: { @@ -401,6 +402,7 @@ iife: { console.log(0, 1 * b, 5); }(1, 2, 3); } + expect_stdout: true } iife_new: { @@ -420,6 +422,7 @@ iife_new: { console.log(0, 1 * b, 5); }(1, 2, 3); } + expect_stdout: true } multi_def: { @@ -707,6 +710,7 @@ toplevel_on: { expect: { console.log(3); } + expect_stdout: true } toplevel_off: { @@ -724,6 +728,7 @@ toplevel_off: { var x = 3; console.log(x); } + expect_stdout: true } toplevel_on_loops_1: { @@ -751,6 +756,7 @@ toplevel_on_loops_1: { })(); while (x); } + expect_stdout: true } toplevel_off_loops_1: { @@ -779,6 +785,7 @@ toplevel_off_loops_1: { bar(); while (x); } + expect_stdout: true } toplevel_on_loops_2: { @@ -1121,6 +1128,7 @@ defun_label: { }(2)); }(); } + expect_stdout: true } double_reference: { @@ -1164,6 +1172,7 @@ iife_arguments_1: { return f; }); } + expect_stdout: true } iife_arguments_2: { @@ -1186,6 +1195,7 @@ iife_arguments_2: { }() === arguments[0]); })(); } + expect_stdout: true } iife_eval_1: { @@ -1207,6 +1217,7 @@ iife_eval_1: { return f; }); } + expect_stdout: true } iife_eval_2: { @@ -1230,6 +1241,7 @@ iife_eval_2: { console.log(x() === eval("x")); })(); } + expect_stdout: true } iife_func_side_effects: { @@ -1326,6 +1338,7 @@ issue_1595_4: { if (a) iife(a - 1, b, c); })(3, 4, 5); } + expect_stdout: true } issue_1606: { diff --git a/test/compress/screw-ie8.js b/test/compress/screw-ie8.js index 0fb68c25530..fc492112db6 100644 --- a/test/compress/screw-ie8.js +++ b/test/compress/screw-ie8.js @@ -128,6 +128,7 @@ do_screw_try_catch_undefined: { return void 0===o } } + expect_stdout: true } dont_screw_try_catch_undefined: { @@ -156,6 +157,7 @@ dont_screw_try_catch_undefined: { return n === undefined } } + expect_stdout: true } reduce_vars: { @@ -208,6 +210,7 @@ issue_1586_1: { } } expect_exact: "function f(){try{}catch(c){console.log(c.message)}}" + expect_stdout: true } issue_1586_2: { @@ -226,4 +229,5 @@ issue_1586_2: { } } expect_exact: "function f(){try{}catch(c){console.log(c.message)}}" + expect_stdout: true } diff --git a/test/compress/sequences.js b/test/compress/sequences.js index 41cfc726159..49b61ae0f9c 100644 --- a/test/compress/sequences.js +++ b/test/compress/sequences.js @@ -86,6 +86,7 @@ make_sequences_4: { switch (x = 5, y) {} with (x = 5, obj); } + expect_stdout: true } lift_sequences_1: { @@ -103,15 +104,18 @@ lift_sequences_1: { lift_sequences_2: { options = { sequences: true, evaluate: true }; input: { - var foo, bar; + var foo = 1, bar; foo.x = (foo = {}, 10); bar = (bar = {}, 10); + console.log(foo, bar); } expect: { - var foo, bar; + var foo = 1, bar; foo.x = (foo = {}, 10), - bar = {}, bar = 10; + bar = {}, bar = 10, + console.log(foo, bar); } + expect_stdout: true } lift_sequences_3: { @@ -138,6 +142,23 @@ lift_sequences_4: { } } +lift_sequences_5: { + options = { + sequences: true, + } + input: { + var a = 2, b; + a *= (b, a = 4, 3); + console.log(a); + } + expect: { + var a = 2, b; + b, a *= (a = 4, 3), + console.log(a); + } + expect_stdout: "6" +} + for_sequences: { options = { sequences: true }; input: { @@ -230,6 +251,7 @@ negate_iife_for: { for (!function() {}(), i = 0; i < 5; i++) console.log(i); for (function() {}(); i < 5; i++) console.log(i); } + expect_stdout: true } iife: { diff --git a/test/compress/transform.js b/test/compress/transform.js index 7b616e40e92..1cc72c07705 100644 --- a/test/compress/transform.js +++ b/test/compress/transform.js @@ -13,6 +13,7 @@ booleans_evaluate: { console.log(!0, !0); console.log(!1, !1); } + expect_stdout: true } booleans_global_defs: { @@ -29,6 +30,7 @@ booleans_global_defs: { expect: { console.log(!0); } + expect_stdout: true } condition_evaluate: { diff --git a/test/run-tests.js b/test/run-tests.js index 7f3256e0910..a3184d72c04 100755 --- a/test/run-tests.js +++ b/test/run-tests.js @@ -11,6 +11,17 @@ var vm = require("vm"); var tests_dir = path.dirname(module.filename); var failures = 0; var failed_files = {}; +var same_stdout = ~process.version.lastIndexOf("v0.12.", 0) ? function(expected, actual) { + if (typeof expected != typeof actual) return false; + if (typeof expected != "string") { + if (expected.name != actual.name) return false; + expected = expected.message.slice(expected.message.lastIndexOf("\n") + 1); + actual = actual.message.slice(actual.message.lastIndexOf("\n") + 1); + } + return expected == actual; +} : function(expected, actual) { + return typeof expected == typeof actual && expected.toString() == actual.toString(); +}; run_compress_tests(); if (failures) { @@ -172,7 +183,7 @@ function run_compress_tests() { } } if (test.expect_stdout) { - var stdout = run_code(input_code); + var stdout = run_code(make_code(input, output_options)); if (test.expect_stdout === true) { test.expect_stdout = stdout; } @@ -336,7 +347,3 @@ function run_code(code) { process.stdout.write = original_write; } } - -function same_stdout(expected, actual) { - return typeof expected == typeof actual && expected.toString() == actual.toString(); -}