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