UglifyJS.git
7 years agosupport safe reassignments in `reduce_vars` (#1823)
Alex Lam S.L [Tue, 18 Apr 2017 05:38:42 +0000 (13:38 +0800)]
support safe reassignments in `reduce_vars` (#1823)

`var a=1;a=2;x(a)` => `x(2)`

fix pre-existing issues
- reference counting on assignment
- walking of anonymous functions
- chained assignment

7 years agofix `reduce_vars` on conditionals (#1822)
Alex Lam S.L [Mon, 17 Apr 2017 17:44:23 +0000 (01:44 +0800)]
fix `reduce_vars` on conditionals (#1822)

7 years agofix `reduce_vars` on boolean binary expressions (#1819)
Alex Lam S.L [Mon, 17 Apr 2017 09:24:29 +0000 (17:24 +0800)]
fix `reduce_vars` on boolean binary expressions (#1819)

Side effects of `&&` and `||` have not mattered until #1814, which takes assignment expressions into account.

7 years agocompress duplicated variable definitions (#1817)
Alex Lam S.L [Mon, 17 Apr 2017 09:11:29 +0000 (17:11 +0800)]
compress duplicated variable definitions (#1817)

These are surprisingly common, as people reuse the same variable name within loops or switch branches.

7 years agofix `reduce_vars` within try-block (#1818)
Alex Lam S.L [Mon, 17 Apr 2017 06:03:29 +0000 (14:03 +0800)]
fix `reduce_vars` within try-block (#1818)

Possible partial execution due to exceptions.

7 years agoenhance `reduce_vars` (#1814)
Alex Lam S.L [Sun, 16 Apr 2017 17:36:50 +0000 (01:36 +0800)]
enhance `reduce_vars` (#1814)

- allow immediate assignment after declaration of variable
- relax modification rule for immutable value
- fix order of visit for TreeWalker
- remove extraneous code

7 years agofix variable substitution (#1816)
Alex Lam S.L [Sun, 16 Apr 2017 09:25:39 +0000 (17:25 +0800)]
fix variable substitution (#1816)

- let `collapse_vars` take care of value containing any symbols
- improve overhead accounting

7 years agoupdate README (#1813)
Alex Lam S.L [Sat, 15 Apr 2017 20:04:28 +0000 (04:04 +0800)]
update README (#1813)

- mention major version bump
- remove reference to internal API

7 years agounify CLI & API under `minify()` (#1811)
Alex Lam S.L [Sat, 15 Apr 2017 15:50:50 +0000 (23:50 +0800)]
unify CLI & API under `minify()` (#1811)

- rename `screw_ie8` to `ie8`
- rename `mangle.except` to `mangle.reserved`
- rename `mangle.properties.ignore_quoted` to `mangle.properties.keep_quoted`
- compact `sourceMap` options
- more stringent verification on input `options`
- toplevel shorthands
  - `ie8`
  - `keep_fnames`
  - `toplevel`
  - `warnings`
- support arrays and unquoted string values on CLI
- drop `fromString` from `minify()`
  - `minify()` no longer handles any `fs` operations
- unify order of operations for `mangle_properties()` on CLI & API
  - `bin/uglifyjs` used to `mangle_properties()` before even `Compressor`
  - `minify()` used to `mangle_properties()` after `Compressor` but before `mangle_names()`
  - both will now do `Compressor`, `mangle_names()` then `mangle_properties()`
- `options.parse` / `--parse` for parser options beyond `bare_returns`
- add `mangle.properties.builtins` to disable built-in reserved list
  - disable with `--mangle-props builtins` on CLI
- `warnings` now off by default
- add `--warn` and `--verbose` on CLI
- drop `--enclose`
- drop `--export-all`
- drop `--reserved-file`
  - use `--mangle reserved` instead
- drop `--reserve-domprops`
  - enabled by default, disable with `--mangle-props domprops`
- drop `--prefix`
  - use `--source-map base` instead
- drop `--lint`
- remove `bin/extract-props.js`
- limit exposure of internal APIs
- update documentations

closes #96
closes #102
closes #136
closes #166
closes #243
closes #254
closes #261
closes #311
closes #700
closes #748
closes #912
closes #1072
closes #1366
fixes #101
fixes #123
fixes #124
fixes #263
fixes #379
fixes #419
fixes #423
fixes #461
fixes #465
fixes #576
fixes #737
fixes #772
fixes #958
fixes #1036
fixes #1142
fixes #1175
fixes #1220
fixes #1223
fixes #1280
fixes #1359
fixes #1368

7 years agodrop `angular` (#1812)
Alex Lam S.L [Fri, 14 Apr 2017 21:52:29 +0000 (05:52 +0800)]
drop `angular` (#1812)

Remove support for `@ngInject` as there are proper alternatives anyway.

7 years agoconvert `AST_Seq` from binary tree to array (#1460)
Alex Lam S.L [Wed, 12 Apr 2017 13:56:27 +0000 (21:56 +0800)]
convert `AST_Seq` from binary tree to array (#1460)

- rename `AST_Seq` to `AST_Sequence`
- raise default sequences_limit from 200 to 800

7 years agov2.8.22
Alex Lam S.L [Sun, 9 Apr 2017 03:36:57 +0000 (11:36 +0800)]
v2.8.22

7 years agofix LHS cases for NaN & friends (#1804)
Alex Lam S.L [Sat, 8 Apr 2017 19:18:14 +0000 (03:18 +0800)]
fix LHS cases for NaN & friends (#1804)

`Infinity = beyond` should not become `1/0 = beyond`

7 years agoenhance `test/ufuzz.js` (#1803)
Alex Lam S.L [Sat, 8 Apr 2017 17:36:38 +0000 (01:36 +0800)]
enhance `test/ufuzz.js` (#1803)

- `-E` to report test cases with runtime errors
- favor returning expressions rather than empty return
- emit a newline upon fuzzer completion to not erase the iteration count

closes #1800

7 years agofix a couple of bugs in `global_defs` (#1802)
Alex Lam S.L [Sat, 8 Apr 2017 08:46:25 +0000 (16:46 +0800)]
fix a couple of bugs in `global_defs` (#1802)

- `optimize()` substituted expression
- compute nested property string correctly

fixes #1801

Miscellaneous
- reset optimisation flags on all node types

7 years agofix `delete` corner cases (#1799)
Alex Lam S.L [Sat, 8 Apr 2017 06:25:28 +0000 (14:25 +0800)]
fix `delete` corner cases (#1799)

- assignment
- boolean
- conditional
- sequence

7 years agoextend ufuzz generator (#1783)
Alex Lam S.L [Fri, 7 Apr 2017 10:47:30 +0000 (18:47 +0800)]
extend ufuzz generator (#1783)

- property access
- property assignment
- allow bare expression within try-block
- normalise `Error` in `console.log()`
- generate more unary expressions
- add parenthesis to enforce precedence
- adjust variable reuse/creation
- add parameters to function declaration & expression
- add return expression
- add trivial arguments to function call

7 years agofix `pure_getters` for chained property access (#1798)
Alex Lam S.L [Fri, 7 Apr 2017 09:06:01 +0000 (17:06 +0800)]
fix `pure_getters` for chained property access (#1798)

7 years agofix corner cases with `delete` (#1796)
Alex Lam S.L [Fri, 7 Apr 2017 07:39:59 +0000 (15:39 +0800)]
fix corner cases with `delete` (#1796)

`delete Infinity` returns `false` where as `delete (1/0)` returns `true`

7 years agointroduce "strict" to `pure_getters` (#1795)
Alex Lam S.L [Fri, 7 Apr 2017 05:31:58 +0000 (13:31 +0800)]
introduce "strict" to `pure_getters` (#1795)

7 years agofix `reduce_vars` on catch variable (#1794)
Alex Lam S.L [Fri, 7 Apr 2017 04:32:56 +0000 (12:32 +0800)]
fix `reduce_vars` on catch variable (#1794)

Improved catch handling in `figure_out_scope()` means special case treatment of IE8 is no longer valid in `reset_opt_flags()`.

Also fixed recursive assignment in variable definition.

7 years agofix incorrect context in variable substitution (#1791)
Alex Lam S.L [Thu, 6 Apr 2017 19:42:17 +0000 (03:42 +0800)]
fix incorrect context in variable substitution (#1791)

`AST_Node.optimize()` is context-aware, so don't cache its results to be used elsewhere.

Also fixed a few cases of AST corruption and beef up safety of `pure_getters`.

7 years agoenable `inline_script` by default (#1793)
Alex Lam S.L [Thu, 6 Apr 2017 16:45:51 +0000 (00:45 +0800)]
enable `inline_script` by default (#1793)

7 years agoimprove `pure_getters` (#1786)
Alex Lam S.L [Thu, 6 Apr 2017 03:18:59 +0000 (11:18 +0800)]
improve `pure_getters` (#1786)

- property access to `null` & `undefined` always has side effects
- utilise `reduce_vars` to determine safe property access
- may-be cases treated as side effects unless `unsafe`

7 years agoimplement delayed resolution for `reduce_vars` (#1788)
Alex Lam S.L [Wed, 5 Apr 2017 13:06:42 +0000 (21:06 +0800)]
implement delayed resolution for `reduce_vars` (#1788)

Although it would be nice to enforce `AST_Node` cloning during transformation, that ship has sailed a long time ago.

We now get the assigned value when resolving `AST_SymbolRef` instead of `reset_opt_flags()`, which has the added advantage of improved compressor efficiency.

fixes #1787

7 years agooptimise `do{...}while(false)` (#1785)
Alex Lam S.L [Tue, 4 Apr 2017 15:48:22 +0000 (23:48 +0800)]
optimise `do{...}while(false)` (#1785)

- better heuristics to avoid issues like #1532
- fix `TreeWalker.loopcontrol_target()`
  - `continue` cannot refer to `switch` blocks

7 years agoremove `--mangle-props` from fuzzing (#1777)
Alex Lam S.L [Tue, 4 Apr 2017 08:24:16 +0000 (16:24 +0800)]
remove `--mangle-props` from fuzzing (#1777)

The inherently unsafe nature makes this feature unsuitable to be tested this way.

fixes #1774

7 years agoexclude mangling of special property names (#1779)
Alex Lam S.L [Mon, 3 Apr 2017 19:50:19 +0000 (03:50 +0800)]
exclude mangling of special property names (#1779)

- `null`
- `true`
- `false`
- numeric literals

7 years agofix `mangleProperties` on identifiers (#1776)
Alex Lam S.L [Mon, 3 Apr 2017 15:17:47 +0000 (23:17 +0800)]
fix `mangleProperties` on identifiers (#1776)

- fix handling of "-Infinity"
- add test case for "-0"

reverts #1481

7 years agoworkaround Node.js bugs (#1775)
Alex Lam S.L [Mon, 3 Apr 2017 10:56:11 +0000 (18:56 +0800)]
workaround Node.js bugs (#1775)

Wrap test code in IIFE before passing to `vm`

fixes #1768
fixes #1771

7 years agofix mangleProperties of `undefined` & `Infinity` (#1772)
Alex Lam S.L [Mon, 3 Apr 2017 04:31:05 +0000 (12:31 +0800)]
fix mangleProperties of `undefined` & `Infinity` (#1772)

`NaN` already works by the happy accident of `Number.NaN`

fixes #1770

7 years agoextend `test/ufuzz.js` (#1769)
Alex Lam S.L [Sun, 2 Apr 2017 20:00:33 +0000 (04:00 +0800)]
extend `test/ufuzz.js` (#1769)

New expressions:
- property access
- array literal
- object literal

Miscellaneous:
- reduce execution timeout
- test `toplevel` and `mangleProperties`

7 years agov2.8.21
Alex Lam S.L [Sun, 2 Apr 2017 09:07:55 +0000 (17:07 +0800)]
v2.8.21

7 years agofix corner case in `switch` (#1765)
Alex Lam S.L [Sun, 2 Apr 2017 09:07:20 +0000 (17:07 +0800)]
fix corner case in `switch` (#1765)

7 years agoavoid confusion of `NaN` & `Infinity` with `catch` symbol of the same name (#1763)
Alex Lam S.L [Sun, 2 Apr 2017 08:14:09 +0000 (16:14 +0800)]
avoid confusion of `NaN` & `Infinity` with `catch` symbol of the same name (#1763)

fixes #1760
fixes #1761

7 years agofix corner cases in switch and undefined (#1762)
Alex Lam S.L [Sun, 2 Apr 2017 06:52:25 +0000 (14:52 +0800)]
fix corner cases in switch and undefined (#1762)

- fix side effects in switch condition for singular blocks
- fix `undefined` confusion with local variable
- gate `OPT(AST_Switch)` with `switches`

fixes #1758
fixes #1759

7 years agospeed up fuzzer code generation (#1757)
Alex Lam S.L [Sat, 1 Apr 2017 21:11:29 +0000 (05:11 +0800)]
speed up fuzzer code generation (#1757)

- only output one top-level function or statement block
- reduce `rng()` granularity from 2^32 to 65536
- fix overflow in `rng()`
- track `canThrow` during `typeof` creation

7 years agominor tweaks to `test/ufuzz.js` (#1756)
Alex Lam S.L [Sat, 1 Apr 2017 19:17:01 +0000 (03:17 +0800)]
minor tweaks to `test/ufuzz.js` (#1756)

- count iterations from `1` instead of `0`
- remove `unsafe` from default set of `minify()` tests
- improve usability of help

7 years agoupgrade fuzzer (#1754)
Alex Lam S.L [Sat, 1 Apr 2017 18:10:50 +0000 (02:10 +0800)]
upgrade fuzzer (#1754)

- configurable set of `minify()` options
- test and report suspects upon failure
- continue after failure if infinite iterations is specified

7 years agofuzz regexp literals, more constant numbers, typeof expression (#1755)
kzc [Sat, 1 Apr 2017 18:08:46 +0000 (14:08 -0400)]
fuzz regexp literals, more constant numbers, typeof expression (#1755)

7 years agofix switch branch elimination (#1752)
Alex Lam S.L [Sat, 1 Apr 2017 09:19:57 +0000 (17:19 +0800)]
fix switch branch elimination (#1752)

Merge unreachable case body with previous fallthrough case

fixes #1750

7 years agominor tweaks to fuzzer (#1751)
Alex Lam S.L [Sat, 1 Apr 2017 09:09:52 +0000 (17:09 +0800)]
minor tweaks to fuzzer (#1751)

- remove `let` as variable name
- employ `crypto.randomBytes()`

7 years agoimplement `test/sandbox.js` (#1749)
Alex Lam S.L [Fri, 31 Mar 2017 21:47:11 +0000 (05:47 +0800)]
implement `test/sandbox.js` (#1749)

- `test/run-tests.js` and `test/ufuzz.js` now shares the same `run_code()` and `same_stdout()`
- re-enable fuzzer to generate top-level `NaN`, `Infinity` & `undefined`
- attempt to show beautified output only when `run_code()` output is preserved

7 years agoimprove compression of undefined, NaN & Infinitiy (#1748)
Alex Lam S.L [Fri, 31 Mar 2017 19:02:14 +0000 (03:02 +0800)]
improve compression of undefined, NaN & Infinitiy (#1748)

- 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

7 years agocombine rules for binary boolean operations (#1744)
Alex Lam S.L [Fri, 31 Mar 2017 10:47:44 +0000 (18:47 +0800)]
combine rules for binary boolean operations (#1744)

7 years agoMassive extension of the fuzzer (#1697)
Peter van der Zee [Fri, 31 Mar 2017 09:23:50 +0000 (11:23 +0200)]
Massive extension of the fuzzer (#1697)

Fix bug where a `throw` was generated without expression

Reenable try/catch/finally and fix them up

Skip serialization errors

Allow function decl in other funcs but not in blocks etc

Rename function to be more appropriate

Fix global functions not getting certain names

Make the canaries more likely to appear as expressions

Add a silly rounding edge case

Add a new canary, `c`, which should only ever be incremented

Refactoring

Fix (another) iife not actually being invoked

When a statement hits recursion max return an expression instead of `;`

When a expression hits recursion max also inc `c`

Generate global code as well as function code

Also fixes some argument juggling related bugs.
No longer reduces the recursion max when generating sub functions.
Generates a function arg.

Add used names to var name pool while in that scope

This is a little wonky, possibly a hack, but since it's synchronous code I think it's alright to do this. The alternative is to slice the varnames array and juggle them through almost all the generator functions and there are various reasons why this patch is a better alternative.

Minify generated code, not beautified code. Prevents beautifier bias.

Prevent unnecessary duplication

Remove serialization protection because I think it got handled elsewhere

Abstract toplevel code generation

Add example line of running test case

Add poor man options parser, and some options

Reindent to 4 spaces

Lower chance of `default` generation

Comment example of testing a case and output improvement

Enable `default` clause appearing at any clause index

Removing some training wheels; dont add parens where we dont absolutely need them

Support `-s1` and `-s2` to force specific statements being generated at that recursion level

Add round number to output when failing. For stats and fun and profit.

Solidify statement depth counting. The argument juggling is real.

Renamed option to something long. -scf was ugly and probably confusing.

Fix missing arguments causing `canThrow` to be truthy, generating crashing code

Generate more binary nested expressions

Add black and white list cli options for statement generation

Allows you to explicitly require or forbid certain statements from/to being made.

```
node test/ufuzz.js --without-stmt switch,try -t 5 -r 5 -V
```

```
node test/ufuzz.js --only-stmt ifelse,expr -t 5 -r 5 -V
```

Similar granularity for expression may be added later.

There can be no comma between names; it just does a split on that arg.

Trim down the binary expression generator

Prevent scoping issues in nodejs by preventing certain names in global space

Oh this list was incomplete?

Allow bin-expr to generate assignments too. More vigilant with storing and reusing vars.

Add more global builtin names

Update wrapper code

Also patch Function valueOf

7 years agosort options in alphabetical order (#1743)
Alex Lam S.L [Fri, 31 Mar 2017 08:41:04 +0000 (16:41 +0800)]
sort options in alphabetical order (#1743)

They started off as functional groups I guess, but given the sheer number of options this is becoming too difficult to read.

7 years agov2.8.20
Alex Lam S.L [Fri, 31 Mar 2017 07:27:40 +0000 (15:27 +0800)]
v2.8.20

7 years agofix missing preamble when shebang is absent (#1742)
Alex Lam S.L [Fri, 31 Mar 2017 07:26:57 +0000 (15:26 +0800)]
fix missing preamble when shebang is absent (#1742)

7 years agov2.8.19
Alex Lam S.L [Fri, 31 Mar 2017 04:26:10 +0000 (12:26 +0800)]
v2.8.19

7 years agofix catch symbol mangling (#1734)
Alex Lam S.L [Thu, 30 Mar 2017 18:57:47 +0000 (02:57 +0800)]
fix catch symbol mangling (#1734)

Only need to look up the immediate non-block/catch scope for the same-name special case.

fixes #1733

7 years agoremove paranthesis for `-(x*y)` (#1732)
Alex Lam S.L [Thu, 30 Mar 2017 08:09:00 +0000 (16:09 +0800)]
remove paranthesis for `-(x*y)` (#1732)

7 years agooptimize try-catch-finally (#1731)
Alex Lam S.L [Thu, 30 Mar 2017 04:16:58 +0000 (12:16 +0800)]
optimize try-catch-finally (#1731)

- eliminate empty blocks
- flatten out if try-block does not throw

7 years agoimprove tests from #1726 (#1729)
Alex Lam S.L [Wed, 29 Mar 2017 16:13:46 +0000 (00:13 +0800)]
improve tests from #1726 (#1729)

7 years agospeed up IIFE elimination (#1728)
Alex Lam S.L [Wed, 29 Mar 2017 15:27:35 +0000 (23:27 +0800)]
speed up IIFE elimination (#1728)

- `side_effects` will clean up inner statements, so checking for an empty function body should suffice
- drop side effects when dropping `return` from statement

7 years agospeed up `equivalent_to()` and `AST_Switch` (#1727)
Alex Lam S.L [Wed, 29 Mar 2017 14:08:26 +0000 (22:08 +0800)]
speed up `equivalent_to()` and `AST_Switch` (#1727)

7 years agofix missing parentheses around NaN/Infinity shorthands (#1726)
Alex Lam S.L [Wed, 29 Mar 2017 12:53:03 +0000 (20:53 +0800)]
fix missing parentheses around NaN/Infinity shorthands (#1726)

fixes #1724
fixes #1725

7 years agooutput optimal representations of NaN & Infinity (#1723)
Alex Lam S.L [Wed, 29 Mar 2017 10:31:55 +0000 (18:31 +0800)]
output optimal representations of NaN & Infinity (#1723)

- move these optimisations out from `Compressor` to `OutputStream`
- fixes behaviour inconsistency when running uglified code from global or module levels due to redefinition

7 years agoimprove beautified output of switch blocks (#1721)
Alex Lam S.L [Tue, 28 Mar 2017 20:40:05 +0000 (04:40 +0800)]
improve beautified output of switch blocks (#1721)

7 years agov2.8.18
Alex Lam S.L [Tue, 28 Mar 2017 19:13:30 +0000 (03:13 +0800)]
v2.8.18

7 years agoremove UGLIFY_DEBUG (#1720)
Alex Lam S.L [Tue, 28 Mar 2017 17:27:24 +0000 (01:27 +0800)]
remove UGLIFY_DEBUG (#1720)

fixes #1719

7 years agofix corner case in `unused` (#1718)
Alex Lam S.L [Tue, 28 Mar 2017 17:00:21 +0000 (01:00 +0800)]
fix corner case in `unused` (#1718)

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.

7 years agov2.8.17
Alex Lam S.L [Tue, 28 Mar 2017 13:49:04 +0000 (21:49 +0800)]
v2.8.17

7 years agofix `unused` on var of the same name within catch (#1716)
Alex Lam S.L [Tue, 28 Mar 2017 13:25:49 +0000 (21:25 +0800)]
fix `unused` on var of the same name within catch (#1716)

fixes #1715

7 years agofix `is_number()` on `+=` (#1714)
Alex Lam S.L [Tue, 28 Mar 2017 09:08:16 +0000 (17:08 +0800)]
fix `is_number()` on `+=` (#1714)

fixes #1710

7 years agodrop anonymous function name when overshadowed by other declarations (#1712)
Alex Lam S.L [Tue, 28 Mar 2017 09:02:20 +0000 (17:02 +0800)]
drop anonymous function name when overshadowed by other declarations (#1712)

fixes #1709

7 years agohandle var within catch of the same name (#1711)
Alex Lam S.L [Tue, 28 Mar 2017 08:42:39 +0000 (16:42 +0800)]
handle var within catch of the same name (#1711)

The following code prints `1`:

var a = 1;
!function(){
  a = 4;
  try{
    throw 2;
  } catch (a) {
    var a = 3;
  }
}();
console.log(a);

fixes #1708

7 years agofix tail trimming of switch blocks (#1707)
Alex Lam S.L [Mon, 27 Mar 2017 19:59:13 +0000 (03:59 +0800)]
fix tail trimming of switch blocks (#1707)

now guarded under `dead_code`

fixes #1705

7 years agofix mangle for variable declared within catch block (#1706)
Alex Lam S.L [Mon, 27 Mar 2017 19:26:35 +0000 (03:26 +0800)]
fix mangle for variable declared within catch block (#1706)

fixes #1704

7 years agoufuzz: workaround for Function.toString() v2 (#1700)
Alex Lam S.L [Mon, 27 Mar 2017 13:49:08 +0000 (21:49 +0800)]
ufuzz: workaround for Function.toString() v2 (#1700)

7 years ago`has_side_effects()` should take `AST_Switch.expression` into account (#1699)
Alex Lam S.L [Mon, 27 Mar 2017 10:09:35 +0000 (18:09 +0800)]
`has_side_effects()` should take `AST_Switch.expression` into account (#1699)

fixes #1698

7 years agofix typeof side effects (#1696)
Alex Lam S.L [Sun, 26 Mar 2017 20:37:42 +0000 (04:37 +0800)]
fix typeof side effects (#1696)

`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.

7 years agopreserve side effects in switch expression (#1694)
Alex Lam S.L [Sun, 26 Mar 2017 18:32:46 +0000 (02:32 +0800)]
preserve side effects in switch expression (#1694)

fixes #1690

7 years agofix `cascade` on anonymous function reference (#1693)
Alex Lam S.L [Sun, 26 Mar 2017 17:58:21 +0000 (01:58 +0800)]
fix `cascade` on anonymous function reference (#1693)

Unlike normal variables and even function definitions, these cannot be reassigned, even though assignment expressions would "leak" the assigned value as normal.

7 years agohandle overlapped variable definitions (#1691)
Alex Lam S.L [Sun, 26 Mar 2017 17:30:21 +0000 (01:30 +0800)]
handle overlapped variable definitions (#1691)

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.

7 years agofix `delete` related issues in `collapse_vars` and `reduce_vars` (#1689)
Alex Lam S.L [Sun, 26 Mar 2017 11:14:30 +0000 (19:14 +0800)]
fix `delete` related issues in `collapse_vars` and `reduce_vars` (#1689)

7 years agoufuzz: workaround function name and toString() (#1688)
Alex Lam S.L [Sun, 26 Mar 2017 10:18:44 +0000 (18:18 +0800)]
ufuzz: workaround function name and toString() (#1688)

fixes #1686

7 years agofix `cascade` on `delete` operator (#1687)
Alex Lam S.L [Sun, 26 Mar 2017 10:08:44 +0000 (18:08 +0800)]
fix `cascade` on `delete` operator (#1687)

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

7 years agofallthrough should not execute case expression (#1683)
Alex Lam S.L [Sun, 26 Mar 2017 08:52:38 +0000 (16:52 +0800)]
fallthrough should not execute case expression (#1683)

- de-duplicate trailing cases only, avoid all potential side-effects
- enable switch statement fuzzing

fixes #1680

7 years agooptimize conditional when condition symbol matches consequent (#1684)
kzc [Sun, 26 Mar 2017 08:36:33 +0000 (04:36 -0400)]
optimize conditional when condition symbol matches consequent (#1684)

7 years agosuppress switch branch de-duplication upon side effects (#1682)
Alex Lam S.L [Sun, 26 Mar 2017 05:32:43 +0000 (13:32 +0800)]
suppress switch branch de-duplication upon side effects (#1682)

fixes #1679

7 years agofix side-effects detection on switch statements (#1678)
Alex Lam S.L [Sun, 26 Mar 2017 04:05:44 +0000 (12:05 +0800)]
fix side-effects detection on switch statements (#1678)

extension of #1675

7 years agoImprove fuzzer. :) (#1665)
Peter van der Zee [Sun, 26 Mar 2017 04:04:50 +0000 (06:04 +0200)]
Improve fuzzer. :) (#1665)

@qfox Put value constants in a global constant 74c0fb9
 @qfox And the other string based values as well a5033c5
 @qfox Be more strict about parameters, allow max to be optional 9c7ce70
 @qfox Support a `V` (capital) flag to only log out at intervals 2d822c7
 @qfox Fewer magic variables a6a9a7c
 @qfox Fix decrement such that a function is created when n=1 7e4b017
 @qfox Add more values 64e596e
 @qfox Make `b` appear more often d33191a
 @qfox Add functions that contain (only..) functions 29a86e3
 @qfox Allow the block statement to contain multiple statements 7570484
 @qfox Make the interval count a constant d587ad8
 @qfox Enable mangling, disable post-processing  … 4dc8d35
 @qfox Add more simple value that may trigger syntactic errors 8496d58
 @qfox Add `else` to some `if` statements a4aed65
 @qfox Move iife to expr generator, fix missing recursion arg e453159
 @qfox Improve output on error where it wasnt printing the last code properly 4565a1a
 @qfox Add switch statement to generator ceafa76
 @qfox Add var statement, support optional comma for expr generator b83921b
 @qfox Expression generator should use a simple value instead of `0` as recu…  … 9d1a5c7
 @qfox const -> var to keep things es5... 0143099
 @qfox Add more simple values that may trigger edge cases 5e124f1
 @qfox Add central name generator, take special care for global functions aeb7682
 @qfox Add some `return` and function declaration cases to statement generator 6c9c3cc
 @qfox Exclude switches from generator for now 91124b2

Put value constants in a global constant

And the other string based values as well

Be more strict about parameters, allow max to be optional

Support a `V` (capital) flag to only log out at intervals

Fewer magic variables

Fix decrement such that a function is created when n=1

Add more values

Make `b` appear more often

Add functions that contain (only..) functions

Allow the block statement to contain multiple statements

Make the interval count a constant

Enable mangling, disable post-processing

Mangling is kind of the whole point...

Similarly, to beautify the minified code afterwards may supress bugs so it's probably best not to beautify the code prematurely. And there's no point anyways since you won't see it most of the time and only care about the main input anyways.

Add more simple value that may trigger syntactic errors

Add `else` to some `if` statements

Move iife to expr generator, fix missing recursion arg

Improve output on error where it wasnt printing the last code properly

Add switch statement to generator

Add var statement, support optional comma for expr generator

Expression generator should use a simple value instead of `0` as recursion default

const -> var to keep things es5...

Add more simple values that may trigger edge cases

Add central name generator, take special care for global functions

Add some `return` and function declaration cases to statement generator

Exclude switches from generator for now

Enable switch generation because #1667 was merged

Add typeof generator

Add some elision tests

Add a new edge case that returns an object explicitly

Add all binary ops to try and cover more paths

Forgot four binops and added `Math` to var name pool

Harden the incremental pre/postfix tests

Improve switch generator, allow `default` to appear at any clause index

Add try/catch/finally generation

Prevent function statements being generated

Add edge case with decremental op and a group

Disable switch generation until #1679 and #1680 are solved

Only allow `default` clause as last clause for now

Tentatively enable `throw`, `break` and `continue` statements when in valid contexts

7 years agoimprove switch optimisations (#1677)
Alex Lam S.L [Sat, 25 Mar 2017 21:15:46 +0000 (05:15 +0800)]
improve switch optimisations (#1677)

- correctly determine reachability of (default) branches
- gracefully handle multiple default branches
- optimise branches with duplicate bodies

fixes #376
fixes #441
fixes #1674

7 years agofix `has_side_effects()` (#1675)
Alex Lam S.L [Sat, 25 Mar 2017 15:03:26 +0000 (23:03 +0800)]
fix `has_side_effects()` (#1675)

`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

7 years agofix `reduce_vars` on `AST_Switch` (#1671)
Alex Lam S.L [Sat, 25 Mar 2017 13:17:30 +0000 (21:17 +0800)]
fix `reduce_vars` on `AST_Switch` (#1671)

Take conditional nature of switch branches into account.

fixes #1670

7 years agofix typeof side-effects (#1669)
Alex Lam S.L [Sat, 25 Mar 2017 09:40:18 +0000 (17:40 +0800)]
fix typeof side-effects (#1669)

`has_side_effects()` does not take `typeof`'s magical power of not tripping over undeclared variable into account.

fixes #1668

7 years agofix `dead_code` on `AST_Switch` (#1667)
Alex Lam S.L [Sat, 25 Mar 2017 08:21:42 +0000 (16:21 +0800)]
fix `dead_code` on `AST_Switch` (#1667)

Need to call `extract_declarations_from_unreachable_code()`.

fixes #1663

7 years agov2.8.16
Alex Lam S.L [Fri, 24 Mar 2017 19:21:16 +0000 (03:21 +0800)]
v2.8.16

7 years agofix invalid `AST_For.init` (#1657)
Alex Lam S.L [Fri, 24 Mar 2017 19:18:36 +0000 (03:18 +0800)]
fix invalid `AST_For.init` (#1657)

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

7 years agointroduce ufuzz.js (#1655)
Alex Lam S.L [Fri, 24 Mar 2017 17:46:12 +0000 (01:46 +0800)]
introduce ufuzz.js (#1655)

closes #1647

7 years agoUpdate ISSUE_TEMPLATE.md
Alex Lam S.L [Fri, 24 Mar 2017 15:12:58 +0000 (23:12 +0800)]
Update ISSUE_TEMPLATE.md

7 years agofix cascade of `evaluate` optimisation (#1654)
Alex Lam S.L [Fri, 24 Mar 2017 14:09:19 +0000 (22:09 +0800)]
fix cascade of `evaluate` optimisation (#1654)

Operator has changed, so break out from rest of the rules.

fixes #1649

7 years agofix corner case in `AST_For.init` (#1652)
Alex Lam S.L [Fri, 24 Mar 2017 11:31:17 +0000 (19:31 +0800)]
fix corner case in `AST_For.init` (#1652)

Enforce `null` as value for empty initialisation blocks.

fixes #1648

7 years agofix assignment extraction from conditional (#1651)
Alex Lam S.L [Fri, 24 Mar 2017 10:52:48 +0000 (18:52 +0800)]
fix assignment extraction from conditional (#1651)

fixes #1645
fixes #1646

7 years agofix assignment substitution in sequences (#1643)
Alex Lam S.L [Fri, 24 Mar 2017 06:30:31 +0000 (14:30 +0800)]
fix assignment substitution in sequences (#1643)

take side effects of binary boolean operations into account

fixes #1639

7 years agoimprove error marker placement (#1644)
Alex Lam S.L [Fri, 24 Mar 2017 06:28:40 +0000 (14:28 +0800)]
improve error marker placement (#1644)

For AST_UnaryPrefix, points to the operator rather than end of expression.

7 years agofix expect_stdout (#1642)
Alex Lam S.L [Fri, 24 Mar 2017 05:19:50 +0000 (13:19 +0800)]
fix expect_stdout (#1642)

`compress()` may modify input ASTs

add tests for #1627 & #1640

7 years agofix regression: CLI options with hyphens like -b ascii-only (#1640)
kzc [Fri, 24 Mar 2017 03:55:03 +0000 (23:55 -0400)]
fix regression: CLI options with hyphens like -b ascii-only (#1640)

fixes #1637

7 years agoimprove collapsible value detection (#1638)
Alex Lam S.L [Thu, 23 Mar 2017 18:55:32 +0000 (02:55 +0800)]
improve collapsible value detection (#1638)

- #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