Uglifyjs: Bug in 'mangle` with nested catch blocks

Created on 18 Jun 2017  路  5Comments  路  Source: mishoo/UglifyJS

Note the absence of suspicious options. Also:

$ cat test.js | node
null 101 98 15

$ uglifyjs test.js -c | node
null 101 98 15

$ uglifyjs test.js -m | node
null 101 98 15

$ uglifyjs test.js -mc | node
null 101 98 4
// original code
// (beautified)
var a = 100, b = 10, c = 0;

--b + a++;

try {
    {
        var expr3 = b--;
        for (var key3 in expr3) {
            c = 1 + c;
            var Math = expr3[key3];
            L202261: {
                try {
                    [ ("bar" | 0) >= (23..toString() != "foo") >= (-3 << -4 | [ , 0 ][1] ^ []), a++ + /[abc4]/.test((--b + {
                        b: (c = 1 + c, c = c + 1, [ , 0 ][1] << -5 | 24..toString() > 24..toString()),
                        1.5: (c = 1 + c, a && (a[a && a[--b + [ (c = 1 + c, (24..toString() >> []) + (-0 >>> undefined) << ((a && (a.undefined *= "" && "function")) ^ 22 >>> -0)), (c = 1 + c, 
                        (c = c + 1, 24..toString() << "bar") >> (("undefined" && Infinity) <= (c = c + 1, 
                        "number"))), (c = 1 + c, (5 || 5) === "number" % -2 == 22 <= NaN <= 1 / 22), (c = 1 + c, 
                        (("function" && "object") >= ("foo" >= /[a2][^e]+$/)) - (-2 === 24..toString(), 
                        3 !== "function")) ].NaN]] |= (true & 24..toString()) + (5 ^ -4) >= (2 <= 22 !== ([] ^ 4))))
                    } || b || 5).toString()), a && a[/[abc4]/.test((--b + {}[(c = 1 + c, void ("foo" > [] && "function" + 0))] || b || 5).toString())], a++ + (([ , 0 ][1] === 2 || 25 === 22) >> (c = c + 1, 
                    0) - ("bar" < "function")), (c = c + 1) + {
                        a: a++ + ~(c = c + 1, (a && (a[(c = 1 + c, ((a += true - "bar") && 23..toString() === "number") % ("object" !== "number" & 22 !== -3))] = ([ , 0 ].length === 2) <= 23..toString())) >= (a = 4 !== 24..toString())),
                        Infinity: a++,
                        in: a++ + (a && a.foo),
                        length: (c = c + 1) + b--,
                        NaN: (c = c + 1) + ("number" < /[a2][^e]+$/ != (1 & 0) & (a += "undefined" - 24..toString()) > [] % 23..toString())
                    } ][+a];
                } catch (Infinity) {
                    switch ({
                        foo: a++ + []
                    }) {
                      case (c = c + 1) + {
                            3: a++,
                            0: [ (c = 1 + c, 4 < [ , 0 ][1] > (-3 != 38..toString()) === (1 != 38..toString()) >= ("bar" ^ [])) ],
                            a: --b + (typeof a_1 === "string"),
                            NaN: a++ + {
                                3: (c = 1 + c, "object" >> /[a2][^e]+$/ >= 4 + -0 > (a && (a.foo %= "foo" < null | ("undefined" && 2)))),
                                foo: (c = 1 + c, ([ , 0 ][1] << NaN != 25 % "foo") + ((a && (a[(c = 1 + c, ((2 === 3) <= "" * -4) >>> (NaN != 24..toString()) % ("function" & false))] = 22 | /[a2][^e]+$/)) === "foo" <= 24..toString())),
                                foo: (c = 1 + c, -(38..toString() === /[a2][^e]+$/) - ("" === 22 !== [ , 0 ][1] / "")),
                                "": (c = 1 + c, ("undefined" === [] != ("object" == -1)) <= (38..toString() * -0 & -2 - 25)),
                                1.5: (c = 1 + c, (a && (a[(c = 1 + c, (2 > "function" >= (a && (a.undefined += -1 << "foo"))) - (c = c + 1, 
                                25 - /[a2][^e]+$/))] = 1 / "function"), "number" >> 23..toString()) >= (22 >= "function" < NaN << []))
                            }.NaN,
                            set NaN(a_1) {
                                L202262: {
                                }
                                this.length |= {} << 1 != (-4 !== 38..toString()) != 22 >> true << [] + null;
                            }
                        }.a:
                        if (void b) {
                            if ({
                                NaN: (c = 1 + c, (NaN - "function" <= NaN - 24..toString()) >>> ((-4 != true) >>> (3 ^ "number"))),
                                null: (c = 1 + c, (-0 > ([ , 0 ].length === 2) == -5 >>> 0) * (("number" && true) ^ (38..toString(), 
                                2))),
                                b: (c = 1 + c, +(25 + 22) & (a = [] | "function") + (-1 <= /[a2][^e]+$/))
                            }) {
                                var brake11 = 5;
                                do {
                                    c = 1 + c, c = c + 1, (Infinity ^ "bar") === (38..toString() | 23..toString());
                                } while ((c = 1 + c, [] >> [] == (null & null), undefined ^ -0, true - 38..toString()) && --brake11 > 0);
                            } else {
                                var brake13 = 5;
                                L202263: while ((c = 1 + c, (25 ^ 5) + Infinity % undefined < (38..toString() ^ -4) + (false > "bar")) && --brake13 > 0) {
                                    c = 1 + c, a && (a[typeof (--b + (a && a.in))] += (([ , 0 ].length === 2) - -2) * (-0 * 25) <= (true < 22 & "function" + /[a2][^e]+$/));
                                }
                            }
                        } else {
                            var brake15 = 5;
                            do {
                                c = c + 1;
                            } while ([ (c = 1 + c, (([ , 0 ].length === 2) <= 5 ^ (a && (a.Infinity /= undefined >= 5))) == (0 ^ "undefined") % (-2 << "bar")), (c = 1 + c, 
                            a && (a.NaN = (true / -3 | [ , 0 ][1] > 22) % ((c = c + 1, -5) >>> (a ^= [ , 0 ][1] / ([ , 0 ].length === 2))))) ].foo && --brake15 > 0);
                        }
                        if (--b + a--) {
                            var brake18 = 5;
                            while ((c = c + 1) + a++ && --brake18 > 0) {
                                var brake19 = 5;
                                do {
                                    c = 1 + c, (delete 1 & -2 == -0) !== (!0 === (a = NaN === 22));
                                } while ((c = 1 + c, a && (a[a && a[--b + {
                                    undefined: (c = 1 + c, (c = c + 1, "object" << 24..toString()) % ((25 != undefined) >> (Infinity, 
                                    0)))
                                }[(c = 1 + c, +(-0 === 25 ^ "function" >> 3))]]] = {} << "function" >= (a = "bar" > 2) | (false << 25) % (5 >>> 23..toString()))) && --brake19 > 0);
                            }
                        }
                        break;

                      case delete (22 * 22 % (0 % null) != (25 >>> -3 || [ , 0 ].length === 2 & [ , 0 ].length === 2)):
                        {
                            var brake21 = 5;
                            L202264: while ([ (c = 1 + c, a && (a[+(null - -1 == 22 >>> "object" == (25 > true) - ("foo" >>> -3))] += [] >> ([ , 0 ].length === 2) << (23..toString(), 
                            NaN) !== (c = c + 1, "number" !== /[a2][^e]+$/))), (c = 1 + c, (undefined * 25 >= ("function" <= 3)) / ((c = c + 1, 
                            24..toString()) | 0 >> true)) ].null && --brake21 > 0) {
                                [ (c = 1 + c, (true ^ NaN) + (false || "foo") || -3 % 22 >= (Infinity != 2)) ];
                            }
                        }
                        {
                            var brake23 = 5;
                            while ((c = c + 1) + {}.null && --brake23 > 0) {
                                var a_1 = a++ + ((c = 1 + c, ((/[a2][^e]+$/ && -0) ^ (a_1 && (a_1[(c = 1 + c, true > /[a2][^e]+$/ !== (22 | 1) !== (a_1 = 2 % -5 * ("" - 25)))] = /[a2][^e]+$/ + 22))) % (-0 * "object" || 0 != "bar")) ? (c = 1 + c, 
                                (-0 === 38..toString() && NaN / 23..toString()) ^ {} != undefined !== (-4 & "function")) : (c = 1 + c, 
                                a_1 |= (a_1 && (a_1[--b + delete b] += 24..toString() / 1 || 2 !== [ , 0 ][1])) !== (a_1 = (3 && "bar") / (-4 ^ NaN))));
                            }
                        }

                      case a++ + +a:
                        break;

                      case --b + {
                            NaN: a++ + a++
                        }.length:
                        0 === 1 ? a : b;
                        break;
                    }
                    {
                        var brake26 = 5;
                        while (--b + ++a && --brake26 > 0) {
                            switch (--b) {
                              case +a:
                                L202265: for (var brake28 = 5; a++ + (b <<= a) && brake28 > 0; --brake28) {
                                    c = 1 + c, (c = c + 1, "bar", undefined) ^ (undefined ^ "object") % ("" + 5);
                                }
                                switch (--b) {
                                  case a++ + (1 === 1 ? a : b):
                                    break;

                                  default:
                                    c = 1 + c, a_1 ^= (-3 && {}) / ([] >= -0) <= (25 == 1) - ({} != /[a2][^e]+$/);

                                  case (c = c + 1) + {
                                        "\t": (c = 1 + c, (38..toString() < true | 0 * 38..toString()) - (a_1 && (a_1[delete (([ , 0 ][1] ^ Infinity) > ("object" < -2) && 23..toString() * ([ , 0 ].length === 2) ^ (c = c + 1, 
                                        "bar"))] = [ , 0 ][1] > NaN > (-1 & 38..toString()))))
                                    }[(c = 1 + c, (-2 != 2, c = c + 1, -0) < (c = c + 1, true >> 5))]:
                                    c = 1 + c, ("number" >> -0, "bar" >> false) + ([] + [] | false !== -0);
                                    c = 1 + c, ("number" ^ 22 || (a_1 += [ , 0 ][1] && -4)) + ~(a_1 >>>= -1 ^ 25);
                                    break;

                                  case "":
                                    c = 1 + c, -0 >>> NaN < (a_1 && (a_1.in *= "foo" << 38..toString())) && [ , 0 ].length === 2 != "number" == -2 / 0;
                                    c = 1 + c, void (4 >>> NaN === (-2 ^ [ , 0 ][1]));
                                    break;
                                }
                                break;

                              case a++ + /[abc4]/.test((a_1 && a_1.null || b || 5).toString()):
                                try {
                                    {
                                    }
                                } catch (a_2) {
                                    c = 1 + c, (([ , 0 ].length === 2) >>> true ^ -2 != /[a2][^e]+$/) < (a_2 && (a_2[{
                                        b: (c = 1 + c, delete (-5 <= 25 < (0 < ([ , 0 ].length === 2)))),
                                        null: (c = 1 + c, ("foo" ^ 22 || -0 / 24..toString()) - ((25 === null) - ("object" > NaN))),
                                        0: (c = 1 + c, (4 ^ 4) <= ({} > ([ , 0 ].length === 2)) == ((24..toString() ^ -0) & (a_1 = 23..toString() <= "function")))
                                    }[(c = 1 + c, (-2 != 4 ^ 1 != -5) >> ((2 | -3) ^ (-3 ^ 25)))]] = (2 | "object") * (a_2 && (a_2.b = 5 !== 25))));
                                    c = 1 + c, a_2 = (c = c + 1, 1) << (/[a2][^e]+$/ >= "number") >>> (a_2 && (a_2[(c = c + 1) + function() {
                                    }()] = -5 - 24..toString() ^ (a_2 && (a_2[(c = 1 + c, -((24..toString() !== 3) << "undefined" + undefined))] *= 22 ^ 0))));
                                }
                                break;

                              case void a:
                                {
                                    var b = function f0(arguments_2) {
                                    }((c = 1 + c, a_1 && (a_1.in /= (22 << Infinity <= (a_1 && (a_1[(c = 1 + c, (a_1 && (a_1[a++ + b--] += (25 || 23..toString(), 
                                    2 < true))) === ((-4 && "bar") == 4 <= "function"))] += "number" > [ , 0 ][1]))) * ~(-1 !== false))));
                                }
                                {
                                    var brake41 = 5;
                                    do {
                                        c = c + 1;
                                    } while ((c = c + 1) + void function() {
                                    }() && --brake41 > 0);
                                }
                                break;

                              case (c = c + 1) + +(a_1 && (a_1.b += delete (24..toString() >= [ , 0 ][1]) <= (([] != 3) > 23..toString() + []))):
                                c = c + 1;
                                break;
                            }
                        }
                    }
                } finally {
                    var a_1 = -5, a_1 = a++ + ((null >= Infinity) >>> 5 / /[a2][^e]+$/ < (2 <= 5 | false * ([ , 0 ].length === 2)) || 4).toString()[a++ + (b + 1 - .1 - .1 - .1)];
                    {
                        var brake45 = 5;
                        do {
                            switch (a++ + {
                                var: --b + true
                            }.Infinity) {
                              case a_1 && a_1.length:
                                if ((c = c + 1) + +b) {
                                    c = c + 1;
                                }
                                break;

                              case (c = c + 1) + a++:
                                {
                                    var expr49 = {
                                        var: (c = 1 + c, (1 & "function") + ([] ^ 2) != (a_1 += "function" != "function" && ([ , 0 ].length === 2) % 25))
                                    };
                                    for (var key49 in expr49) {
                                        c = 1 + c;
                                        var a_1_2 = expr49[key49];
                                        {
                                        }
                                    }
                                }
                                {
                                    var brake51 = 5;
                                    while (a++ + a++ && --brake51 > 0) {
                                    }
                                }

                              default:
                                var foo = a++ + (a_1_2 && a_1_2[(c = 1 + c, ("object" < 38..toString() !== 24..toString() < "undefined") + ("number" === [ , 0 ][1], 
                                25 % 24..toString()))]);

                              case a_1_2 && a_1_2.var:
                                {
                                    var expr54 = --b + (a_1_2 && a_1_2.length);
                                    for (var key54 in expr54) {
                                        c = 1 + c;
                                        var a_1 = expr54[key54];
                                        c = c + 1;
                                    }
                                }
                                break;
                            }
                        } while ((c = c + 1) + {
                            3: --b + void a
                        }.length && --brake45 > 0);
                    }
                }
                var a_1_2 = a++ + ++b, c_1 = !b;
                if (--b + +b) {
                    for (var brake58 = 5; {
                        foo: (c = c + 1) + [ b++ ],
                        var: {
                            Infinity: --b + (typeof c_2 == "unknown"),
                            0: b--
                        }.b,
                        "": a++ + ++b,
                        length: +((c_1 && (c_1[1 === 1 ? a : b] = (a_1_2 && (a_1_2.Infinity = null == 22)) & (true || 25))) !== 4 <= 3 < (-5 < Infinity)),
                        3: (c = c + 1) + (b += a)
                    }.undefined && brake58 > 0; --brake58) {
                        var a_1;
                    }
                } else {
                    var brake60 = 5;
                    while ((b = a) && --brake60 > 0) {
                        var expr61 = [ (c = c + 1) + (a_1 && a_1.b), a++ + ({
                            Infinity: (c = 1 + c, void (5 && /[a2][^e]+$/) < (("undefined" ^ 38..toString()) !== (Infinity == 3))),
                            null: (c = 1 + c, (("foo" ^ 4) === null << -3) > (-0 << "function" ^ (-3 ^ 5))),
                            c: (c = 1 + c, true !== NaN != -4 * "" & {} < "undefined" >= ([] < 25)),
                            3: (c = 1 + c, a_1 && (a_1.in = (c = c + 1, 2, 25) + ((Infinity & /[a2][^e]+$/) == (a_1 <<= 23..toString() >= 5))))
                        }[(c = 1 + c, c = c + 1, c = c + 1, ~0)] || 5).toString()[(c = c + 1) + [ (c = 1 + c, 
                        (c = c + 1, [ , 0 ][1] >>> "undefined") >> (24..toString() - 2) / ("undefined" + 25)), (c = 1 + c, 
                        1 % 0 + ([ , 0 ].length === 2 !== "") <= "bar" + 22 + (3 <= 38..toString())), (c = 1 + c, 
                        true + Infinity == (c = c + 1, false) === (38..toString() / -0, false ^ {})) ].foo], --b + {
                            undefined: (c = 1 + c, (null, "bar") * (-1 != 22) >= (2 << /[a2][^e]+$/) % (-5 !== "")),
                            undefined: (c = 1 + c, (-4 ^ true) & null == null && 23..toString() >> 5 >> (false ^ 4)),
                            length: (c = 1 + c, ([ , 0 ][1] * 2, 5 ^ 0) & (-5 * -2 || -1 ^ {})),
                            NaN: (c = 1 + c, 4 != true !== (-3 && [ , 0 ][1]) & (-1 << 25 | (a_1_2 += "function" || -2))),
                            b: (c = 1 + c, a_1 = /[a2][^e]+$/ >> -0 >> (a_1_2 = 0 << 25) >= ((foo_1 && (foo_1[(c = 1 + c, 
                            foo_1 && (foo_1[typeof undefined_2 != "undefined"] = (a_1 && (a_1[(c = 1 + c, (-3 || NaN) <= 3 + Infinity & ("" ^ 2) >= (5 !== "bar"))] += "number" ^ -3)) - (a_1 >>= 4 ^ 3) < ((foo_1 -= null <= 23..toString()) === true >>> 22)))] += 38..toString() <= true)) | null * ([ , 0 ].length === 2)))
                        }.foo, [ , (c = 1 + c, c_1 && (c_1[--b + (b + 1 - .1 - .1 - .1)] += (25 >> undefined) + ("undefined" >= "bar") >> (3 && "foo", 
                        false, null))), (c = 1 + c, undefined !== "number" != ("undefined" & "object"), 
                        a_1 = ("bar" != 25) << (2 === Infinity)), (c = 1 + c, 24..toString() / ([ , 0 ].length === 2) > (c_1 = -3 ^ "function") <= (-2 / -1 !== (a_1 && (a_1[(c = 1 + c, 
                        !(-2 == {}) << ([] >= 2 > 2 / 2))] <<= true << [ , 0 ][1])))) ][b = a], (undefined ^ /[a2][^e]+$/ || (2 || -5)) | ("number" || 1) >>> (c_1 && (c_1[(c = 1 + c, 
                        (c_1 += 5 - 1 ^ undefined < "") || (a_1 = -3 & 3) === "foo" << {})] += true / ([ , 0 ].length === 2))) ][a++ + true];
                        for (var key61 in expr61) {
                            c = 1 + c;
                            var foo_1 = expr61[key61];
                            if ((c = c + 1) + -a) {
                                +function() {
                                    c = 1 + c, a_1 && (a_1.Infinity += ([] / true && "foo" + -0) * ((a_1 && (a_1[(c = 1 + c, 
                                    (NaN * "number" && "object" === 24..toString()) ^ (c_1 = ([ , 0 ].length === 2) / undefined * ("number" && 5)))] = 2 | [ , 0 ].length === 2)) === ([] ^ [ , 0 ].length === 2)));
                                    c = 1 + c, NaN / 2 <= (Infinity >= "object") !== (a_1 && (a_1.in = -5 & 5)) <= (foo_1 && (foo_1[(c = 1 + c, 
                                    (0 % "bar" ^ "foo" - 5) > (c = c + 1, 3) + (foo_1 >>= -0 > 5))] += -5 << 22));
                                }();
                            }
                        }
                    }
                }
                switch (--b + (((false ^ /[a2][^e]+$/) > (c_1 && (c_1.NaN = 4 / 25))) - ((-0 === 1) >> ([] >> "")))) {
                  case --b + -((-1 === false && (c = c + 1, 4)) - ((undefined & 5) >= (23..toString() >= false))):
                    a++ + a--;
                    --b + [ , a++ + {}[(c = c + 1) + (b = a)], --b + (typeof a_1_2_2 == "object") ][a++ + {
                        "": --b + -1,
                        "-2": [ (c = 1 + c, ("", "function", 23..toString() * 38..toString()) >= delete (5 * "number")) ]
                    }];
                    break;

                  default:
                    {
                        var brake69 = 5;
                        L202266: do {
                            {
                                var brake70 = 5;
                                L202267: while (--b + a-- && --brake70 > 0) {
                                    var Infinity = function f1(a_2, bar_2, b_1) {
                                        c = 1 + c, (3 || -5) >> (true ^ []) >> (23..toString() << null && "bar" != []);
                                        c = 1 + c, b_1 = (!null + -4 % 22) * ((null >= 38..toString()) * delete "function");
                                    }(a++ + (b += a));
                                }
                            }
                        } while ((c = c + 1) + {
                            foo: --b + (a++ + [ (c = 1 + c, (undefined !== -4 ^ (-3 ^ -1)) % ({} !== [] ^ (a_1 && (a_1[(c = 1 + c, 
                            (true + -4 != 2 / /[a2][^e]+$/) >> (a_1 && (a_1.Infinity ^= ([ , 0 ][1] >>> NaN) / (0 + "undefined"))))] = true * undefined)))), (c = 1 + c, 
                            ~(("number" && "bar") ^ 0 / 5)) ].foo || a || 3).toString(),
                            undefined: --b + (-(-0 << Infinity) || ("number" === 23..toString(), 5 != 3)),
                            0: (c = c + 1) + (b = a),
                            3: -(((a_1 += NaN | 1) | (3, Infinity)) <= (-2 ^ 5) >> (23..toString() === 25)),
                            a: [ (c = 1 + c, (("foo", -5) === (NaN == 1)) + (22 < undefined === "object" % 1)), (c = 1 + c, 
                            (3 ^ 1 ^ ("undefined" && /[a2][^e]+$/)) % delete ([] != undefined)) ]
                        }[b += a] && --brake69 > 0);
                    }
                    ;

                  case --b + (c_1 && c_1[a++ + (foo_1 && foo_1[(c = c + 1) + ++a] ? --b + function() {
                        {
                            var brake75 = 5;
                            while ((c = c + 1) + -1 && --brake75 > 0) {
                            }
                        }
                    }() : a++ + [ {
                        undefined: (c = 1 + c, (24..toString() ^ -5) % ([ , 0 ].length === 2 && 4) + ([ , 0 ].length === 2 == undefined === (foo_1 /= null | "number"))),
                        "-2": (c = 1 + c, c_1 && (c_1[[]] = (3 !== -5) - -38..toString() + (("foo", 23..toString()) >= (0, 
                        "foo"))))
                    }.c, 0 === 1 ? a : b, --b + {
                        undefined: (c = 1 + c, ((a_1 && (a_1[(c = 1 + c, (0 <= "bar") + (-2 >> []) > (("foo" === 1) <= ("undefined" != 38..toString())))] += 5 && "")) - ("object" + -3)) * ("bar" % [ , 0 ][1] % (-1 >>> ([ , 0 ].length === 2)))),
                        length: (c = 1 + c, (+23..toString() | !"number") + (c_1 ^= -5 < "foo" && -4 ^ 24..toString())),
                        Infinity: (c = 1 + c, (true === 2 ^ (a_1 = -2 << "undefined")) <= (false + ([ , 0 ].length === 2)) / (a_1 && (a_1[(c = 1 + c, 
                        a_1 += (c = c + 1, /[a2][^e]+$/ << "number") < (-4 / undefined && (a_1 && (a_1[(c = 1 + c, 
                        "number" ^ "bar" ^ "number" / 2 ^ ([ , 0 ][1] === "bar") > ("bar" && {}))] %= ([ , 0 ].length === 2) >= []))))] = "number" <= 24..toString())))
                    }.a ])]):
                    break;

                  case a++ + (1 === 1 ? a : b):
                    break;
                }
            }
        }
    }
} finally {
    try {
        {
            throw (b = a) ? b = a : {
                undefined: --b + ({
                    null: [ (c = 1 + c, (23..toString() >= 4) - (foo_1 && (foo_1[(c = 1 + c, ((3 || Infinity) != (a_1.a *= "foo" == [])) < (c_1[a_1 && a_1[(c = 1 + c, 
                    ("foo" != 22) / (false << false) & (/[a2][^e]+$/ >= {} && -2 - -5))]] = 23..toString() & "" | Infinity * undefined))] = [ , 0 ].length === 2 ^ 4)) == (1 << NaN) + (foo_1 += undefined * -0)), ,  ][(c = 1 + c, 
                    c_1 && (c_1.foo += (NaN % -1 != (c = c + 1, 22)) >>> (25 ^ 3) + ([] === -5)))],
                    undefined: typeof c,
                    var: a++ + (b + 1 - .1 - .1 - .1),
                    "": a++ + typeof parseInt_1,
                    length: [ (c = 1 + c, (a_1_2 *= 1 < /[a2][^e]+$/) <= null >> true ^ (-3, 25) >= (-5 >= "undefined")), (c = 1 + c, 
                    ("undefined" ^ -5) == (a_1 && (a_1.undefined = [ , 0 ].length === 2 ^ "bar")) || undefined << "number" ^ 25 > undefined) ]
                } ? (+(4 > "undefined" >= (a_1 && (a_1[(c = 1 + c, (-1 <= "number") - (1 == "") & (c = c + 1, 
                -0 | /[a2][^e]+$/))] = -1 & -0)) && 1 - null ^ ([], [ , 0 ][1])) || 7).toString()[a++ + ((c = c + 1) + [ (c = 1 + c, 
                (4 === true ^ (a_1_2 && (a_1_2.undefined += "function" << 38..toString()))) % ("number" + -5 <= - -2)), (c = 1 + c, 
                (a_1 && (a_1[a++ + "bar"] >>>= false % 23..toString() >= (-0 > Infinity))) - ("number" % 5 !== (a_1 && (a_1[(c = 1 + c, 
                (24..toString() ^ -3) + (25 || -0) - ((c = c + 1, "bar") !== (a_1 && (a_1[(c = 1 + c, 
                null - 38..toString() >> undefined / "number" >> (foo_1 && (foo_1.b = "bar" | /[a2][^e]+$/)) + (25 || [ , 0 ].length === 2))] += "object" / -4))))] = 24..toString() < -0)))), (c = 1 + c, 
                ((a_1 && (a_1.c &= "bar" + -0)) <= -4 % "bar") >> ([] == -3 || a_1 && (a_1[(c = 1 + c, 
                ((1, [ , 0 ][1]) >= (23..toString() === 23..toString())) << (c = c + 1, 24..toString() - [ , 0 ][1]))] = 23..toString() >= Infinity))), (c = 1 + c, 
                (-2 === 24..toString() || "undefined" < -5) < (c = c + 1, /[a2][^e]+$/, 2)) ][(c = 1 + c, 
                (a_1 && (a_1[a++ + (0 === 1 ? a : b)] -= 0 - 25 ^ void "foo")) | (true | 1) << ("" & -5))] || 7).toString()[-a]] : a++ + (typeof foo_2 != "string")),
                null: -b
            }[2];
        }
    } catch (foo_2) {
        try {
            L202268: {
                {
                    throw (null + -3 >= (null < 0)) / ({} <= undefined === (a_1 = undefined === /[a2][^e]+$/));
                }
            }
        } catch (a) {
            c = c + 1;
            --b + (foo_2 && foo_2[!function a_2() {
                if (c = 1 + c, ("number" << 24..toString() >>> (4 == [])) - (/[a2][^e]+$/ >>> true) % (([ , 0 ].length === 2) < NaN)) {
                    c = 1 + c, (a_1 && (a_1.null %= ("bar" == "object") - ("number" && "function"))) < ({} !== {} !== ("bar" ^ 24..toString()));
                }
                {
                    var brake88 = 5;
                    do {
                        c = 1 + c, (foo_1 && (foo_1.in -= "bar" | -4), null * [ , 0 ][1]) % (Infinity / 25 * (22 << "function"));
                    } while ((c = 1 + c, ([ , 0 ].length === 2 ^ {}) & NaN - -0 ^ (-5 | Infinity) << NaN % 24..toString()) && --brake88 > 0);
                }
            }()]);
        }
    }
    (function() {
        try {
            {
                var brake92 = 5;
                L202269: while (--b + delete b && --brake92 > 0) {
                    if (--b + (typeof foo_1 != "crap")) {
                        try {
                            {
                                var brake95 = 5;
                                L202270: do {
                                    {
                                        return c = 1 + c, (undefined != null) / ("function" ^ 24..toString()) !== ~(a_1 && (a_1[(c = 1 + c, 
                                        ((foo_1.NaN += 0 ^ -1) == -24..toString()) * ((3, 1) ^ "bar" > -0))] = 3 != 38..toString()));
                                    }
                                } while ({
                                    in: (c = 1 + c, {} % Infinity / (-5 != -4) >>> (void 22 << ("bar" | {}))),
                                    in: (c = 1 + c, null % 5 - (a_1 && (a_1.in /= "" >> "")) !== [] << [ , 0 ][1] > (0, 
                                    22)),
                                    a: (c = 1 + c, (-1 ^ 25 | 25 !== -0) < ((undefined | -0) & "bar" * 5))
                                } && --brake95 > 0);
                            }
                        } catch (bar_2) {
                            try {
                                c = 1 + c, (("bar", 2) && "function" !== /[a2][^e]+$/) != (a_1 && (a_1[(c = 1 + c, 
                                (24..toString() == [] != (c = c + 1, Infinity)) <= (c = c + 1, 0) >> (undefined << ""))] = true << -0)) < 22 >> true;
                            } finally {
                            }
                            {
                                var brake99 = 5;
                                L202271: while ((c = 1 + c, (a_1_2 && (a_1_2[a++ + [ (c = 1 + c, foo_1 += (c = c + 1, 
                                -0 + -0) === (false <= -0) + (38..toString() ^ 2)), , (c = 1 + c, (a_1 = undefined & "number") ^ 1 & "foo" ^ {} / ([ , 0 ].length === 2) + ({} != false)) ]] = (c_1 += "number" != false) % ~-5)) ^ ("undefined" >= 1 ^ "bar" % [ , 0 ][1])) && --brake99 > 0) {
                                    c = 1 + c, (("undefined", 23..toString()) || "foo" < -5) != (2 / "function" & (-4 & /[a2][^e]+$/));
                                }
                            }
                        } finally {
                            c = c + 1;
                            c = c + 1;
                        }
                    } else {}
                }
            }
        } catch (b_1) {
            if (--b + (typeof undefined_2 != "string")) {
                switch (a++ + -(((b_1 && (b_1[(c = 1 + c, (c_1 && (c_1[--b + (1 === 1 ? a : b)] /= (5 !== false) / +2)) == ((c = c + 1, 
                3) != undefined <= []))] = 5 & [ , 0 ].length === 2)) > {} >> []) >>> ((foo_1 && (foo_1[(c = 1 + c, 
                (([] === null) - (-2 >>> "bar")) % ((foo_1 && (foo_1[(c = 1 + c, (-1 != 25) >> Infinity % 2 == (c = c + 1, 
                "object") > (NaN ^ {}))] = -2 === [])) ^ 38..toString() << 24..toString()))] = {} % -3)) === ("bar" || null)))) {
                  default:
                    c = 1 + c, (("" !== "bar") < ("bar" ^ -4)) * (/[a2][^e]+$/ ^ 1 && -4 - -0);

                  case --b + b--:
                    {
                        var expr107 = (c = 1 + c, ([ , 0 ][1] || "object") > ("" === null) ^ {} <= [] != ("" ^ ""));
                        for (var key107 in expr107) {
                            c = 1 + c;
                            var a_1_2 = expr107[key107];
                            c = 1 + c, delete ("function" < ([ , 0 ].length === 2)) >>> (-0 * NaN >> (-2 !== 5));
                        }
                    }
                    break;

                  case a++ + {
                        length: (c = 1 + c, 24..toString() * -4 >>> ([ , 0 ].length === 2) - Infinity != (-0 != -4 !== ([], 
                        []))),
                        var: (c = 1 + c, ((c_1 = "foo" == 3) && ("function" || null)) == (2 | 23..toString()) > "object" >>> 5),
                        length: (c = 1 + c, (a_1 && (a_1.foo += -5 >> 2 ^ 24..toString() >= "function")) < (25 === 23..toString()) >>> (3 <= 4)),
                        a: (c = 1 + c, "function" >>> [] <= undefined << 24..toString() | ("function" ^ Infinity) != 4 * ""),
                        undefined: (c = 1 + c, (22 != 23..toString()) < (Infinity ^ 25) != ([] * [] === ([ , 0 ].length === 2 && 4)))
                    }[--b + {
                        NaN: (c = 1 + c, false * -4 * (24..toString(), 24..toString()) || (-0 || 2) | undefined ^ {}),
                        a: (c = 1 + c, (undefined, null) % (-1 % -1) & ({} & -0) - (-0 && "foo")),
                        in: (c = 1 + c, -0 >>> [] !== (undefined ^ "object") || -4 / -3 / ("bar" <= "object")),
                        1.5: (c = 1 + c, (([ , 0 ].length === 2) - "") * (4 <= 25) || ("undefined" && -1) * ("number" + "bar"))
                    }.var]:
                    c = 1 + c, ("number" >= ([ , 0 ].length === 2) ^ 23..toString() !== 4) >= (undefined ^ true) % (null | {});
                    ;
                    break;

                  case --b + ++a:
                    try {
                        c = 1 + c, (a_1 += 5 && -5, NaN <= 5) + (([] && 3) | "bar" - null);
                    } catch (foo_1) {
                    } finally {
                    }
                    try {
                        c = 1 + c, 23..toString() >>> NaN < {} * [ , 0 ][1] !== ~(a_1_2 = 3 << -3);
                    } finally {
                    }
                    break;
                }
            }
            L202272: {
                a++ + /[abc4]/.test(((c = 1 + c, ("object" && /[a2][^e]+$/) << (c = c + 1, []) > (NaN * null < (5 ^ /[a2][^e]+$/))) || b || 5).toString());
                for (var brake117 = 5; a-- && brake117 > 0; --brake117) {
                    try {
                        c = 1 + c, /[a2][^e]+$/ / Infinity <= (-4 <= []) <= ((a_1_2 |= 5 ^ "bar") <= (a_1_2 = 25 * "object"));
                    } catch (a) {
                    } finally {
                    }
                }
                {
                    var expr120 = a++ + (c = 1 + c, (-1, -0) == ([] || -2) && "" <= -4 != -3 / "object");
                    for (var key120 in expr120) {
                        {
                            var expr121 = (c = 1 + c, true * [ , 0 ][1] * (-1 >= -4) & (a_1 <<= /[a2][^e]+$/ >= false == ("object" && false)));
                            for (var key121 in expr121) {
                                c = 1 + c, (2 + "function" ^ 5 != /[a2][^e]+$/) << (delete 5 << (25 > 22));
                            }
                        }
                    }
                }
            }
        }
    })();
}

