Commit Graph

593 Commits

Author SHA1 Message Date
Richard van Velzen
66761d7ecf Fix semicolon printing when restricting max line length
Fixes #755
2015-07-30 16:13:32 +02:00
Chris Cowan
9854deb626 Re-use the caught exception's error message in the parse error call. 2015-07-29 15:06:52 +02:00
Chris Cowan
d6814050dd Give a good error message if an invalid regular expression is found. 2015-07-29 15:05:59 +02:00
thorn0
252fc65558 Advanced way to specify if a function call might have side effects. #400 2015-07-29 14:36:42 +02:00
Mihai Bazon
905b601178 Don't attempt to negate non-boolean AST_Binary
Fix #751
2015-07-22 16:55:55 +03:00
Mihai Bazon
63fb2d5a44 Merge pull request #735 from kzc/master
optimizations for && and || where left side is constant expression
2015-07-20 09:58:01 +03:00
Mihai Bazon
85a5fc0aeb Don't drop parens in a * (b * c). Close #744 2015-06-30 10:10:29 +03:00
kzc
f47b2b52a5 operator && and || optimization: add "else" before "if" as intended 2015-06-14 17:44:26 -04:00
kzc
fedb6191a1 optimizations for && and || where left side is constant expression 2015-06-11 23:22:38 -04:00
Joao Carlos
0ac6918a41 Add --mangle-regex option 2015-06-09 14:16:50 +03:00
Mihai Bazon
bce4307e9e Treat \uFEFF as whitespace.
Fix #714
2015-05-20 16:17:46 +03:00
Mihai Bazon
a5b60217ce Fix compressing conditionals
Only transform foo() ? EXP(x) : EXP(y) into EXP(foo() ? x : y) if EXP has no
side effects.

Fix #710
2015-05-18 13:56:04 +03:00
Mihai Bazon
44fd6694eb fix again reserved props 2015-05-13 22:03:00 +03:00
Mihai Bazon
e48db3a8b6 Make reserved names take priority over the name cache 2015-05-07 15:01:16 +03:00
Mihai Bazon
e637bdaf4e Only drop the BOM when it's the first character.
Close #704
2015-05-05 10:11:38 +03:00
Mihai Bazon
4aed0830e5 Fix blank lines in the output.
The issue was more obvious when max_line_len has a small value, rather than
the default 32K characters.  A blank line showed up after most statements.
2015-05-04 17:55:42 +03:00
Mihai Bazon
c3a10c135e Avoid spurious brackets when dropping unused vars
Fix #702
2015-05-04 14:49:17 +03:00
Mihai Bazon
92e4340732 Fix parsing strings with literal DOS newlines
(should not set newline_before)

Fix #693
2015-04-23 12:08:19 +03:00
Mihai Bazon
7b22f2031f If name_cache is specified, do rename cached properties
(even if --mangle-props is not there)
2015-04-22 17:34:49 +03:00
Mihai Bazon
274e1b3dc7 Drop NaN -> 0/0 transformation.
Fix #687
2015-04-17 11:26:36 +03:00
Mihai Bazon
18c63ff3d8 Fix compression of conditionals
Don't move the condition on the right side of an assignment when
the left side may have side effects.

Fix #677
2015-04-13 17:29:48 +03:00
Mihai Bazon
e04ef56243 Use the before visitor in mangle props
(works around a bug in our tree walker which, while cloning nodes, breaks
references between labeled statements and break/continue labels)
2015-04-10 11:33:29 +03:00
Mihai Bazon
a79ff060d0 Merge branch 'propmangle' 2015-03-29 12:50:43 +03:00
Mihai Bazon
276b9a31cd Fix compressing ![foo()]; as a statement
need to check whether the literal has any side effects before replacing that
with `false`.
2015-03-23 23:27:00 +02:00
Mihai Bazon
5801fa39e9 [sequencesize] Actually even better:
do create the sequence even if the stat list is bigger than 2000 statements,
but limit the sequence itself to 2000 expressions.

Ref #414
2015-03-22 13:02:45 +02:00
Mihai Bazon
f0ab1b02e6 Avoid sequencesize for more than 2000 statements.
It hardly saves any bytes for a sequence so long, and it risks blowing the
stack with the recursive Seq functions.

Ref #414
2015-03-22 12:51:15 +02:00
Mihai Bazon
36c28e02fd Add start/end nodes for NaN/Infinity transformations 2015-03-22 12:50:36 +02:00
Mihai Bazon
ecfd881ac6 Keep unused function arguments by default
Discarding unused function arguments affects function.length, which can lead
to some hard to debug issues.  This optimization is now done only in "unsafe
mode".

