Age | Commit message (Expand) | Author |
2017-03-24 | 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 | Alex Lam S.L |
2017-03-23 | account for cross-scope modifications in `collapse_vars` (#1634)...mostly done by @kzc
fixes #1631 | Alex Lam S.L |
2017-03-23 | introduce compressor.info() (#1633)...report the following only when `options.warnings = "verbose"`
- unused elements due to inlining
- collpased variables | Alex Lam S.L |
2017-03-19 | fix commit 88fb83a (#1622)...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` | Alex Lam S.L |
2017-03-19 | fix AST_Binary.lift_sequences() (#1621)...Commit eab99a1c fails to account for side effects from compound assignments. | Alex Lam S.L |
2017-03-19 | transform String.charAt() to index access (#1620)...Guarded by `unsafe` as `charAt()` can be overridden. | Alex Lam S.L |
2017-03-17 | fix chained evaluation (#1610)...`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 | Alex Lam S.L |
2017-03-16 | make `collapse_vars` consistent with `toplevel` (#1608)...fixes #1605 | Alex Lam S.L |
2017-03-16 | fix `hoist_vars` on `reduce_vars` (#1607)...`hoist_vars` converts variable declarations into plain assignments, which then confuses `reduce_vars`
fixes #1606 | Alex Lam S.L |
2017-03-16 | fix stack issues with `AST_Node.evaluate()` (#1603)...As patched in #1597, `make_node_from_constant()` makes inconsistent and sometimes incorrect calls to `optimize()` and `transform()`.
Fix those issues properly by changing the semantics of `evaluate()` and `make_node_from_constant()`, with the side effect that `evaluate()` no longer eagerly converts constant to `AST_Node`. | Alex Lam S.L |
2017-03-15 | fix `AST_Node.optimize()` (#1602)...Liberal use of `Compressor.transform()` and `AST_Node.optimize()` presents an issue for look-up operations like `TreeWalker.in_boolean_context()` and `TreeWalker.parent()`.
This is an incremental fix such that `AST_Node.optimize()` would now contain the correct stack information when called correctly. | Alex Lam S.L |
2017-03-14 | minor clean-ups (#1600)...- remove obsolete optimisation in `AST_Binary` after #1477
- improve `TreeWalker.has_directive()` readability and resilience against multiple visits | Alex Lam S.L |
2017-03-11 | temporary fix for boolean bug (#1597)...fixes #1592 | Alex Lam S.L |
2017-03-11 | disallow parameter substitution for named IIFEs (#1596)...Self-referenced function has non-fixed values assigned to its parameters.
Let `unused` & `!keep_fnames` do the scanning, then apply `reduce_vars` only to unnamed functions.
fixes #1595 | Alex Lam S.L |
2017-03-09 | fix & improve function argument compression (#1584)...- one-use function call => IIFE should take `eval()` & `arguments` into account
- if unused parameter cannot be eliminated, replace it with `0`
fixes #1583 | Alex Lam S.L |
2017-03-09 | scan RHS of dropped assignments (#1581)...- similar case as #1578 but against #1450 instead
- fix `this` binding in #1450 as well
closes #1580 | Alex Lam S.L |
2017-03-08 | scan assignment value in drop_unused() (#1578)...those were not optimised for `unused` before, which made it necessary for `reduce_vars` to have separate steps for `keep_fnames`
docs update by @kzc
closes #1577 | Alex Lam S.L |
2017-03-08 | fix function name eliminiation (#1576)...Function expression can be assigned to a variable and be given a name. Ensure function name is the reduced variable before clearing it out.
fixes #1573
fixes #1575 | Alex Lam S.L |
2017-03-08 | fix return from recursive IIFE (#1570)...`side-effects` did not account for IIFEs being able to reference itself thus making its return value potentially significant | Alex Lam S.L |
2017-03-07 | transform function calls to IIFEs (#1560)...- expose function body to call sites for potential optimisations
- suppress substitution of variable used within `AST_Defun` | Alex Lam S.L |
2017-03-07 | avoid substitution of global variables (#1557)...- unless `toplevel` is enabled
- global `const` works as before | Alex Lam S.L |
2017-03-07 | collapse_vars: do not replace a constant in loop condition or init (#1562) | kzc |
2017-03-05 | fixup for #1553 (#1555)...- `++a` is the one that is foldable
- transform `a++` into `++a` for better optimisation | Alex Lam S.L |
2017-03-05 | collapse assignment with adjacent subsequent usage (#1553)...- consolidate `cascade` optimisations
- support ++/-- postfixes
- remove redundant optimisation identified in #1460
fixes #368 | Alex Lam S.L |
2017-03-05 | handle variable declaration within catch blocks (#1546)...accounts for IE8- scoping | Alex Lam S.L |
2017-03-05 | improve `unsafe` on undefined (#1548)...`unsafe` turns undefined keyword into a variable of the same name if found, but that interferes with other related optimisations.
Keep track of such transformations to ensure zero information loss in the process. | Alex Lam S.L |
2017-03-05 | stay safe with constants in IE8- (#1547)...- `undefined` etc. can be redefined at top-level for IE8-, so disable related optimisations
- fixed `--support-ie8` catch mangle bug | Alex Lam S.L |
2017-03-05 | fix a corner case in #1530 (#1552) | Alex Lam S.L |
2017-03-04 | disallow collapse_vars constant replacement in for-in statements (#1543) | kzc |
2017-03-03 | process code with implicit return statement (#1522)...Bookmarklet for instance implicitedly assumes a "completion value" without using `return`.
The `expression` option now supports such use cases.
Optimisations on IIFEs also enhanced.
fixes #354
fixes #543
fixes #625
fixes #628
fixes #640
closes #1293 | Alex Lam S.L |
2017-03-03 | compress numerical expressions (#1513)...safe operations
- `a === b` => `a == b`
- `a + -b` => `a - b`
- `-a + b` => `b - a`
- `a+ +b` => `+b+a`
associative operations
(bit-wise operations are safe, otherwise `unsafe_math`)
- `a + (b + c)` => `(a + b) + c`
- `(n + 2) + 3` => `5 + n`
- `(2 * n) * 3` => `6 * n`
- `(a | 1) | (2 | d)` => `(3 | a) | b`
fixes #412 | Alex Lam S.L |
2017-03-03 | facilitate fix for #1531 (#1542) | Alex Lam S.L |
2017-03-03 | fix chained assignment with `unused` (#1540)...When #1450 optimises `a=b=42`, it stops after the first variable even if both are unused.
fixes #1539 | Alex Lam S.L |
2017-03-03 | collapse_vars should not replace constant in for-in init section (#1538)...fixes #1537 | kzc |
2017-03-03 | properly cover all cases of for-in loop variables (#1536) | Alex Lam S.L |
2017-03-03 | fix reference marking in for-in loops (#1535)...fixes #1533 | Alex Lam S.L |
2017-03-03 | disable do{...}while(false) optimisation (#1534)...- fails to handle `break` in body
fixes #1532 | Alex Lam S.L |
2017-03-02 | optimize trivial IIFEs returning constants (#1530) | kzc |
2017-03-02 | trim unused invocation parameters (#1526) | Alex Lam S.L |
2017-03-02 | minor improvement to string optimisation (#1514)...- "" + "a" => "a"
- "" + a + "b" => a + "b"
- "a" + "" => "a" (improving on #45) | Alex Lam S.L |
2017-03-02 | fix corner cases in `reduce_vars` (#1524)...Avoid variable substitution in the following cases:
- use of variable before declaration
- declaration within conditional code blocks
- declaration within loop body
fixes #1518
fixes #1525 | Alex Lam S.L |
2017-03-01 | fix crash on missing `props` to `string_template()` (#1523)...Patched up `make_node()` without `orig`.
There may be other cases where `start` could be missing, so make it print "undefined" instead of crashing.
fixes #1518 | Alex Lam S.L |
2017-03-01 | invert `reduce_vars` tracking flag (#1519)...Modules like webpack and grunt-contrib-uglify still uses `ast.transform(compressor)` before `Compressor.compress(ast)` was introduced.
Workaround this compatibility issue by deactivating `reduce_vars` in such case.
Also fix use case with omitted `options` when calling `Compressor()`.
fixes #1516 | Alex Lam S.L |
2017-03-01 | fix `evaluate` on object getter & setter (#1515) | Alex Lam S.L |
2017-03-01 | temporarily disables `reduce_vars` (#1517)...... as we investigate #1516 | Alex Lam S.L |
2017-02-28 | warn & drop `#__PURE__` iff IIFE is dropped (#1511)...- consolidate `side-effects` optimisations
- improve string `+` optimisation
- enhance literal & `conditionals` optimisations | Alex Lam S.L |
2017-02-26 | faster tree transversal (#1462)...- convert `[].forEach()` to for-loops | Alex Lam S.L |
2017-02-26 | consolidate `evaluate` & `reduce_vars` (#1505)...- improve marking efficiency
- apply smarter `const` replacement to `var`
fixes #1501 | Alex Lam S.L |
2017-02-24 | enable `collapse_vars` & `reduce_vars` by default...- fix corner cases in `const` optimisation
- deprecate `/*@const*/`
fixes #1497
closes #1498
| alexlamsl |
2017-02-21 | Support marking a call as pure...A function call or IIFE with an immediately preceding comment
containing `@__PURE__` or `#__PURE__` is deemed to be a
side-effect-free pure function call and can potentially be
dropped.
Depends on `side_effects` option.
`[#@]__PURE__` hint will be removed from comment when pure
call is dropped.
fixes #1261
closes #1448
| kzc |