Age | Commit message (Collapse) | Author |
|
See #552. This is useful for stack traces.
|
|
NaN and Infinity were replaced in the output generation, instead of
during compression. This could lead to results where `1/0` was inserted
without parens leading to invalid output.
The nodes are replaced in the compression step now, and the output
generation returns their regular names. This should not be a problem,
since they're already only constructed from the original name.
|
|
Close #550
|
|
|
|
|
|
and condition has no side effects
|
|
|
|
|
|
|
|
|
|
|
|
|
|
foo ? bar(x) : bar(y) ==> bar(foo ? x : y)
|
|
I hereby acknowledge that figure_out_scope has become a mess.
|
|
`String(x + 5)` is not always the same as `x + "5"`. Overlooked that. :-(
Close #350
|
|
We can in fact lift sequences, but only if the operation is assignment and
the left-hand side has no side effects nor property access -- that should
guarantee that whatever we place before it cannot affect the sense of the
assignment.
Dropped contrived test case (too hard to support it now), added a more
meaningful one.
|
|
Fixes #267
|
|
|
|
|
|
Add a unit test to test to test for aggressive parenthesis removal that causes functional changes.
|
|
Shorten most primitives where possible. Also optimize some edge cases.
|
|
By adding the exit code 1 (or any other non-zero exit code) `npm test`
will know the tests didn't perform correctly. This way it's easier to
know if pull requests are good or bad.
|
|
Somebody hit me with bug reports on this. :)
Refs #300
|
|
ev() should do a single thing — evaluate constant expressions. if that's
not possible, just return the original node. it's not the best place for
partial evaluation there, instead doing it in the compress functions.
|
|
Close #300
|
|
Follow-up to 78e98d2.
|
|
Close #298
|
|
be evaluated. Fix #126
E.g. converts:
a+'Hello'+'World'
to
a+'HelloWorld'
|
|
(the code generator doesn't maintain enough context to know whether
the return value is important or discarded)
Fixes #272
|
|
Fix #257
|
|
1529ab96 started to do this (by considering holes to be separate from
"undefined") but it still converted
[1,,] (length 2, last element hole, trailing comma)
to
[1,] (length 1, trailing comma)
Unfortunately the test suite doesn't really make this clear: the new test here
passes with or without this patch because run-tests.js beautifys the expected
output (in "make_code"), which does the incorrect transformation! If you make
some manual change to arrays.js to make the test fail and see the INPUT and
OUTPUT, then you can see that without this fix, [1,,] -> [1,], and with this fix
it stays [1,,].
|
|
Close #204
|
|
property compression. Also added a test exercising the change.
|
|
|
|
accomodates the sort behaviour changes made in commit
mishoo/UglifyJS2@aebafad41eab48f43ed649ce8c77e8f1528b50da.
Signed-off-by: Justin Lau <justin@tclau.com>
|
|
Signed-off-by: Justin Lau <justin@tclau.com>
|
|
Signed-off-by: Justin Lau <justin@tclau.com>
|
|
dotted syntax even with screw_ie8 option.
Signed-off-by: Justin Lau <justin@tclau.com>
|
|
|
|
|
|
Close #141
|
|
|
|
1b6bcca7 was a first attempt at this. That commit made Uglify stop replacing
holes with undefined, but instead it started replacing undefined with
holes. This is slightly problematic, because there is a difference between a
hole and an undefined value. More problematically, it changed [1,undefined] to
[1,] which generally doesn't even parse as a hole (just as a trailing comma), so
it didn't even preserve the length of the array!
Instead, parse holes as their own special AST node which prints invisibly.
|
|
|
|
|
|
ref. mishoo/UglifyJS#441
|
|
close #44
|
|
for(...; x; ...) if (y) break; → for(...; x&&!y; ...);
similarly for `while` and some combinations (i.e. the `break` appears in the
`else` clause, etc.)
|
|
initializer
(opera can't parse it)
close #25
|
|
(it was assumed that the first `return` always contains a value)
close #22
|