Fix #121
2015-03-20 10:28:51 +02:00
Mihai Bazon
80d1c8206b Fix parsing for U+2028 / U+2029
(they should be treated as whitespace)
2015-03-18 10:11:37 +02:00
Mihai Bazon
d36faffeca Fix parsing for U+2028 / U+2029
(they should be treated as whitespace)
2015-03-18 10:09:30 +02:00
Mihai Bazon
aa45f6586e rename --prop-cache to --name-cache
... and support storing there variable names as well, to help with multiple
invocations when mangling toplevel.
2015-03-16 13:16:30 +02:00
Mihai Bazon
0c80d21e01 Fix prop mangling
Even if not “defined”, do mangle if name exists in the cache.
2015-03-16 10:53:31 +02:00
Mihai Bazon
ea3430102c Add property name mangler
We only touch properties that are present in an object literal, or which are
assigned to.  Example:

    x = { foo: 1 };
    x.bar = 2;
    x["baz"] = 3;
    x[cond ? "qwe" : "asd"] = 4;
    console.log(x.stuff);

The names "foo", "bar", "baz", "qwe" and "asd" will be mangled, and the
resulting mangled names will be used for the same properties throughout the
code.  The "stuff" will not be, since it's just referenced but never
assigned to.

This *will* break most of the code out there, but could work on carefully
written code: do not use eval, do not define methods or properties by
walking an array of names, etc.  Also, a comprehensive list of exclusions
needs to be passed, to avoid mangling properties that are standard in
JavaScript, DOM, used in external libraries etc.
2015-03-14 11:22:28 +02:00
Edward Casbon
ae07714927 Add filename to the JS_Parse_Error exception.
It would be nice to have access to the filename of the file that includes the code that causes a JavaScript error. This is especially handy if uglifying multiple files at once.

Only a small change is needed for this to happen as it's already available in the function that throws the error.
2015-02-11 23:21:22 +01:00
Richard van Velzen
992b6b9fcc Fix invalid removal of left side in && and || compression
See #637. This does not produce the optimal result, but it does prevent the removal of non-side-effect-free code.
2015-02-11 21:08:41 +01:00
Richard van Velzen
605362f89d Drop all console statements properly
Because the base reference can be an member expression as well, we have to dig a bit deeper to find the leftmost base reference.

Fixes #451
2015-01-31 13:24:44 +01:00
Mihai Bazon
fbbaa42ee5 Add option to preserve/enforce string quote style
`-q 0` (default) use single or double quotes such as to minimize the number of
 bytes (prefers double quotes when both will do); this is the previous
 behavior.

`-q 1` -- always use single quotes

`-q 2` -- always use double quotes

`-q 3` or just `-q` -- always use the original quotes.

Related codegen option: `quote_style`.

Close #495
Close #460

Some `yargs` guru please tell me why `uglifyjs --help` doesn't display the
help string for `-q` / `--quotes`, and why it doesn't output the expected
argument types anymore, like good old `optimist` did.
2015-01-27 22:26:27 +02:00
Anthony Van de Gejuchte
099992ecae Keep single line comments after nlb, after nlb
Fixes #583
2015-01-26 12:11:52 +01:00
Bryce Cronkite-Ratcliff
5c02d65ddb fixes issue #621 SourceMap toString JSON format
The correct format of a sourcemap is acquired
from a mozilla source map generator by calling
toJSON on this object. This patch alters the
toString function on mozilla generators to print
the format that is to spec instead of the generator's
internal representation of itself.
2015-01-24 00:33:02 -08:00
Mihai Bazon
d36067cd35 Merge pull request #615 from avdg/unicode
Give parser more unicode support
2015-01-20 13:00:31 +02:00
Anthony Van de Gejuchte
74cda80d3b Add unicode digit parsing support 2015-01-20 00:17:24 +01:00
Anthony Van de Gejuchte
9a3a848cc8 Update unicode letter 2015-01-20 00:17:03 +01:00
Tal Ater
a1a4c2ada7 Optimize conditionals where the consequent and alternative are both booleans and not equivalent 2015-01-13 18:27:21 +01:00
Richard van Velzen
42ecd42ac0 Replace the correct node when replacing in void sequences
Close #611.
2015-01-12 17:09:34 +01:00
Mihai Bazon
a10f6a96d7 Merge pull request #482 from arty-name/inline-ng-inject
added @ngInject support for inline functions
2015-01-11 12:10:42 +02:00
Mihai Bazon
61c233a08e Fix make_node_from_constant for Regexp-s
Close #588
2015-01-07 11:20:04 +02:00
Mihai Bazon
d2d716483a aborts(AST_If) returns the if node
Previously it returned the abort node from the alternative branch.  This is
not much use as it can be different from the one in the body
branch (i.e. return vs. throw) and can trick us into issues like #591.

