Age | Commit message (Collapse) | Author |
|
- migrate transformation logic from `OutputStream` to `Compressor`
- always turn `undefined` into `void 0` (unless `unsafe`)
- always keep `NaN` except when avoiding local variable redefinition
- introduce `keep_infinity` to suppress `1/0` transform, except when avoiding local variable redefinition
supersedes #1723
fixes #1730
|
|
|
|
Only need to look up the immediate non-block/catch scope for the same-name special case.
fixes #1733
|
|
|
|
- eliminate empty blocks
- flatten out if try-block does not throw
|
|
|
|
fixes #1724
fixes #1725
|
|
- move these optimisations out from `Compressor` to `OutputStream`
- fixes behaviour inconsistency when running uglified code from global or module levels due to redefinition
|
|
|
|
When fixing catch-related issue in #1715, it tries to optimise for duplicate definitions but did not take anonymous functions into account.
Remove such optimisation for now and we can cover this as a more general rule later.
|
|
fixes #1715
|
|
fixes #1710
|
|
fixes #1709
|
|
The following code prints `1`:
var a = 1;
!function(){
a = 4;
try{
throw 2;
} catch (a) {
var a = 3;
}
}();
console.log(a);
fixes #1708
|
|
now guarded under `dead_code`
fixes #1705
|
|
fixes #1704
|
|
fixes #1698
|
|
`statement_to_expression()` drops `typeof` even if it operates on undeclared variables.
Since we now have `drop_side_effect_free()`, replace and remove this deprecated functionality.
|
|
fixes #1690
|
|
Unlike normal variables and even function definitions, these cannot be reassigned, even though assignment expressions would "leak" the assigned value as normal.
|
|
Process variable definitions with or without assigned values against:
- `arguments`
- named function arguments
- multiple definitions within same scope
Essentially demote variable declarations with no value assignments.
Also fixed invalid use of `AST_VarDef` over `arguments` - should use a member of `AST_SymbolDeclaration` instead.
|
|
|
|
Conditions including strict mode would make `delete` return `true` or `false`, and are too complex to be evaluated by the compressor.
Suppress assignment folding into said operator.
fixes #1685
|
|
- de-duplicate trailing cases only, avoid all potential side-effects
- enable switch statement fuzzing
fixes #1680
|
|
|
|
fixes #1679
|
|
extension of #1675
|
|
- correctly determine reachability of (default) branches
- gracefully handle multiple default branches
- optimise branches with duplicate bodies
fixes #376
fixes #441
fixes #1674
|
|
`AST_Try` is an `AST_Block`, so besides try block we also need to inspect catch and finally blocks for possible side effects.
Also extend this functionality to handle `AST_If` and `AST_LabeledStatement` while we are at it.
fixes #1673
|
|
Take conditional nature of switch branches into account.
fixes #1670
|
|
`has_side_effects()` does not take `typeof`'s magical power of not tripping over undeclared variable into account.
fixes #1668
|
|
Need to call `extract_declarations_from_unreachable_code()`.
fixes #1663
|
|
Turns out the only place in `Compressor` which can generate invalid `AST_For.init` is within `drop_unused()`, so focus the fix-up efforts.
supercedes #1652
fixes #1656
|
|
Operator has changed, so break out from rest of the rules.
fixes #1649
|
|
Enforce `null` as value for empty initialisation blocks.
fixes #1648
|
|
fixes #1645
fixes #1646
|
|
take side effects of binary boolean operations into account
fixes #1639
|
|
`compress()` may modify input ASTs
add tests for #1627 & #1640
|
|
- #1634 bars variables with cross-scope references in between to collapse
- but if assigned value is side-effect-free, no states can be modified, so it is safe to move
|
|
mostly done by @kzc
fixes #1631
|
|
report the following only when `options.warnings = "verbose"`
- unused elements due to inlining
- collpased variables
|
|
fixes #1626
|
|
That particular version of Node.js has messed up error messages, so provide a version-specific workaround.
Also fixed an formatting issue which would cause `expect_stdout` to fail if error message contains excerpts of input.
Apply `expect_stdout` to more applicable tests.
|
|
The following is wrong:
`a == (b ? a : c)` => `b`
Because:
- `b` may not be boolean
- `a` might have side effects
- `a == a` is not always `true` (think `NaN`)
- `a == c` is not always `false`
|
|
Commit eab99a1c fails to account for side effects from compound assignments.
|
|
Guarded by `unsafe` as `charAt()` can be overridden.
|
|
allow test to pass if both `input` and `expect` throws the same kind of error
|
|
`input` and `expect` are parsed as `AST_BlockStatement` which does not support `AST_Directive` by default.
Emulate that by transforming preceding `AST_SimpleStatement`s of `AST_String` into `AST_Directive`.
|
|
`reduce_vars` enables substitution of variables but did not clone the value's `AST_Node`.
This confuses `collapse_vars` and result in invalid AST and subsequent crash.
fixes #1609
|
|
fixes #1588
|