diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2017-05-27 13:41:49 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-27 13:41:49 +0800 |
commit | 95094b9c22d5f7b303383f75e660fc32d0a7f25f (patch) | |
tree | b8074242ff5c3ea22a8f7183f0e854b477636816 | |
parent | 1ff8e9dd386beb071945c4e3f73ed347c72527d8 (diff) | |
download | tracifyjs-95094b9c22d5f7b303383f75e660fc32d0a7f25f.tar.gz tracifyjs-95094b9c22d5f7b303383f75e660fc32d0a7f25f.zip |
fix `if_return` on `AST_Defun` (#2010)
Previous fiix for #1052 perturbs declaration order of functions which leads to incorrect behaviour under "use strict".
-rw-r--r-- | lib/compress.js | 4 | ||||
-rw-r--r-- | test/compress/issue-1052.js | 88 |
2 files changed, 69 insertions, 23 deletions
diff --git a/lib/compress.js b/lib/compress.js index bd017e10..efa8e988 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -965,15 +965,15 @@ merge(Compressor.prototype, { CHANGED = true; stat = stat.clone(); stat.condition = stat.condition.negate(compressor); + var funs = extract_functions_from_statement_array(ret); var body = as_statement_array(stat.alternative).concat(ret); - var funs = extract_functions_from_statement_array(body); stat.body = make_node(AST_BlockStatement, stat, { body: body }); stat.alternative = value ? make_node(AST_SimpleStatement, value, { body: value.expression }) : null; - ret = funs.concat([ stat.transform(compressor) ]); + ret = [ stat.transform(compressor) ].concat(funs); continue loop; } //--- diff --git a/test/compress/issue-1052.js b/test/compress/issue-1052.js index 0a77f006..e3dc7322 100644 --- a/test/compress/issue-1052.js +++ b/test/compress/issue-1052.js @@ -1,90 +1,91 @@ multiple_functions: { - options = { if_return: true, hoist_funs: false }; + options = { + hoist_funs: false, + if_return: true, + } input: { ( function() { if ( !window ) { return; } - function f() {} function g() {} } )(); } expect: { ( function() { - function f() {} - function g() {} - // NOTE: other compression steps will reduce this // down to just `window`. if ( window ); + function f() {} + function g() {} } )(); } } single_function: { - options = { if_return: true, hoist_funs: false }; + options = { + hoist_funs: false, + if_return: true, + } input: { ( function() { if ( !window ) { return; } - function f() {} } )(); } expect: { ( function() { - function f() {} - if ( window ); + function f() {} } )(); } } deeply_nested: { - options = { if_return: true, hoist_funs: false }; + options = { + hoist_funs: false, + if_return: true, + } input: { ( function() { if ( !window ) { return; } - function f() {} function g() {} - if ( !document ) { return; } - function h() {} } )(); } expect: { ( function() { - function f() {} - function g() {} - - function h() {} - // NOTE: other compression steps will reduce this // down to just `window`. if ( window ) if (document); + function f() {} + function g() {} + function h() {} } )(); } } not_hoisted_when_already_nested: { - options = { if_return: true, hoist_funs: false }; + options = { + hoist_funs: false, + if_return: true, + } input: { ( function() { if ( !window ) { return; } - if ( foo ) function f() {} - } )(); } expect: { @@ -94,3 +95,48 @@ not_hoisted_when_already_nested: { } )(); } } + +defun_if_return: { + options = { + hoist_funs: false, + if_return: true, + } + input: { + function e() { + function f() {} + if (!window) return; + else function g() {} + function h() {} + } + } + expect: { + function e() { + function f() {} + if (window) function g() {} + function h() {} + } + } +} + +defun_hoist_funs: { + options = { + hoist_funs: true, + if_return: true, + } + input: { + function e() { + function f() {} + if (!window) return; + else function g() {} + function h() {} + } + } + expect: { + function e() { + function f() {} + function g() {} + function h() {} + !window; + } + } +} |