Fix #591
2015-01-06 14:01:35 +02:00
Ingvar Stepanyan
f16033aafd Location fix for Mozilla AST start token. 2015-01-06 11:32:41 +01:00
Ingvar Stepanyan
ae5366a31d Track ending lines/columns; fix end locations in Mozilla AST. 2015-01-06 11:32:41 +01:00
Mihai Bazon
6b23cbc852 AST_Do nodes: walk body before condition 2015-01-06 12:29:07 +02:00
Mihai Bazon
13219cebcb Fix handling \r\n
Close #437
2015-01-05 12:14:42 +02:00
Mihai Bazon
e1f0747e4c Support keep_fnames in compressor, and --keep-fnames. #552
Passing `--keep-fnames` will enable it both for compressor/mangler, so that
function names will not be dropped (when unused) nor mangled.
2015-01-05 11:03:13 +02:00
Richard van Velzen
e37b67d013 Add an option to prevent function names from being mangled
See #552. This is mostly useful for having the actual function names in traces.
2015-01-04 21:48:43 +01:00
Caridy Patino
ad18689d92 using the original sourcemap as the base
* Creates a new SourceMapGenerator based on a SourceMapConsumer:
  https://github.com/mozilla/source-map#sourcemapgeneratorfromsourcemapsourcemapconsumer
2015-01-04 21:08:29 +01:00
Richard van Velzen
24bc09b79b Fix #556
`\uFEFF` (ZERO WIDTH NO-BREAK SPACE) is removed when parsing, but was
un-escaped for the output when `ascii_only` was false.

