diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2017-06-20 02:14:05 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-20 02:14:05 +0800 |
commit | 343ea326c217b9c1dbaf098a2def96df2b0b818c (patch) | |
tree | e524415b3426b32356d40cc8bbe72daf897d9c83 | |
parent | 1c150c632f200bb58044a3ff9592d884f1010e67 (diff) | |
download | tracifyjs-343ea326c217b9c1dbaf098a2def96df2b0b818c.tar.gz tracifyjs-343ea326c217b9c1dbaf098a2def96df2b0b818c.zip |
ensure mangling works if catch reuses a scope variable (#2123)
fixes #2120
-rw-r--r-- | lib/scope.js | 15 | ||||
-rw-r--r-- | test/compress/screw-ie8.js | 70 |
2 files changed, 84 insertions, 1 deletions
diff --git a/lib/scope.js b/lib/scope.js index 82a935a2..c147ce00 100644 --- a/lib/scope.js +++ b/lib/scope.js @@ -79,7 +79,7 @@ SymbolDef.prototype = { if (options.ie8 && sym instanceof AST_SymbolLambda) s = s.parent_scope; var def; - if (this.defun && (def = this.defun.variables.get(this.name))) { + if (def = this.redefined()) { this.mangled_name = def.mangled_name || def.name; } else this.mangled_name = s.next_mangled(options, this); @@ -87,6 +87,9 @@ SymbolDef.prototype = { cache.set(this.name, this.mangled_name); } } + }, + redefined: function() { + return this.defun && this.defun.variables.get(this.name); } }; @@ -206,6 +209,16 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){ node.reference(options); return true; } + // ensure mangling works if catch reuses a scope variable + var def; + if (node instanceof AST_SymbolCatch && (def = node.definition().redefined())) { + var s = node.scope; + while (s) { + push_uniq(s.enclosed, def); + if (s === def.scope) break; + s = s.parent_scope; + } + } }); self.walk(tw); diff --git a/test/compress/screw-ie8.js b/test/compress/screw-ie8.js index a9fbeb51..5d6f1e2c 100644 --- a/test/compress/screw-ie8.js +++ b/test/compress/screw-ie8.js @@ -255,3 +255,73 @@ issue_1586_2: { } expect_exact: "function f(){try{x()}catch(c){console.log(c.message)}}" } + +issue_2120_1: { + mangle = { + ie8: false, + } + input: { + "aaaaaaaa"; + var a = 1, b = "FAIL"; + try { + throw 1; + } catch (c) { + try { + throw 0; + } catch (a) { + if (c) b = "PASS"; + } + } + console.log(b); + } + expect: { + "aaaaaaaa"; + var a = 1, b = "FAIL"; + try { + throw 1; + } catch (t) { + try { + throw 0; + } catch (a) { + if (t) b = "PASS"; + } + } + console.log(b); + } + expect_stdout: "PASS" +} + +issue_2120_2: { + mangle = { + ie8: true, + } + input: { + "aaaaaaaa"; + var a = 1, b = "FAIL"; + try { + throw 1; + } catch (c) { + try { + throw 0; + } catch (a) { + if (c) b = "PASS"; + } + } + console.log(b); + } + expect: { + "aaaaaaaa"; + var a = 1, b = "FAIL"; + try { + throw 1; + } catch (c) { + try { + throw 0; + } catch (a) { + if (c) b = "PASS"; + } + } + console.log(b); + } + expect_stdout: "PASS" +} |