console.log(null, a, b, c);

```js
// uglified code
// (beautified)
var a = 100, b = 10, c = 0;

--b, a++;

try {
var expr3 = b--;
for (var key3 in expr3) {
c = 1 + c;
var Math = expr3[key3];
try {
23..toString(), a++, /[abc4]/.test((--b + {
b: (c = 1 + c, c += 1, [ , 0 ][1] << -5 | 24..toString() > 24..toString()),
1.5: (c = 1 + c, a && (a[a && a[--b + [ (c = 1 + c, 0 + (24..toString() >> []) << (22 ^ (a && (a.undefined *= "")))), (c = 1 + c,
c += 1, 24..toString() << "bar" >> (Infinity <= (c += 1, "number"))), (c = 1 + c,
!1), (c = 1 + c, !1 - (24..toString(), !0)) ].NaN]] |= (!0 & 24..toString()) - 7 >= (!0 !== (4 ^ []))))
} || b || 5).toString()), a && a[/[abc4]/.test((--b + {}[void (c = 1 + c)] || b || 5).toString())],
a++, c += 1, c += 1, c += 1, ++a && (a[(c = 1 + c, ((a += NaN) && "number" === 23..toString()) % 1)] = (2 === [ , 0 ].length) <= 23..toString()),
a = 4 !== 24..toString(), a++, ++a && a.foo, c += 1, b--, c += 1, a += "undefined" - 24..toString(),
23..toString();
} catch (Infinity) {
switch ({
foo: a++ + []
}) {
case (c += 1) + {
3: a++,
0: [ (c = 1 + c, 4 < [ , 0 ][1] > (-3 != 38..toString()) == (1 != 38..toString()) >= ("bar" ^ [])) ],
a: --b + ("string" == typeof a_1),
NaN: a++ + {
3: (c = 1 + c, !1 > (a && (a.foo %= 2))),
foo: (c = 1 + c, ([ , 0 ][1] << NaN != NaN) + ((a && (a[(c = 1 + c, !0 >>> (NaN != 24..toString()) % 0)] = 22)) === "foo" <= 24..toString())),
foo: (c = 1 + c, -(38..toString() === /[a2][^e]+$/) - (!1 !== [ , 0 ][1] / "")),
"": (c = 1 + c, ("undefined" === [] != 0) <= (-0 * 38..toString() & -27)),
1.5: (c = 1 + c, a && (a[(c = 1 + c, (!1 >= (a && (a.undefined += -1))) - (c += 1,
NaN))] = NaN), "number" >> 23..toString() >= (!1 < NaN << []))
}.NaN,
set NaN(c) {
this.length |= {} << 1 != (-4 !== 38..toString()) != 11 << [] + null;
}
}.a:
var brake13, brake11, brake15 = 5;
do {
c += 1;
} while ([ (c = 1 + c, 0 == ((2 === [ , 0 ].length) <= 5 ^ (a && (a.Infinity /= !1)))), (c = 1 + c,
a && (a.NaN = (!0 / -3 | [ , 0 ][1] > 22) % (c += 1, -5 >>> (a ^= [ , 0 ][1] / (2 === [ , 0 ].length))))) ].foo && --brake15 > 0);
if (--b + a--) {
for (var brake18 = 5; (c += 1) + a++ && --brake18 > 0; ) {
var brake19 = 5;
do {
c = 1 + c, a = !1;
} while (c = 1 + c, a && (a[a && a[--b + {
undefined: (c = 1 + c, c += 1, ("object" << 24..toString()) % 1)
}[(c = 1 + c, 0)]]] = {} << "function" >= (a = !1) | 0 % (5 >>> 23..toString())) && --brake19 > 0);
}
}
break;

          case !0:
            for (var brake21 = 5; [ (c = 1 + c, a && (a[0] += [] >> (2 === [ , 0 ].length) << (23..toString(), 
            NaN) !== (c += 1, !0))), (c = 1 + c, !1 / (0 | (c += 1, 24..toString()))) ].null && --brake21 > 0; ) {
                c = 1 + c;
            }
            for (var brake23 = 5; (c += 1) + {}.null && --brake23 > 0; ) {
                var a_1 = a++ + (c = 1 + c, (-0 ^ (a_1 && (a_1[(c = 1 + c, !0 !== (a_1 = -50))] = /[a2][^e]+$/ + 22))) % !0 ? (c = 1 + c, 
                (-0 === 38..toString() && NaN / 23..toString()) ^ void 0 != {} !== 0) : (c = 1 + c, 
                a_1 |= (a_1 && (a_1[--b + delete b] += 24..toString() / 1 || 2 !== [ , 0 ][1])) !== (a_1 = NaN)));
            }

          case a++ + +a:
          case --b + {
                NaN: a++ + a++
            }.length:
        }
        for (var brake26 = 5; --b + ++a && --brake26 > 0; ) {
            switch (--b) {
              case +a:
                for (var brake28 = 5; a++ + (b <<= a) && brake28 > 0; --brake28) {
                    c = 1 + c, c += 1;
                }
                switch (--b) {
                  case a++ + a:
                    break;

                  default:
                    c = 1 + c, a_1 ^= {} / ([] >= -0) <= !1 - ({} != /[a2][^e]+$/);

                  case (c += 1) + {
                        "\t": (c = 1 + c, (38..toString() < !0 | 0 * 38..toString()) - (a_1 && (a_1[(([ , 0 ][1] ^ Infinity) > !1 && (23..toString(), 
                        c += 1), !0)] = [ , 0 ][1] > NaN > (-1 & 38..toString()))))
                    }[(c = 1 + c, c += 1, -0 < (c += 1, 0))]:
                    c = 1 + (c = 1 + c), a_1 >>>= -26;
                    break;

                  case "":
                    c = 1 + c, a_1 && (a_1.in *= "foo" << 38..toString()), c = 1 + c;
                }
                break;

              case a++ + /[abc4]/.test((a_1 && a_1.null || b || 5).toString()):
                break;

              case void 0:
                var b = (c = 1 + c, void (a_1 && (a_1.in /= -2 * (22 << Infinity <= (a_1 && (a_1[(c = 1 + c, 
                !1 === (a_1 && (a_1[a++ + b--] += !1)))] += "number" > [ , 0 ][1])))))), brake41 = 5;
                do {
                    c += 1;
                } while ((c += 1) + void 0 && --brake41 > 0);
                break;

              case (c += 1) + +(a_1 && (a_1.b += (24..toString(), !0 <= ((3 != []) > 23..toString() + [])))):
                c += 1;
            }
        }
    } finally {
        var a_1 = -5, a_1 = a++ + ((null >= Infinity) >>> NaN < (!0 | !1 * (2 === [ , 0 ].length)) || 4).toString()[a++ + (b + 1 - .1 - .1 - .1)], brake45 = 5;
        do {
            switch (a++ + {
                var: --b + !0
            }.Infinity) {
              case a_1 && a_1.length:
                (c += 1) + +b && (c += 1);
                break;

              case (c += 1) + a++:
                var expr49 = {
                    var: (c = 1 + c, 0 + (2 ^ []) != (a_1 += !1))
                };
                for (var key49 in expr49) {
                    c = 1 + c;
                    var a_1_2 = expr49[key49];
                }
                for (var brake51 = 5; a++ + a++ && --brake51 > 0; ) {}

              default:
                var foo = a++ + (a_1_2 && a_1_2[(c = 1 + c, ("object" < 38..toString() != 24..toString() < "undefined") + 25 % 24..toString())]);

              case a_1_2 && a_1_2.var:
                var expr54 = --b + (a_1_2 && a_1_2.length);
                for (var key54 in expr54) {
                    c = 1 + c;
                    var a_1 = expr54[key54];
                    c += 1;
                }
            }
        } while ((c += 1) + {
            3: --b + void 0
        }.length && --brake45 > 0);
    }
    var a_1_2 = a++ + ++b, c_1 = !b;
    if (--b + +b) {
        for (var brake58 = 5; {
            foo: (c += 1) + [ b++ ],
            var: {
                Infinity: --b + ("unknown" == typeof c_2),
                0: b--
            }.b,
            "": a++ + ++b,
            length: +((c_1 && (c_1[a] = !0 & (a_1_2 && (a_1_2.Infinity = !1)))) !== !1 < (-5 < Infinity)),
            3: (c += 1) + (b += a)
        }.undefined && brake58 > 0; --brake58) {
            var a_1;
        }
    } else {
        for (var brake60 = 5; (b = a) && --brake60 > 0; ) {
            var expr61 = [ (c += 1) + (a_1 && a_1.b), a++ + ({
                Infinity: (c = 1 + c, void 0 < (("undefined" ^ 38..toString()) !== (3 == Infinity))),
                null: (c = 1 + c, !0),
                c: (c = 1 + c, !0 & {} < "undefined" >= ([] < 25)),
                3: (c = 1 + c, a_1 && (a_1.in = (c += 1, 25 + ((Infinity & /[a2][^e]+$/) == (a_1 <<= 23..toString() >= 5)))))
            }[(c = 1 + c, c += 1, c += 1, -1)] || 5).toString()[(c += 1) + [ (c = 1 + c, c += 1, 
            [ , 0 ][1] >>> "undefined" >> (24..toString() - 2) / "undefined25"), (c = 1 + c, 
            NaN + (2 === [ , 0 ].length !== "") <= "bar22" + (3 <= 38..toString())), (c = 1 + c, 
            !0 + Infinity == (c += 1, !1) === (38..toString(), !1 ^ {})) ].foo], --b + {
                undefined: (c = 1 + c, !1),
                undefined: (c = 1 + c, 23..toString() >> 5 >> 4),
                length: (c = 1 + c, 0),
                NaN: (c = 1 + c, !0 !== [ , 0 ][1] & (-1 << 25 | (a_1_2 += "function"))),
                b: (c = 1 + c, a_1 = 0 >> (a_1_2 = 0) >= ((foo_1 && (foo_1[(c = 1 + c, foo_1 && (foo_1["undefined" != typeof undefined_2] = (a_1 && (a_1[(c = 1 + c, 
                -3 <= 3 + Infinity & !0)] += -3)) - (a_1 >>= 7) < (0 == (foo_1 -= null <= 23..toString()))))] += 38..toString() <= !0)) | null * (2 === [ , 0 ].length)))
            }.foo, [ , (c = 1 + c, c_1 && (c_1[--b + (b + 1 - .1 - .1 - .1)] += 26)), (c = 1 + c, 
            a_1 = !0 << (2 === Infinity)), (c = 1 + c, 24..toString() / (2 === [ , 0 ].length) > (c_1 = -3) <= (2 !== (a_1 && (a_1[(c = 1 + c, 
            !(-2 == {}) << ([] >= 2 > 1))] <<= !0 << [ , 0 ][1])))) ][b = a], 2 | "number" >>> (c_1 && (c_1[(c = 1 + c, 
            (c_1 += 4) || (a_1 = 1) == "foo" << {})] += !0 / (2 === [ , 0 ].length))) ][a++ + !0];
            for (var key61 in expr61) {
                c = 1 + c;
                var foo_1 = expr61[key61];
                (c += 1) + -a && (c = 1 + c, a_1 && (a_1.Infinity += ([] / !0 && "foo0") * ((a_1 && (a_1[(c = 1 + c, 
                NaN ^ (c_1 = (2 === [ , 0 ].length) / void 0 * 5))] = 2 | 2 === [ , 0 ].length)) === ([] ^ 2 === [ , 0 ].length))), 
                c = 1 + c, a_1 && (a_1.in = 1), foo_1 && (foo_1[(c = 1 + c, 0 > (c += 1, 3 + (foo_1 >>= !1)))] += -5 << 22));
            }
        }
    }
    switch (--b + ((0 > (c_1 && (c_1.NaN = .16))) - (!1 >> ([] >> "")))) {
      case --b - (!1 - (0 >= (23..toString() >= !1))):
        a++, a--, --b, b = ++a, --b, a++, --b, c = 1 + (c += 1), 23..toString(), 38..toString();
        break;

      default:
        var brake69 = 5;
        do {
            for (var brake70 = 5; --b + a-- && --brake70 > 0; ) {
                var Infinity = function(a, t, n) {
                    c = 1 + c, 23..toString(), c = 1 + c, 38..toString();
                }((a++, b += a));
            }
        } while ((c += 1) + {
            foo: --b + (a++ + [ (c = 1 + c, 3 % ({} !== [] ^ (a_1 && (a_1[(c = 1 + c, !0 >> (a_1 && (a_1.Infinity ^= ([ , 0 ][1] >>> NaN) / "0undefined")))] = NaN)))), (c = 1 + c, 
            -1) ].foo || a || 3).toString(),
            undefined: --b + (-(-0 << Infinity) || (23..toString(), !0)),
            0: (c += 1) + (b = a),
            3: -(((a_1 += 1) | Infinity) <= -5 >> (25 === 23..toString())),
            a: [ (c = 1 + c, 0), (c = 1 + c, 0) ]
        }[b += a] && --brake69 > 0);

      case --b + (c_1 && c_1[a++ + (foo_1 && foo_1[(c += 1) + ++a] ? --b + function() {
            for (var a = 5; (c += 1) + -1 && --a > 0; ) {}
        }() : a++ + [ {
            undefined: (c = 1 + c, (-5 ^ 24..toString()) % (2 === [ , 0 ].length && 4) + (2 === [ , 0 ].length == void 0 === (foo_1 /= 0))),
            "-2": (c = 1 + c, c_1 && (c_1[[]] = !0 - -38..toString() + (23..toString() >= "foo")))
        }.c, b, --b + {
            undefined: (c = 1 + c, ((a_1 && (a_1[(c = 1 + c, !1 + (-2 >> []) > (!1 <= ("undefined" != 38..toString())))] += "")) - "object-3") * ("bar" % [ , 0 ][1] % (-1 >>> (2 === [ , 0 ].length)))),
            length: (c = 1 + c, (!1 | +23..toString()) + (c_1 ^= !1)),
            Infinity: (c = 1 + c, (!1 ^ (a_1 = -2)) <= (!1 + (2 === [ , 0 ].length)) / (a_1 && (a_1[(c = 1 + c, 
            a_1 += (c += 1, !1))] = "number" <= 24..toString())))
        }.a ])]):
      case a++ + a:
    }
}

} finally {
try {
throw (b = a) ? b = a : {
undefined: --b + (c = 1 + c, 23..toString(), foo_1 && (foo_1[(c = 1 + c, (3 != (a_1.a *= "foo" == [])) < (c_1[a_1 && a_1[(c = 1 + c,
1 / 0 & (/[a2][^e]+$/ >= {} && 3))]] = "" & 23..toString() | void 0 * Infinity))] = 2 === [ , 0 ].length ^ 4),
foo_1 += NaN, c = 1 + c, c_1 && (c_1.foo += (NaN != (c += 1, 22)) >>> 26 + (-5 === [])),
a++, a++, c = 1 + c, a_1_2 *= !1, c = 1 + c, a_1 && (a_1.undefined = 2 === [ , 0 ].length ^ "bar"),
(+(!1 >= (a_1 && (a_1[(c = 1 + c, 0 & (c += 1, 0))] = 0)) && 1 ^ [ , 0 ][1]) || 7).toString()[a++ + ((c += 1) + [ (c = 1 + c,
(!1 ^ (a_1_2 && (a_1_2.undefined += "function" << 38..toString()))) % !1), (c = 1 + c,
(a_1 && (a_1[a++ + "bar"] >>>= !1 % 23..toString() >= (-0 > Infinity))) - (NaN !== (a_1 && (a_1[(c = 1 + c,
25 + (-3 ^ 24..toString()) - (c += 1, "bar" !== (a_1 && (a_1[(c = 1 + c, null - 38..toString() >> NaN >> (foo_1 && (foo_1.b = 0)) + 25)] += NaN))))] = 24..toString() < -0)))), (c = 1 + c,
((a_1 && (a_1.c &= "bar0")) <= NaN) >> (-3 == [] || a_1 && (a_1[(c = 1 + c, ([ , 0 ][1] >= (23..toString() === 23..toString())) << (c += 1,
24..toString() - [ , 0 ][1]))] = 23..toString() >= Infinity))), (c = 1 + c, (-2 === 24..toString() || !1) < (c += 1,
2)) ][(c = 1 + c, 1 | (a_1 && (a_1[a++ + b] -= -25)))] || 7).toString()[-a]]),
null: -b
}[2];
} catch (a) {
try {
throw !1 / ({} <= void 0 == (a_1 = !1));
} catch (a) {
c += 1, --b, a && a[!function() {
c = 1 + c, ("number" << 24..toString() >>> (4 == [])) - 0 % ((2 === [ , 0 ].length) < NaN) && (c = 1 + c,
a_1 && (a_1.null %= NaN), 24..toString());
var a = 5;
do {
c = 1 + c, foo_1 && (foo_1.in -= -4);
} while (c = 1 + c, NaN & (2 === [ , 0 ].length ^ {}) ^ (-5 | Infinity) << NaN % 24..toString() && --a > 0);
}()];
}
}
!function() {
try {
for (var t = 5; --b + delete b && --t > 0; ) {
if (--b + ("crap" != typeof foo_1)) {
try {
var n = 5;
do {
return c = 1 + c, !1 / ("function" ^ 24..toString()) != ~(a_1 && (a_1[(c = 1 + c,
1 * ((foo_1.NaN += -1) == -24..toString()))] = 3 != 38..toString()));
} while (c = 1 + c, c = 1 + c, a_1 && (a_1.in /= 0), c = 1 + c, --n > 0);
} catch (t) {
try {
c = 1 + c, a_1 && (a_1[(c = 1 + c, (24..toString() == [] != (c += 1, Infinity)) <= (c += 1,
0))] = 1);
} finally {}
for (var o = 5; c = 1 + c, !1 ^ (e && (e[a++ + [ (c = 1 + c, foo_1 += (c += 1, -0 === !0 + (2 ^ 38..toString()))), , (c = 1 + c,
0 ^ (a_1 = 0) ^ {} / (2 === [ , 0 ].length) + (0 != {})) ]] = (c_1 += !0) % 4)) ^ "bar" % [ , 0 ][1] && --o > 0; ) {
c = 1 + c, 23..toString();
}
} finally {
c += 1, c += 1;
}
}
}
} catch (t) {
if (--b + ("string" != typeof undefined_2)) {
switch (a++ - (((t && (t[(c = 1 + c, (c_1 && (c_1[--b + a] /= .5)) == (c += 1, 3 != void 0 <= []))] = 5 & 2 === [ , 0 ].length)) > {} >> []) >>> ("bar" === (foo_1 && (foo_1[(c = 1 + c,
((null === []) - 4294967294) % ((foo_1 && (foo_1[(c = 1 + c, !0 >> Infinity % 2 == (c += 1,
"object" > (NaN ^ {})))] = -2 === [])) ^ 38..toString() << 24..toString()))] = {} % -3))))) {
default:
c = 1 + c;

              case --b + b--:
                var r = (c = 1 + c, ([ , 0 ][1] || "object") > !1 ^ {} <= [] != 0);
                for (var i in r) {
                    c = 1 + c;
                    var e = r[i];
                    c = 1 + c;
                }
                break;

              case a++ + {
                    length: (c = 1 + c, -4 * 24..toString() >>> (2 === [ , 0 ].length) - Infinity != (!0 !== [])),
                    var: (c = 1 + c, ((c_1 = !1) && "function") == (2 | 23..toString()) > 0),
                    length: (c = 1 + c, (a_1 && (a_1.foo += -2 ^ 24..toString() >= "function")) < (25 === 23..toString()) >>> !0),
                    a: (c = 1 + c, "function" >>> [] <= void 0 << 24..toString() | 0 != ("function" ^ Infinity)),
                    undefined: (c = 1 + c, (22 != 23..toString()) < (25 ^ Infinity) != ([] * [] === (2 === [ , 0 ].length && 4)))
                }[--b + {
                    NaN: (c = 1 + c, -0 * (24..toString(), 24..toString()) || 2 | void 0 ^ {}),
                    a: (c = 1 + c, NaN & (-0 & {}) - -0),
                    in: (c = 1 + c, -0 >>> [] != 0 || -4 / -3 / !0),
                    1.5: (c = 1 + c, !0 * ((2 === [ , 0 ].length) - "") || NaN)
                }.var]:
                c = 1 + c, 23..toString();
                break;

              case --b + ++a:
                try {
                    c = 1 + c, a_1 += -5;
                } catch (c) {}
                try {
                    c = 1 + c, 23..toString(), e = 3 << -3;
                } finally {}
            }
        }
        a++, /[abc4]/.test((c = 1 + c, /[a2][^e]+$/ << (c += 1, []) > !1 || b || 5).toString());
        for (var _ = 5; a-- && _ > 0; --_) {
            try {
                c = 1 + c, e |= 5, e = NaN;
            } catch (c) {}
        }
        var f = a++ + (c = 1 + c, -0 == ([] || -2) && !0);
        for (var g in f) {
            var S = (c = 1 + c, !0 * [ , 0 ][1] * !0 & (a_1 <<= !0));
            for (var l in S) {
                c = 1 + c;
            }
        }
    }
}();

}

console.log(null, a, b, c);

```js
original result:
null 101 98 15

