Alex Lam S.L [Sun, 26 Mar 2017 10:18:44 +0000 (18:18 +0800)]
ufuzz: workaround function name and toString() (#1688)
fixes #1686
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
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
kzc [Sun, 26 Mar 2017 08:36:33 +0000 (04:36 -0400)]
optimize conditional when condition symbol matches consequent (#1684)
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
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
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
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
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
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
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
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
Alex Lam S.L [Fri, 24 Mar 2017 19:21:16 +0000 (03:21 +0800)]
v2.8.16
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
Alex Lam S.L [Fri, 24 Mar 2017 17:46:12 +0000 (01:46 +0800)]
introduce ufuzz.js (#1655)
closes #1647
Alex Lam S.L [Fri, 24 Mar 2017 15:12:58 +0000 (23:12 +0800)]
Update ISSUE_TEMPLATE.md
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
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
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
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
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.
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
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
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
Alex Lam S.L [Thu, 23 Mar 2017 05:36:47 +0000 (13:36 +0800)]
v2.8.15
Alex Lam S.L [Wed, 22 Mar 2017 23:17:34 +0000 (07:17 +0800)]
account for cross-scope modifications in `collapse_vars` (#1634)
mostly done by @kzc
fixes #1631
Alex Lam S.L [Wed, 22 Mar 2017 22:49:49 +0000 (06:49 +0800)]
introduce compressor.info() (#1633)
report the following only when `options.warnings = "verbose"`
- unused elements due to inlining
- collpased variables
Alex Lam S.L [Wed, 22 Mar 2017 22:11:16 +0000 (06:11 +0800)]
fix a bug in simple_glob (#1632)
- "?" should not match "/"
- other minor clean-ups
Alex Lam S.L [Wed, 22 Mar 2017 17:31:46 +0000 (01:31 +0800)]
metadata cleanup (#1630)
- mention performance anomaly in Node 7 and drop from CI
- remove unused npm "scripts"
- mark browserify dependency as optional
- stop `test/mozilla-ast.js` from spamming console output in later versions of Node.js
Alex Lam S.L [Tue, 21 Mar 2017 06:11:32 +0000 (14:11 +0800)]
throw parse error on invalid assignments (#1627)
fixes #1626
Alex Lam S.L [Sun, 19 Mar 2017 07:24:57 +0000 (15:24 +0800)]
v2.8.14
Alex Lam S.L [Sun, 19 Mar 2017 04:00:32 +0000 (12:00 +0800)]
make `expect_stdout` work on Node.js 0.12 (#1623)
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.
Alex Lam S.L [Sun, 19 Mar 2017 03:59:42 +0000 (11:59 +0800)]
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 [Sat, 18 Mar 2017 19:04:22 +0000 (03:04 +0800)]
fix AST_Binary.lift_sequences() (#1621)
Commit
eab99a1c fails to account for side effects from compound assignments.
Alex Lam S.L [Sat, 18 Mar 2017 18:17:15 +0000 (02:17 +0800)]
transform String.charAt() to index access (#1620)
Guarded by `unsafe` as `charAt()` can be overridden.
Alex Lam S.L [Fri, 17 Mar 2017 18:33:51 +0000 (02:33 +0800)]
handle runtime errors in `expect_stdout` (#1618)
allow test to pass if both `input` and `expect` throws the same kind of error
Alex Lam S.L [Fri, 17 Mar 2017 17:56:15 +0000 (01:56 +0800)]
fix top-level directives in compress tests (#1615)
`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`.
Christian Maughan Tegnér [Thu, 16 Mar 2017 19:08:38 +0000 (20:08 +0100)]
Add `--in-source-map inline` documentation (#1611)
Alex Lam S.L [Thu, 16 Mar 2017 18:01:33 +0000 (02:01 +0800)]
v2.8.13
Alex Lam S.L [Thu, 16 Mar 2017 16:26:48 +0000 (00:26 +0800)]
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 [Thu, 16 Mar 2017 15:20:06 +0000 (23:20 +0800)]
extend `test/run-tests.js` to optionally execute uglified output (#1604)
fixes #1588
Alex Lam S.L [Thu, 16 Mar 2017 05:22:26 +0000 (13:22 +0800)]
make `collapse_vars` consistent with `toplevel` (#1608)
fixes #1605
Alex Lam S.L [Thu, 16 Mar 2017 04:03:30 +0000 (12:03 +0800)]
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 [Wed, 15 Mar 2017 17:02:59 +0000 (01:02 +0800)]
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 [Wed, 15 Mar 2017 10:44:13 +0000 (18:44 +0800)]
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 [Tue, 14 Mar 2017 05:19:05 +0000 (13:19 +0800)]
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 [Fri, 10 Mar 2017 21:00:55 +0000 (05:00 +0800)]
v2.8.12
Alex Lam S.L [Fri, 10 Mar 2017 20:59:55 +0000 (04:59 +0800)]
temporary fix for boolean bug (#1597)
fixes #1592
Alex Lam S.L [Fri, 10 Mar 2017 19:34:55 +0000 (03:34 +0800)]
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 [Fri, 10 Mar 2017 03:27:30 +0000 (11:27 +0800)]
support multi-line string in tests (#1590)
`expect_exact` sometimes have multiple lines and `\n` are hard to read.
Use array of strings to emulate line breaks and improve readability.
Alex Lam S.L [Fri, 10 Mar 2017 02:49:41 +0000 (10:49 +0800)]
fixup for #1585 (#1589)
As patched on `harmony`, `statement()` is the only user of `embed_tokens()` with a missing error branch.
Updated test case and match up with `harmony` to facilitate future merging.
Alex Lam S.L [Thu, 9 Mar 2017 20:17:21 +0000 (04:17 +0800)]
v2.8.11
Alex Lam S.L [Thu, 9 Mar 2017 19:15:21 +0000 (03:15 +0800)]
fix catch variable reference in IE8 (#1587)
`AST_Scope.def_variable()` will overwrite `AST_Symbol.thedef`, so save a copy before calling.
fixes #1586
Michael Mior [Thu, 9 Mar 2017 19:08:43 +0000 (14:08 -0500)]
Correctly raise a parse exception with a missing loop body (#1585)
Alex Lam S.L [Thu, 9 Mar 2017 11:11:05 +0000 (19:11 +0800)]
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 [Wed, 8 Mar 2017 21:48:06 +0000 (05:48 +0800)]
v2.8.10
Alex Lam S.L [Wed, 8 Mar 2017 21:22:27 +0000 (05:22 +0800)]
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 [Wed, 8 Mar 2017 11:19:54 +0000 (19:19 +0800)]
remove checkboxes from Issues template
Alex Lam S.L [Wed, 8 Mar 2017 10:56:01 +0000 (18:56 +0800)]
explain how to make a proper bug report (#1579)
fixes #1574
Alex Lam S.L [Wed, 8 Mar 2017 10:37:32 +0000 (18:37 +0800)]
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 [Wed, 8 Mar 2017 04:41:22 +0000 (12:41 +0800)]
v2.8.9
Alex Lam S.L [Wed, 8 Mar 2017 04:39:57 +0000 (12:39 +0800)]
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 [Tue, 7 Mar 2017 22:00:51 +0000 (06:00 +0800)]
only run benchmark & jetstream on CI (#1571)
Alex Lam S.L [Tue, 7 Mar 2017 21:07:05 +0000 (05:07 +0800)]
plan B for IE8 do-while semi-colon fix (#1572)
- omitting trailing semi-colon in do-while breaks non-browser parser, e.g. uglify-js 1.x
- trailing semi-colon only breaks IE8 if followed by `else` or `while`
- always use braces in do-while body to workaround 2nd case with no size loss in compression
fixes #1568
Alex Lam S.L [Tue, 7 Mar 2017 19:31:51 +0000 (03:31 +0800)]
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 [Tue, 7 Mar 2017 11:58:41 +0000 (19:58 +0800)]
v2.8.8
Alex Lam S.L [Tue, 7 Mar 2017 11:25:12 +0000 (19:25 +0800)]
include benchmark.js in test suite (#1564)
- report file sizes and overall run time
- exit with non-zero code upon error
Alex Lam S.L [Tue, 7 Mar 2017 10:38:27 +0000 (18:38 +0800)]
fix deep cloning of labels (#1565)
`AST_Label.references` get `.initialize()` to `[]` every time after `.clone()`
So walk down the tree to pick up the cloned `AST_LoopControl` pieces and put it back together.
Alex Lam S.L [Tue, 7 Mar 2017 07:37:52 +0000 (15:37 +0800)]
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 [Mon, 6 Mar 2017 19:11:03 +0000 (03:11 +0800)]
avoid substitution of global variables (#1557)
- unless `toplevel` is enabled
- global `const` works as before
kzc [Mon, 6 Mar 2017 17:42:33 +0000 (12:42 -0500)]
collapse_vars: do not replace a constant in loop condition or init (#1562)
Alex Lam S.L [Mon, 6 Mar 2017 09:31:35 +0000 (17:31 +0800)]
suppress semicolons after do/while (#1556)
- unless both `beautify` & `screw-ie8` are enabled
- deprecate workaround for if-do-while-else
fixes #186
Alex Lam S.L [Sun, 5 Mar 2017 09:17:08 +0000 (17:17 +0800)]
v2.8.7
Alex Lam S.L [Sun, 5 Mar 2017 09:15:37 +0000 (17:15 +0800)]
fixup for #1553 (#1555)
- `++a` is the one that is foldable
- transform `a++` into `++a` for better optimisation
Alex Lam S.L [Sun, 5 Mar 2017 07:48:28 +0000 (15:48 +0800)]
v2.8.6
Alex Lam S.L [Sun, 5 Mar 2017 06:56:14 +0000 (14:56 +0800)]
collapse assignment with adjacent subsequent usage (#1553)
- consolidate `cascade` optimisations
- support ++/-- postfixes
- remove redundant optimisation identified in #1460
fixes #368
Alex Lam S.L [Sun, 5 Mar 2017 05:13:44 +0000 (13:13 +0800)]
handle variable declaration within catch blocks (#1546)
accounts for IE8- scoping
Alex Lam S.L [Sun, 5 Mar 2017 05:09:27 +0000 (13:09 +0800)]
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 [Sun, 5 Mar 2017 04:51:11 +0000 (12:51 +0800)]
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 [Sun, 5 Mar 2017 04:16:02 +0000 (12:16 +0800)]
fix handling of shebang and preamble (#1545)
fixes #1332
Alex Lam S.L [Sun, 5 Mar 2017 04:12:59 +0000 (12:12 +0800)]
fix a corner case in #1530 (#1552)
Alex Lam S.L [Sat, 4 Mar 2017 17:54:20 +0000 (01:54 +0800)]
resolve issue with outdated version of async (#1549)
fixes #746
kzc [Fri, 3 Mar 2017 18:39:54 +0000 (13:39 -0500)]
disallow collapse_vars constant replacement in for-in statements (#1543)
Alex Lam S.L [Fri, 3 Mar 2017 10:13:07 +0000 (18:13 +0800)]
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 [Fri, 3 Mar 2017 10:04:32 +0000 (18:04 +0800)]
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 [Thu, 2 Mar 2017 23:12:24 +0000 (07:12 +0800)]
facilitate fix for #1531 (#1542)
Alex Lam S.L [Thu, 2 Mar 2017 21:14:21 +0000 (05:14 +0800)]
v2.8.5
Alex Lam S.L [Thu, 2 Mar 2017 20:45:20 +0000 (04:45 +0800)]
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
kzc [Thu, 2 Mar 2017 19:51:15 +0000 (14:51 -0500)]
collapse_vars should not replace constant in for-in init section (#1538)
fixes #1537
Alex Lam S.L [Thu, 2 Mar 2017 18:39:57 +0000 (02:39 +0800)]
properly cover all cases of for-in loop variables (#1536)
Alex Lam S.L [Thu, 2 Mar 2017 16:56:06 +0000 (00:56 +0800)]
fix reference marking in for-in loops (#1535)
fixes #1533
Alex Lam S.L [Thu, 2 Mar 2017 16:54:41 +0000 (00:54 +0800)]
disable do{...}while(false) optimisation (#1534)
- fails to handle `break` in body
fixes #1532
kzc [Thu, 2 Mar 2017 07:11:40 +0000 (02:11 -0500)]
optimize trivial IIFEs returning constants (#1530)
Alex Lam S.L [Thu, 2 Mar 2017 03:33:59 +0000 (11:33 +0800)]
trim unused invocation parameters (#1526)
Alex Lam S.L [Thu, 2 Mar 2017 03:31:39 +0000 (11:31 +0800)]
minor improvement to string optimisation (#1514)
- "" + "a" => "a"
- "" + a + "b" => a + "b"
- "a" + "" => "a" (improving on #45)
Alex Lam S.L [Wed, 1 Mar 2017 16:24:49 +0000 (00:24 +0800)]
v2.8.4
Alex Lam S.L [Wed, 1 Mar 2017 16:20:53 +0000 (00:20 +0800)]
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 [Wed, 1 Mar 2017 07:28:46 +0000 (15:28 +0800)]
v2.8.3
Alex Lam S.L [Wed, 1 Mar 2017 07:25:26 +0000 (15:25 +0800)]
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 [Tue, 28 Feb 2017 20:46:12 +0000 (04:46 +0800)]
v2.8.2