Mihai Bazon
815abcfe18
support for --comments option to keep comments containing @license or @preserve
2012-10-02 16:40:42 +03:00
Mihai Bazon
075f93ec0d
line numbers start at 1
2012-10-02 16:39:53 +03:00
Mihai Bazon
2a5456260e
added option to keep some comments in the output
2012-10-02 14:32:30 +03:00
Mihai Bazon
36be211e99
option to exclude certain names from mangling
2012-10-02 14:02:33 +03:00
Mihai Bazon
dde5b22b5e
support defines
2012-10-02 13:20:07 +03:00
Mihai Bazon
e1098b04a7
"use strict";
2012-10-02 12:45:58 +03:00
Mihai Bazon
211792757c
more constant folding (for names defined with const)
2012-10-02 12:45:17 +03:00
Mihai Bazon
347160c631
add AST_SymbolConst for names defined with const
2012-10-02 12:22:39 +03:00
Mihai Bazon
ff696cd7bc
drop more unused names
2012-10-02 12:02:33 +03:00
Mihai Bazon
9e5dd81f1e
a shy attempt to obey width in the beautifier; added bracketize option to always print brackets around if/do/while/for statements; export more options via the CLI
2012-10-02 11:22:38 +03:00
Mihai Bazon
896444482a
minor
2012-09-28 11:12:47 +03:00
Mihai Bazon
05e15b1c0c
fix mangling
...
(bug in our code prevented the mangler from using a name that was in use
prior to mangling but not after it)
2012-09-27 00:01:16 +03:00
Mihai Bazon
13278c6649
removed the "squeeze" method (it's now effectively "transform")
2012-09-26 19:52:32 +03:00
Mihai Bazon
15d58f5917
some speedup and more savings from unused vars that have side effects in initialization
2012-09-26 19:05:49 +03:00
Mihai Bazon
78be8f5296
compressor successfully moved to TreeTransformer
2012-09-26 14:27:01 +03:00
Mihai Bazon
a24e7ee976
checkpoint (refactoring, WIP)
2012-09-26 12:16:16 +03:00
Mihai Bazon
242dd10131
more cleanups
2012-09-25 20:39:15 +03:00
Mihai Bazon
9321d418bc
moving code around (refactoring, WIP)
2012-09-25 15:59:27 +03:00
Mihai Bazon
10c7f52074
discard all \uFEFF characters ( https://github.com/mishoo/UglifyJS/issues/462 )
2012-09-25 15:30:59 +03:00
Mihai Bazon
4201577dd7
started some refactoring (WIP) -- moving squeezer to TreeTransformer
2012-09-25 15:15:47 +03:00
Mihai Bazon
e836e2ae5f
minor
2012-09-25 12:48:36 +03:00
Mihai Bazon
ea6d1ea701
it's not safe to assume that property access is side-effect-free
...
(getters/setters + various browser bugs will trigger side effects; also, an
exception is thrown when the expression is undefined)
2012-09-25 10:32:14 +03:00
Mihai Bazon
368ac8f93c
some boolean cleanup
2012-09-25 10:31:03 +03:00
Mihai Bazon
42038fd67f
Support input source map
...
This is useful while compressing generated code; for example compressing JS
compiled by CoffeeScript (assuming you got a source map):
uglifyjs2 --in-source-map generated.js.map \
--source-map uglified.js.map \
-o uglified.js
The above assumes you have a "generated.js.map" file which is the source
mapping between your CoffeeScript and the generated.js (compiled output from
CoffeeScript). The name of the input file is not present in this example;
it will be fetched from the source map (but it can be passed manually too).
The output will be in "uglified.js" and the output map "uglified.js.map"
will actually map to the original CoffeeScript code, rather than to
generated.js.
2012-09-24 17:02:18 +03:00
Mihai Bazon
a83b28503f
properly drop mutually-referring declarations that are not otherwise
...
referenced and have no side effects
2012-09-23 12:47:34 +03:00
Mihai Bazon
76d88b59dc
tree transformer api (WIP)
2012-09-22 19:41:09 +03:00
Mihai Bazon
ec7f895b54
log filename in parse errors / compressor warnings
2012-09-21 14:44:25 +03:00
Mihai Bazon
5491e1d7b1
better support for multiple input files:
...
- use a single AST_Toplevel node for all files
- keep original source filename in the tokens
2012-09-21 14:19:05 +03:00
Mihai Bazon
c4f8c2103f
more on detecting side effects
2012-09-21 11:23:44 +03:00
Mihai Bazon
e8da72d304
drop unused variables
2012-09-19 12:27:38 +03:00
Mihai Bazon
a4d2340c73
fixed label scope/mangling
2012-09-18 19:26:46 +03:00
Mihai Bazon
669874d46b
minor
2012-09-18 14:17:23 +03:00
Mihai Bazon
3da0ac4897
support for directives
2012-09-18 13:21:09 +03:00
Mihai Bazon
21968285e8
added AST_NaN (output as 0/0)
2012-09-18 10:53:46 +03:00
Mihai Bazon
d91613b4a8
only do the typeof x == "undefined" optimization if x is a symbol reference and it's declared in scope, or x is not a symbol reference.
2012-09-17 20:02:57 +03:00
Mihai Bazon
ee669ba878
moved typeof foo == "undefined" ==> foo === undefined under --unsafe
...
because 43fd45154b (commitcomment-1864505)
2012-09-17 18:49:52 +03:00
Mihai Bazon
e370e3b5a4
fix .undeclared (it's now a function)
2012-09-17 15:06:06 +03:00
Mihai Bazon
6ad414ef28
minor
2012-09-17 14:33:36 +03:00
Mihai Bazon
92e22c460d
possible optimization for AST_Undefined
...
if undefined is defined, ;-), we replace AST_Undefined nodes to a reference
to the "undefined" variable; in turn the mangler will compress it to a
single letter; this helps at least on jQuery.
2012-09-17 12:27:32 +03:00
Mihai Bazon
14481de0e9
empty block to empty statement: {} ==> ;
2012-09-17 12:03:02 +03:00
Mihai Bazon
07f1d56f69
more smallish optimizations
2012-09-17 11:50:35 +03:00
Mihai Bazon
5e60a60b3b
try negating AST_Binary
2012-09-17 11:16:44 +03:00
Mihai Bazon
5d781ec6f8
some cleanup
2012-09-16 18:10:54 +03:00
Mihai Bazon
0f418d654e
more sequencesizing (WIP)
2012-09-16 16:29:17 +03:00
Mihai Bazon
21c34a1792
drop unused function
2012-09-16 15:46:47 +03:00
Mihai Bazon
7b6a402916
rewrite handle_if_return
...
optimizations of if/return/continue seem to be even better now
2012-09-16 15:46:20 +03:00
Mihai Bazon
397bf56d25
other small optimization:
...
if (foo) continue;
...body...
==>
if (!foo) { ...body ... }
Only when the parent block is the target loop of the `continue` statement.
2012-09-15 16:10:35 +03:00
Mihai Bazon
4e0262bdfb
figure out label targets
2012-09-15 16:05:17 +03:00
Mihai Bazon
86c14d0988
join_vars:
...
var XXX;
for (var YYY; ...)
==>
for (var XXX,YYY; ...)
2012-09-15 10:54:59 +03:00
Mihai Bazon
43fd45154b
compress typeof x == "undefined" to x === undefined, which further gets
...
shortened to x === void 0 (or x === [][0] in unsafe mode)
2012-09-14 19:56:59 +03:00
Mihai Bazon
50d1670e42
minor
...
when unsafe, compress undefined as [][0]
2012-09-14 19:04:18 +03:00
Mihai Bazon
5e83e7ec17
adding an imaginary "return undefined" can sometimes help
...
function f() {
if (foo) return x();
if (!bar) return y();
}
==>
function f() {
return foo ? x() : bar ? void 0 : y();
}
2012-09-14 16:26:30 +03:00
Mihai Bazon
924aa58060
more optimizations that v1 does and some cleanups
...
- a = a + x ==> a+=x
- joining consecutive var statements (hoisting is not always desirable)
- x == false ==> x == 0, x != true ==> x != 1
- x, x ==> x; x = exp(), x ==> x = exp()
- discarding useless break-s
2012-09-14 15:36:38 +03:00
Mihai Bazon
d72c1d1293
few more optimizations:
...
- do multiple passes in tighten_body if it was changed
- transform if (foo) return x; return y; ==> return foo?x:y
- don't optimize !0 as true (use best_of after evaluation of constant expr)
With hoist_vars off we now beat UglifyJS v1 on jQuery-1.8.1
2012-09-13 15:20:57 +03:00
Mihai Bazon
f5027ec1fc
minor
2012-09-12 16:29:20 +03:00
Mihai Bazon
a132841fb9
more AST_If optimizations
2012-09-12 16:10:03 +03:00
Mihai Bazon
2b1e4628e0
side effect fixes and small optimization for gzip
...
prefer to always use > and >= operators (idea from Closure)
2012-09-12 13:41:46 +03:00
Mihai Bazon
2b4093ba83
fixed run-tests and an issue about reversing the condition in AST_If
2012-09-12 13:00:13 +03:00
Mihai Bazon
9a629abe00
minor
2012-09-11 18:37:08 +03:00
Mihai Bazon
8e82d8d94c
fixed some mess with symbols/scope
...
- all symbols now have a `thedef` property which is a SymbolDef object,
instead of the `uniq` that we had before (pointing to the first occurrence
of the name as declaration).
- for undeclared symbols we still create a SymbolDef object in the toplevel
scope but mark it "undeclared"
- we can now call figure_out_scope after squeezing, which is useful in order
not to mangle names that were dropped by the squeezer
2012-09-11 15:42:28 +03:00
Mihai Bazon
da407d46c6
checkpoint
...
- discard statements with no side effects (unsafe? could be)
- safer hoist_vars (needs some revamping of scope/mangling)
2012-09-11 13:15:55 +03:00
Mihai Bazon
1579c0fb97
hoist_vars is pretty bad, it seems. cancelled it for now.
2012-09-10 22:40:18 +03:00
Mihai Bazon
6b9aeb5325
adaptive base54 digits depending on char frequency (WIP)
2012-09-10 22:29:18 +03:00
Mihai Bazon
a41e6cfabb
more progress on the compressor (WIP)
2012-09-10 16:37:05 +03:00
Mihai Bazon
1c8ba35844
minor
2012-09-08 22:51:59 +03:00
Mihai Bazon
5a8e6ce735
fix output for division followed by regexp
...
( v1 report: https://github.com/mishoo/UglifyJS/pull/458 )
2012-09-08 15:38:58 +03:00
Mihai Bazon
43c75c9248
checkpoint
2012-09-07 18:55:13 +03:00
Mihai Bazon
048d6906ae
fix bug (forgot arg name)
2012-09-07 16:02:08 +03:00
Mihai Bazon
919b2733ab
always keep declarations found in unreachable code
...
a few more tests and some cleanups.
2012-09-07 15:18:32 +03:00
Mihai Bazon
b77574ea1c
fixed tests (need to drop the toplevel block in "expected" if it's a single statement)
2012-09-07 11:22:01 +03:00
Mihai Bazon
9bb1a84d6b
don't duplicate argument names
2012-09-05 18:19:30 +03:00
Mihai Bazon
c7b484b64f
fix for variable names like toString
2012-09-05 14:31:05 +03:00
Mihai Bazon
0503513dcc
support for hoisting declarations
...
and finally it seems we beat v1 in terms of compression
2012-09-05 13:43:34 +03:00
Mihai Bazon
8633b0073f
cleaned up usage of AST_BlockStatement
...
The following nodes were instances of AST_BlockStatement: AST_Scope,
AST_SwitchBlock, AST_SwitchBranch. Also, AST_Try, AST_Catch, AST_Finally
were having a body instanceof AST_BlockStatement.
Overloading the meaning of AST_BlockStatement this way turned out to be a
mess; we now have an AST_Block class that is the base class for things
having a block of statements (might or might not be bracketed). The
`this.body` of AST_Scope, AST_Try, AST_Catch, AST_Finally is now an array of
statements (as they inherit from AST_Block).
Avoiding calling superclass's _walk function in walkers (turns out we walked
a node multiple times).
2012-09-05 11:39:43 +03:00
Mihai Bazon
1b5183dd5e
checkpoint
2012-09-04 15:36:14 +03:00
Mihai Bazon
376667a818
more fiddling with boolean expressions, etc.
...
optimize away while(false), and transform while(true) ==> for(;;).
UNSAFE:
some expressions are optimized away when we're in boolean context and can
determine that the value will always be true or false. For example:
x() || true ==> always `true` in boolean context
x() && false ==> always `false` in boolean context
It's not technically correct to drop these expressions since we drop the
function call too (that might have side effects); on the other hand, I can't
see any legitimate use for such expressions and they might simply indicate a
bug (we do warn about it).
2012-09-04 13:20:28 +03:00
Mihai Bazon
3459c40cf9
if present, the else in an if should always be forced statement
2012-09-04 13:17:13 +03:00
Mihai Bazon
86cfb5be86
boolean and if/exit optimizations
2012-09-03 23:49:57 +03:00
Mihai Bazon
e5f1cec6aa
minor
2012-09-03 23:25:30 +03:00
Mihai Bazon
37eecc16a4
more optimizations for ifs/conditionals
...
(XXX: should add tests before anything else)
2012-09-03 19:38:45 +03:00
Mihai Bazon
f03138daa8
resolve constant expressions
2012-09-03 15:47:15 +03:00
Mihai Bazon
f702264617
jumps, try and definitions are statements too
2012-09-03 12:39:02 +03:00
Mihai Bazon
6d0db4ce14
an AST_If is too a StatementWithBody
2012-09-03 12:11:44 +03:00
Mihai Bazon
d7c1dc6c05
a LabeledStatement should be in fact a StatementWithBody
...
This fixes output for:
if (foo) {
moo: if (bar) {
break moo;
}
} else {
baz();
}
(the labeled statement must be outputted inside brackets)
2012-09-03 12:05:10 +03:00
Mihai Bazon
66c869c8f6
switch branches must be declared required so that the compressor doesn't
...
replace nodes with a single statement.
looks stable for now, though mess begins to sink in. need to review the AST
hierarchy.
2012-09-03 11:05:59 +03:00
Mihai Bazon
1bf5928b54
Reverting "minor perf. improvements"
...
Revert "minor perf. improvements"
This reverts commit 24bfd55a22 .
broke the parser somehow; too early to optimize, let's get the other stuff running.
2012-09-03 10:26:23 +03:00
Mihai Bazon
f2f370cee3
add source mappings for more node types; started CLI utility
2012-09-02 14:32:00 +03:00
Mihai Bazon
24bfd55a22
minor perf. improvements
2012-09-02 11:11:39 +03:00
Mihai Bazon
52bcca288f
started support for generating source maps (WIP)
...
plugged in @fitzgen's source-map library
2012-08-29 19:39:19 +03:00
Mihai Bazon
48440dc250
don't mangle names of setters/getters
2012-08-29 19:26:48 +03:00
Mihai Bazon
86cff2029f
docstring for AST_StatementWithBody
2012-08-28 15:39:53 +03:00
Mihai Bazon
1b6bcca717
fix output for arrays containing undefined values
...
[1,,2,] ==> [1,,2] instead of [1,undefined,2]
2012-08-28 15:38:35 +03:00
Mihai Bazon
7fcb6bcb12
fix code generator for this case:
...
if (foo) {
with (bar)
if (baz)
x();
} else y();
(the compressor removes the brackets since the consequent consists of a
single statement, but the codegen must include the brackets because
otherwise the `else` would refer to the inner `if`)
2012-08-28 15:29:58 +03:00
Mihai Bazon
58a3b5e93f
update (c) years
2012-08-27 11:01:41 +03:00
Mihai Bazon
4437e7af19
fix compressing a,b; return c; into return a,b,c;
2012-08-27 11:00:22 +03:00
Mihai Bazon
a8e49f1536
added print_to_string helper method
2012-08-27 10:59:33 +03:00
Mihai Bazon
8d233c38d4
fix current_col and force a newline every 32K (support options.max_line_len)
2012-08-23 10:39:33 +03:00
Mihai Bazon
95b18e54a4
added license
2012-08-22 21:28:59 +03:00
Mihai Bazon
159a6f048c
wrote more of the compressor and added some tests
2012-08-22 15:21:58 +03:00
Mihai Bazon
f53e139d3c
fix output for certain edge cases
...
the statements if, for, do, while and with might have an AST_EmptyStatement
as body; if that's the case, we need to make sure that the semicolon gets in
the output.
2012-08-22 13:20:05 +03:00
Mihai Bazon
fb8c9e3a48
declare some properties in the node constructor so that they're copied in clone
2012-08-22 00:01:55 +03:00
Mihai Bazon
1b839eb35b
hint that brackets may be required in AST_BlockStatement
2012-08-21 19:16:05 +03:00
Mihai Bazon
ffe58a9961
cleaned up some mess and started the actual compressor
2012-08-21 16:14:43 +03:00
Mihai Bazon
7ae1c600a2
some reorganization
...
(moved pretty much everything that relates to scope in scope.js, added a
module for NodeJS that can be used with require() and exports everything.)
2012-08-21 13:53:16 +03:00
Mihai Bazon
92bd53b513
handle labels properly
...
(they can't be handled the same way as variables in a scope)
2012-08-21 12:45:06 +03:00
Mihai Bazon
159333f4c5
warn about unreferenced symbols
2012-08-21 12:07:34 +03:00
Mihai Bazon
99456c6156
more fixes:
...
- added walker for AST_ObjectProperty
- handle redefinitions properly (only mangle one symbol, make them all point
to a single definition)
DynarchLIB seems to run fine after mangling + compressed output.
2012-08-21 11:38:49 +03:00
Mihai Bazon
458e251d7e
added mangler and other stuff
2012-08-20 17:32:35 +03:00
Mihai Bazon
1fe0ff9fff
doc (WIP)
2012-08-20 00:35:54 +03:00
Mihai Bazon
6c35135ace
simple visitor API and code to figure out scope and references
2012-08-19 15:57:50 +03:00
Mihai Bazon
4488758d48
some fixes (need testing) in AST_If codegen
2012-08-18 12:29:57 +03:00
Mihai Bazon
cd8ae5f712
minor whitespace issues
2012-08-17 23:08:09 +03:00
Mihai Bazon
ef87c9fd8f
big speed improvement (observable when beautify = false)
...
who would have thought that str.charAt(str.length - 1) is not a constant,
instant operation? seems to get slower and slower as the string grows.
0.6s vs. 3s
2012-08-17 19:04:23 +03:00
Mihai Bazon
901f77047e
don't output both space and semicolon when beautify=false
2012-08-17 18:33:26 +03:00
Mihai Bazon
07cbc8d3af
added some comments about the rules governing parens
2012-08-17 18:06:29 +03:00
Mihai Bazon
4fb6021b0b
fix one more glitch
2012-08-17 16:27:43 +03:00
Mihai Bazon
13f7b119bb
code generator finally seems to work properly
2012-08-17 15:59:42 +03:00
Mihai Bazon
c7c163b82e
lots'o'fixes in the output routines; still a looong way to go.
2012-08-16 21:36:16 +03:00
Mihai Bazon
7f273c3b89
codegen and dropped the useless walker
2012-08-16 18:11:04 +03:00
Mihai Bazon
c0ba9e2986
WIP
2012-08-15 14:50:27 +03:00
Mihai Bazon
861e26a666
WIP
2012-06-03 23:10:31 +03:00
Mihai Bazon
22bb5e8306
added small node test script
2012-05-27 14:36:51 +03:00
Mihai Bazon
46e7507b44
Fixes some gotchas.
...
DynarchLIB (660K) now passes parsing in 440ms (about 30% slower than the
parser in UglifyJS v1).
2012-05-27 14:36:44 +03:00
Mihai Bazon
562b12f021
init repo
2012-05-27 14:13:26 +03:00