When using
UglifyJS multiple times (creating packages from minified sources, for
example), this would lead to problems because the byte was removed when
parsing for the second time.
2015-01-04 15:01:55 +01:00
Richard van Velzen
37c17d5541 Merge pull request #570 from rvanvelzen/fix-569
Fix #569
2015-01-04 14:02:08 +01:00
Richard van Velzen
120948fa48 Merge pull request #584 from clyfish/fix-base54
fix base54
2015-01-04 14:00:23 +01:00
Richard van Velzen
66e6f0c3cb Merge pull request #592 from micschro/patch-1
Fix max_line_len not working for JSON files
2015-01-04 13:53:31 +01:00
Richard van Velzen
f4d36a58c2 Fix #569
When no arguments are given to `new Function()`, it should be treated as
a regular anonymous function (http://es5.github.io/#x15.3.2.1)
2015-01-04 13:37:59 +01:00
Richard van Velzen
c75f5a1fd8 Fix #597
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.
2014-12-31 12:23:00 +01:00
micschro
39d8880f2c Fix max_line_len not working for JSON files
As `maybe_newline()` is only called when `might_need_semicolon` is `true`, the `max_line_len` option has no effect for files without (or with very few) semicolons (like JSON files). A simple for this problem is to use `maybe_newline()` instead of `noop` as the `newline()` function in non-beautify mode.
2014-12-17 16:31:03 +01:00
Mihai Bazon
f101d6429b Merge pull request #546 from jacobk/patch-1
Use uglify source map token names if missing
2014-12-04 14:07:08 +02:00
Cheng Liangyu
fe06fc85d3 fix base54 2014-12-01 13:16:44 +08:00
Mihai Bazon
f36a1eaa8b Add option to allow return outside of functions.
Close #288
2014-10-20 18:12:13 +03:00
Mihai Bazon
01d19b4b52 Referencing a global is assumed to have side effects.
Close #550
2014-09-28 11:18:25 +03:00
Arnavion
7be680d3f8 Don't warn for an unreferenced exception symbol in a catch block. 2014-09-12 21:01:19 -07:00
Jacob Kristhammar
21b3c890a1 Use uglify source map token names if missing 2014-09-09 13:02:50 +02:00
Tal Ater
fb0ec720a4 Compress conditions that have side effects using sequences 2014-09-04 02:57:49 +03:00
Tal Ater
885835a655 Compress conditional assignments where all possible outcomes are equivalant and condition has no side effects 2014-09-02 23:30:25 +03:00
Mihai Bazon
4c64554808 Turn foo.new into foo["new"] when not --screw-ie8. Fix #534 2014-08-26 10:11:01 +03:00
Mihai Bazon
548beeb6b1 Prevent error for Function(""). Close #538 2014-08-20 09:16:34 +03:00
Ingvar Stepanyan
b467a3c877 Added generative testing for AST conversions. 2014-08-03 20:48:59 +03:00
Ingvar Stepanyan
5e314bf3e9 SpiderMonkey Identifier nodes should contain mangled names. 2014-08-03 01:28:58 +03:00
Ingvar Stepanyan
05ba26c7c8 Small fixes for AST conversion. 2014-08-02 13:18:27 +03:00
Ingvar Stepanyan
87b72364a4 Fixes and improvements for UglifyJS->SM AST conversion.
* Explicitly forbidden multiple catch clauses as SM-specific feature.
* Simplified describing of UglifyJS->Mozilla AST conversion rules.
* Moved alias rules to single place.
* Removed usage of dynamic type bindings in generated code (speed-up).
2014-08-01 23:45:37 +03:00
Ingvar Stepanyan
0e3ff1f970 Improved UglifyJS<->SpiderMonkey AST conversions.
* Added directives recognition in SM AST.
* Moved semi-standard SM `Property` type to separate handler.
* Added `const` recognition from SM AST.
* Removed redundant `this`-as-identifier recognition.
* Removed redundant rules for abstract SM types.
* Described `CatchClause` using string syntax.
* Added support for semi-standard `range` tuple as location source.
* Added back-conversion support (to be improved).
2014-08-01 23:42:34 +03:00
Mihai Bazon
62bda71c85 Fix parens for AST_Undefined
Do the same as for AST_Unary, since we output undefined as `void 0`.

Reported at https://github.com/mishoo/UglifyJS2/issues/338#issuecomment-48858341
2014-07-18 11:31:41 +03:00
Mihai Bazon
ac2caf1088 Check for the case an AST_For's init is an EmptyStatement
(lame fix for #503)
2014-07-01 23:10:44 +03:00
Dan Wolff
8511e80f48 Evaluate "foo".length ==> 3 2014-07-01 11:06:51 +03:00
Artemy Tregubenko
524a8a42a4 added @ngInject support for inline functions 2014-05-11 14:01:08 +02:00
Mihai Bazon
7bf59b5bcd Actually, even better. #475
- also handle x = + ++y, x = - --y;
- don't use parens, a space suffices.
2014-04-27 21:42:14 +03:00
Mihai Bazon
025f3e9596 Better fix for #475 2014-04-27 20:54:54 +03:00
Mihai Bazon
8258edd8a5 Fix parens in +(+x). Close #475 2014-04-27 20:51:01 +03:00
Mihai Bazon
71652690b6 Merge pull request #445 from ConradIrwin/try-statement
Handle TryStatements trees from acorn >=0.2.0
2014-04-24 10:46:53 +03:00
Mihai Bazon
8fbe200012 Always quote property names that contain non-ASCII characters.
Fix #328
2014-04-18 10:48:44 +03:00
Arnavion
e2e09d5754 Allow colons in the pairs passed to AST_Toplevel.wrap_enclose 2014-03-22 18:02:21 -07:00
Conrad Irwin
514936beb8 Handle TryStatements trees from acorn >=0.2.0 2014-03-06 17:07:49 -08:00
Arnavion
014f655c5f Handle the case when SourceMapConsumer.originalPositionFor returns null source.
This happens when SourceMapConsumer does not have a valid position to map the input line and column. This is a change in mozilla/source-map starting from version 0.1.33

Fixes #436
2014-03-02 19:20:19 -08:00
Mihai Bazon
bf30dc3038 Mangle name of exception when --screw-ie8. Fix #430.
The effect of not mangling it was visible only with --screw-ie8 (otherwise
the names would be mangled exactly because they leaked into the parent
scope).
2014-02-14 13:58:14 +02:00
Mihai Bazon
ef2ef07cbd Add option keep_fargs.
By default it's `false`.  Pass `true` if you need to keep unused function
arguments.

Close #188.
2014-02-08 12:33:56 +02:00
Matt Basta
ac0086a745 Simplify nested conditionals if possible 2014-02-06 12:39:13 -08:00
Mihai Bazon
5344b7dab8 Fix if_return dropping the alternative. Close #413 2014-01-31 10:44:13 +02:00
Mihai Bazon
e29048b54a Merge branch 'master' of github.com:mishoo/UglifyJS2 2014-01-26 10:07:10 +02:00
Mihai Bazon
ceb200fe81 Move unescaping regexps under a codegen option (unescape_regexps) 2014-01-26 10:05:55 +02:00
Daniel Stutzman
f5f8239057 Don't unescape \x00 in regexes (it breaks IE8) 2014-01-25 11:55:39 -07:00
Mihai Bazon
931862e97f More chars that cannot be unescaped in regexps. 2014-01-21 11:44:00 +02:00
Mihai Bazon
1d0127de21 Fix end token for conditionals. Close #404 2014-01-21 10:38:59 +02:00
Ville Lautanala
1e31011874 Don't unescape byte order marks in regexps 2014-01-19 12:27:03 +02:00
Mihai Bazon
4339bd5cfa Don't unescape \x2f (slash) in regexps. #54 2014-01-18 12:31:50 +02:00
Mihai Bazon
90a330da16 simplify 2014-01-10 10:36:15 +02:00
Mihai Bazon
cad1f9cbd1 Unescape Unicode sequences in regexps when ascii_only is false. #54 2014-01-10 10:33:58 +02:00
Mihai Bazon
c3087dd179 Better process_for_angular before other statement reductions. #395 2014-01-08 11:39:24 +02:00
Mihai Bazon
2c305af478 Support @ngInject with angular compressor option. Close #395. 2014-01-08 11:28:32 +02:00
Mihai Bazon
2c88eb6fbe doh. 2014-01-07 12:54:14 +02:00
Mihai Bazon
27142df4f5 minor: exp["10"] => exp[10] 2014-01-07 12:48:21 +02:00
Mihai Bazon
5e4c7f4245 Fix parens for property access -- (foo, bar)["baz"] 2014-01-05 11:48:01 +02:00
Mihai Bazon
b521b4b926 Conditional/call optimization
foo ? bar(x) : bar(y)  ==>  bar(foo ? x : y)
2013-12-29 10:31:30 +02:00
Mihai Bazon
aa9de76370 Mark yield as reserved word. Close #375. 2013-12-22 20:52:19 +02:00
Mihai Bazon
5a083a938d Optimize seq,void 0. Close #377.
(x, void 0)    => void x
    (x, undefined) => void x
2013-12-22 11:36:45 +02:00
Mihai Bazon
7a30d826b8 Better fix for comments in AST_Exit
Close #374
2013-12-18 15:54:12 +02:00
Mihai Bazon
be55a09edf Take out all comments from an AST_Exit's value
Fix #372
2013-12-18 13:30:26 +02:00
Mihai Bazon
428e19fed2 Add option to adjust the src/target line in the source map 2013-12-18 12:10:02 +02:00
Mihai Bazon
f65e55dff4 minor 2013-12-16 20:37:09 +02:00
colorhook
fa3300f314 bugfix #242 2013-12-16 15:53:43 +08:00
Mihai Bazon
bd0886a2c0 semicolons 2013-12-10 20:24:27 +02:00
Mihai Bazon
248f304f02 Merge pull request #245 from ForbesLindesay/patch-1
Make `DefaultsError` a real `Error` object
2013-12-10 10:23:29 -08:00
Mihai Bazon
dc5f70eab5 Add drop_console option to the compressor 2013-12-10 19:44:41 +02:00
Mihai Bazon
df8c5623af minor 2013-12-10 19:39:03 +02:00
Mihai Bazon
8f35a363d9 AST_Catch shouldn't really inherit from AST_Scope. Fix #363
I hereby acknowledge that figure_out_scope has become a mess.
2013-12-05 13:30:29 +02:00
Mihai Bazon
d2190c2bf3 Properly scope catch identifier when --screw-ie8
Fix #344
2013-11-28 16:43:30 +02:00
Mihai Bazon
c16d538ce7 Add --noerr to turn off argument name checking
for now only used for keys passed to `-c` or `-b`.
2013-11-28 13:15:01 +02:00
Mihai Bazon
50b8d7272c Fix faulty compression
`String(x + 5)` is not always the same as `x + "5"`.  Overlooked that. :-(

Close #350
2013-11-20 21:13:16 +02:00
Mihai Bazon
7d11b96f48 Only descend twice after drop_unused if it's the same node type.
Fix #345
2013-11-08 11:57:17 +02:00
Mihai Bazon
eab99a1c3d Better fix for #343
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.
2013-11-06 10:48:48 +02:00
Mihai Bazon
f4919e3a25 Do not lift sequence from right-hand side of binary operation. Fix #343 2013-11-06 10:18:28 +02:00
Mihai Bazon
63287c0e68 Workaround for Safari bug
Close #313
2013-10-30 13:59:59 +02:00
Mihai Bazon
c5ed2292bf Fix parsing setters/getters (allow keywords for name).
The "key" property was always "set" or "get", which didn't make much sense.
Now it'll be the actual name of the setter/getter (AST_Node), and the
AST_Accessor object itself, which represents the function, won't store any
name.

Close #319
2013-10-30 11:50:22 +02:00
Mihai Bazon
b70670b69f Fix regression after e4c5302406
`x * (y * z)` ==> `x * y * z` -- the better place to do this is in the
compressor rather than codegen.
2013-10-30 10:45:58 +02:00
Mihai Bazon
9dd97605bc indentation 2013-10-30 10:44:50 +02:00
Mihai Bazon
e4c5302406 Fix output for x = 2 * (a % b / b * c)
(issue #337)
2013-10-30 09:11:55 +02:00
Mihai Bazon
bea3d90771 minor 2013-10-30 09:10:56 +02:00
Richard van Velzen
785c6064cc Disallow reversal where lhs has higher or equal precedence
Fixes #267
2013-10-29 21:37:36 +01:00
Mihai Bazon
b214d3786f Fix typo 2013-10-29 15:53:54 +02:00
Mihai Bazon
a14c6b6574 Avoid shadowing name of function expression with function argument
Close #179, #326, #327
2013-10-29 13:18:09 +02:00
Mihai Bazon
f1b7094a57 Add "preamble" output option
Close #335
2013-10-29 11:09:18 +02:00
Mihai Bazon
0358e376f0 Fix codegen for when comments_before is undefined.
Fix #333
2013-10-28 09:39:29 +02:00
Richard van Velzen
e2daee9a65 Fix RHS concat (raised in #330)
When attempting to concat the left-side of the rhs, make sure the rhs is
a string.
2013-10-26 18:44:52 +02:00
Richard van Velzen
1a5a4bd631 Fix #269
Shorten most primitives where possible. Also optimize some edge cases.
2013-10-24 11:08:33 +02:00
Richard van Velzen
7055af8221 Fix #280
The `init` of the `ForStatement` is not a `BlockStatement` before it was
descended. The descend has to happen first, and *then* the actual
checks.
2013-10-23 22:26:04 +02:00
Mihai Bazon
63d04fff69 Revert #3a81f60 for now
(with it some tests break and it can generate invalid output, see issue #44)
2013-10-22 21:50:55 +03:00
Mihai Bazon
d09f0adae3 arguments outside of a function is an ordinary variable.
Fix #501
2013-10-17 18:20:33 +03:00
Mihai Bazon
3fa9265ce4 wrap up 2013-10-09 22:15:43 +03:00
Mihai Bazon
3a81f60982 Don't drop_unused before compression.
Fix #280, #282
2013-10-09 19:15:09 +03:00
Mihai Bazon
f2348dd98b Rename clean_getters to pure_getters; add pure_funcs. 2013-10-04 13:17:25 +03:00
David Glasser
bb0a762d12 Only allow identifier start characters at the beginning of identifiers.
Without this fix, the following source:

   x = {"\u200c": 42};

would incorrectly be converted into a quoteless key. But while \u200c is allowed
to be in identifiers, it cannot be at the beginning, as per ES5.

(For example, the SockJS client library doesn't work under uglify starting with
d9ad3c7c.)
2013-10-03 17:02:19 -07:00
Mihai Bazon
8cc86fee60 add clean_getters compressor option (default false)
allows one to specify if `foo.bar` is considered to have side effects.
2013-10-02 19:38:01 +03:00
Mihai Bazon
88fb83aa81 minor optimization
unlikely to help in hand-written code:

    (something() ? foo : bar) == foo  ==>  something()
2013-10-02 15:31:31 +03:00
Mihai Bazon
95b4507c02 Fix error in the output minifying Function("return this")() 2013-09-30 11:49:29 +03:00
Mihai Bazon
afdaeba37d More attempts to determine when addition is associative
Somebody hit me with bug reports on this. :)

Refs #300
2013-09-22 15:26:10 +03:00
Mihai Bazon
037199bfe2 Actually let's move away those monsters from the evaluate function
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.
2013-09-22 15:00:42 +03:00
Mihai Bazon
583fac0a0f More dirty handling of [ ... ].join() in unsafe mode
Close #300
2013-09-22 13:14:42 +03:00
Dan Wolff
e8158279ff Evaluate [...].join() if possible: minor bugfix
Follow-up to 78e98d2.
2013-09-22 11:34:30 +03:00
Mihai Bazon
78e98d2611 When unsafe is set, evaluate [...].join() if possible
Close #298
2013-09-19 18:20:45 +03:00
Dan Wolff
8d14efe818 Concatenate strings also on the right-hand side of an expression that cannot be evaluated. Fix #126
E.g. converts:
  a+'Hello'+'World'
to
  a+'HelloWorld'
2013-09-19 13:03:03 +03:00
Mihai Bazon
83ba338bd0 Avoid printing <!-- in the output (HTML5 comment) 2013-09-06 10:10:45 +03:00
Mihai Bazon
7c10b25346 Support HTML5 comment syntax (enabled by default!)
See http://javascript.spec.whatwg.org/#comment-syntax
    https://github.com/mishoo/UglifyJS/issues/503
    https://github.com/marijnh/acorn/issues/62
2013-09-06 09:54:30 +03:00
Mihai Bazon
cb9d16fbe4 minor 2013-09-06 09:52:56 +03:00
Mihai Bazon
5d8da864c5 Fix names. 2013-09-02 19:38:00 +03:00
Mihai Bazon
85b527ba3d Disallow continue referring to a non-IterationStatement. Fix #287
Simplifies handling of labels (their definition/references can be easily
figured out at parse time, no need to do it in `figure_out_scope`).
2013-09-02 19:36:16 +03:00
Mihai Bazon
1c6efdae34 Better fix for #286 2013-09-02 11:36:48 +03:00
Mihai Bazon
b0ca896d98 Fix parsing a.case /= 1
Close #286
2013-09-02 11:09:54 +03:00
Mihai Bazon
78a217b94c Fix parsing regexp after unary-prefix operator
++/x/.y

Fix #284
2013-09-02 09:56:27 +03:00
Mihai Bazon
ed80b4a534 Move support for negate_iife in the compressor, rather than code generator
(the code generator doesn't maintain enough context to know whether
the return value is important or discarded)

Fixes #272
2013-08-20 17:45:52 +03:00
Michael Ficarra
d9ad3c7cbf fixes #259: don't unnecessarily quote object properties when --screw-ie8 2013-08-18 19:45:06 -05:00
Mihai Bazon
4c4dc2137c Don't drop unused setter argument.
Fix #257
2013-08-07 12:04:58 +03:00
Mihai Bazon
964d5b9aa4 Don't pretend to evaluate lambdas
Fix #255
2013-08-04 21:44:17 +03:00
Mihai Bazon
41c627379c Reverting "added option for dropping unused params"
Revert "added option for dropping unused params"

(turns out we already had the `unused` option for this.)

This reverts commit e54df2226f.
2013-07-25 18:08:36 +03:00
Dusan Bartos
e54df2226f added option for dropping unused params 2013-07-25 17:37:47 +03:00
Forbes Lindesay
dfa395f6ff Make DefaultsError a real Error object 2013-07-22 01:44:03 +01:00
David Glasser
b1febde3e9 Fix output for arrays whose last element is a hole: [1,,]
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,,].
2013-07-18 15:39:22 +03:00
Mihai Bazon
193049af19 Revert previous patch, it was no good. 2013-07-15 11:59:23 +03:00
Mihai Bazon
4a0bab0fa3 Add "position" option to parser, to specify initial pos/line/col
(for parsing embedded scripts)
2013-07-15 11:27:11 +03:00
Mihai Bazon
9243b0cb9d Apply transformer to AST_VarDef's name
Fix #237
2013-07-14 13:24:09 +03:00
Mihai Bazon
fc9ba323c4 Fix typo.
Close #239
2013-07-12 09:56:58 +03:00
Mihai Bazon
02a84385a0 Don't swap binary ops when "use asm" is in effect.
Refs #167
2013-06-07 12:52:09 +03:00
Ville Lautanala
f29f07aabd Escape null characters as \x00
Since \0 might be mistakenly interpreted as octal if followed by a
number and using literal null is in some cases interpreted as end of
string, escape null as \x00.
2013-06-03 20:46:42 +03:00
Mihai Bazon
9fc6796d2a Add negate_iife option to the code generator.
See discussion in a9511dfbe5
2013-05-22 21:22:14 +03:00
Mihai Bazon
9fc8a52142 Set "global" on undeclared SymbolDef-s 2013-05-22 13:08:19 +03:00
Mihai Bazon
22a038e6a2 Fix output of statement: new function(){...};
Close #209
2013-05-20 08:27:37 +03:00
Mihai Bazon
ca3388cf5a Add --expr, an option to parse a single expression (suitable for JSON) 2013-05-15 13:27:23 +03:00
Mihai Bazon
caa8896a8a Only compress code in new Function if all arguments are strings. 2013-05-14 18:36:31 +03:00
Mihai Bazon
f64539fb76 Compress code passed to new Function if it's a constant.
Only for `--unsafe`.

Close #203
2013-05-14 10:47:06 +03:00
Mihai Bazon
d56ebd7d7b Fix a["1_1"]
Close #204
2013-05-14 10:42:34 +03:00
Mihai Bazon
a9511dfbe5 Use the negation hack rather than parens for a toplevel function expression call
(only in !beautify mode)
2013-05-09 08:58:47 +03:00
Mihai Bazon
064e7aa1bb Fix is_assignable
(not likely to be noticed, it's only used in `strict` parse mode)
2013-05-09 08:44:24 +03:00
Mihai Bazon
11e24d53a1 Fix property names
Close #199
2013-05-08 22:37:48 +03:00
Mihai Bazon
a6ed2c84ac Better fix for equality of typeof ... against "undefined" 2013-05-08 16:22:48 +03:00
Justin Lau
a1958aad56 Fixed typeof undefined optimization and updated related test case to
accomodates the sort behaviour changes made in commit
mishoo/UglifyJS2@aebafad41e.
Signed-off-by: Justin Lau <justin@tclau.com>
2013-05-08 16:22:48 +03:00
Justin Lau
9af2bbffde Fixed dot properties not optimizing unicode identifiers. Signed-off-by: Justin Lau <justin@tclau.com> 2013-05-07 14:20:19 +03:00
Justin Lau
1e3bc0caa0 Fixed dot property issue with invlid identifier names.
Signed-off-by: Justin Lau <justin@tclau.com>
2013-05-05 22:27:43 +08:00
Mihai Bazon
9794ebf88c Workaround for missing prefix in UnaryExpression generated by Esprima
See #193
2013-04-29 15:03:52 +03:00
Michael Ficarra
5af144522a fixes #189: use dotted member access when --screw-ie8 option given 2013-04-20 15:11:05 -05:00
Roman Bataev
4b818056cf Fix typeof evaluation for regex and function 2013-04-03 22:34:38 -04:00
Vladimir Zhuravlev
37d7cb8565 Quote objects with numeric keys 2013-03-31 19:52:28 +03:00
Mihai Bazon
a869b854fa Don't use \xYY for identifiers
Fix #173
2013-03-31 13:36:22 +03:00
Andreas Lind Petersen
81f5efe39a Output, to_ascii: Escape non-ascii chars with \xnn instead of \unnnn whenever possible. 2013-03-31 13:36:22 +03:00
Michał Gołębiowski
75f0bbe6e8 renamed --screw-ie to --screw-ie8, documented it in README.md, indicated it doesn't break IE9+ 2013-03-25 17:03:21 +01:00
Jake Harding
478bf4dbdd Add support for enclose option. Closes #139. 2013-03-24 11:11:23 +02:00
Mihai Bazon
e0f67baf2d Don't print the warning on parse error, just throw a JS_Parse_Error.
Fix #159
2013-03-24 00:57:35 +02:00
Mihai Bazon
b14d3df3d2 Keep legit code working even when --screw-ie is not passed.
Previously:

    Without `--screw-ie`, UglifyJS would always leak names of function
    expressions into the containing scope, as if they were function
    declarations.  That was to emulate IE<9 behavior.  Code relying on this
    IE bug would continue to work properly after mangling, although it would
    only work in IE (since other engines don't share the bug).  Sometimes
    this broke legitimage code (see #153 and #155).

    With `--screw-ie` the names would not be leaked into the current scope,
    working properly in legit cases; but still it broke legit code when
    running in IE<9 (see #24).

Currently:

    Regardless of the `--screw-ie` setting, the names will not be leaked.
    Code relying on the IE bug will not work properly after mangling.
    <evil laughter here>

    Without `--screw-ie`: a hack has been added to the mangler to avoid
    using the same name for a function expression and some other variable in
    the same scope.  This keeps legit code working, at the (negligible,
    indeed) cost of one more identifier.

    With `--screw-ie` you allow the mangler to name function expressions
    with the same identifier as another variable in scope.  After mangling
    code might break in IE<9.

Oh man, the commit message is longer than the patch.

Fix #153, #155
2013-03-22 18:04:46 +02:00