uglified result:
null 101 98 4

minify(options):
{}
bug

All 5 comments

Narrowed test case:

$ cat test.js
var a = 1, c = 0;

try {
} catch (e) {
    a[a] = 0;
}
try {
    throw a;
} catch (e) {
    try {
        throw 0;
    } catch (a) {
        (e && e[!function() {
            c++;
        }()]);
    }
}

console.log(null, a, c);

$ cat test.js | node
null 1 1

$ uglifyjs test.js -m | node
null 1 0
$ git checkout v2.8.16
$ cat 2120.js | bin/uglifyjs -m | node
null 1 1
$ git checkout v2.8.17
$ cat 2120.js | bin/uglifyjs -m | node
null 1 0

regression introduced in 65da9acce6bd2548e5ffc7f35527ff62ff3f2fdd

screw_ie8 strikes again!

$ bin/uglifyjs -V
uglify-js 3.0.18

$ cat 2120.js | node
null 1 1

$ cat 2120.js | bin/uglifyjs -m ie8=1 | node
null 1 1

$ cat 2120.js | bin/uglifyjs -m ie8=0 | node
null 1 0

@kzc just to confirm, is 2120.js the input from ufuzz.js or my reduced test case from https://github.com/mishoo/UglifyJS2/issues/2120#issuecomment-309278747 ?

2120.js is same as test.js in https://github.com/mishoo/UglifyJS2/issues/2120#issuecomment-309278747

Was this page helpful?
0 / 5 - 0 ratings

Related issues

Jimbly picture Jimbly  路  4Comments

buu700 picture buu700  路  5Comments

Havunen picture Havunen  路  5Comments

PinkyJie picture PinkyJie  路  3Comments

chrismanley picture chrismanley  路  5Comments