Commit Graph

2360 Commits

Author SHA1 Message Date
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
Mihai Bazon
9b1a40dfc3 Support mangling toplevel names
Close #127
2013-03-13 09:44:06 +02:00
Mihai Bazon
e4b078cff7 Disable unsafe by default
Close #147
2013-03-11 00:04:31 +02:00
Mihai Bazon
aebafad41e Fix reordering comparisons
Close #143
2013-03-04 10:06:01 +02:00
Mihai Bazon
26746ce316 Add --screw-ie option
For now the implication is that UglifyJS will not leak a function
expression's name in the surrounding scope (IE < 9 does that).

(ref. mishoo/UglifyJS#485)
2013-03-02 14:28:34 +02:00
Mihai Bazon
dac6efb43d Drop last default: if it's the last branch and empty
Close #141
2013-03-01 13:12:03 +02:00
Mihai Bazon
8880f4824c Compress boolean constants after evaluation
Close #137
2013-03-01 10:26:06 +02:00
Mihai Bazon
3a591c43fe Fix compressing do {...} while (false)
It's not safe to transform it to {...} because the body might contain
`break`.  The solution could be more elaborate (detect if body contains
`break`) but I don't think it's worth the trouble.

Close #129
2013-02-19 18:12:19 +02:00
Mihai Bazon
916faf0a48 Force space after literal regexp when used in "instanceof" or "in"
Close #118
2013-02-06 11:57:59 +02:00
Mihai Bazon
f36e4e9a78 Give up evaluating (unary-prefix '-' 0)
Close #117

------

    JS, WHY YOU SUCK SO BADLY? ;-(
2013-02-06 11:51:09 +02:00
Mihai Bazon
fdf8b5eb71 Fix parens for NaN
Close #116
2013-02-06 11:38:29 +02:00
Mihai Bazon
de7ec7f1b7 Fix parens for negative numbers
Close #115
2013-02-06 11:36:04 +02:00
Mihai Bazon
3c8a0bdff4 Fix parens for AST_New
Close #114
2013-02-06 11:28:49 +02:00
Mihai Bazon
9e8ba27dcd Fix handling of constants
Close #113
2013-02-06 11:15:31 +02:00
Mihai Bazon
719a8fd102 Ugly hack to print comments before return/throw statements
Close #112
2013-02-05 19:11:39 +02:00
Mihai Bazon
a5b209470c Fix end token for Assign nodes 2013-02-01 13:32:15 +02:00
Richard Gibson
522566ea80 Fix #105: property comparison to undefined is not always safe 2013-01-23 23:52:04 -05:00
Mihai Bazon
faa354f5ca [AST_Hole] the print function can be a no-op. 2013-01-17 11:36:10 +02:00
David Glasser
1529ab965a Fix output for arrays containing undefined values.
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.
2013-01-17 11:36:10 +02:00
Mihai Bazon
f0909bdc8f Handle String() with no arguments.
Fix #91
2013-01-17 11:01:38 +02:00
Mihai Bazon
6b14f7c224 Fix handling of labels in nested scopes 2013-01-04 14:17:33 +02:00
Mihai Bazon
83a4ebfedc Implement -m sort=true
close #83
2013-01-02 12:39:00 +02:00
Mihai Bazon
9916d0e547 Accept string or number as name of an accessor.
[not sure I'm happy about this fix]

Reference mishoo/UglifyJS#478
2012-12-22 01:24:04 +02:00
Mihai Bazon
31c4a37e37 Optimize new Array(1, 2, 3) → [1, 2, 3]
Close #74
2012-12-21 21:04:35 +02:00
Mihai Bazon
08219f0cee Fix output when semicolons is off.
(need to force a semicolon for the empty body of an `if`)

Close #72
2012-12-21 11:57:08 +02:00
Mihai Bazon
c4993e1e5c Small cleanup 2012-12-12 11:51:55 +02:00
Mihai Bazon
98978fc827 Add proper parens in "NoIn" expressions.
fix #60.
2012-12-06 12:27:57 +02:00
Mihai Bazon
16430acc1f small improvement on merging assignments into hoisted vars 2012-12-05 13:14:49 +02:00
Mihai Bazon
320c110b33 When hoisting variables, try to merge in assignments that follow. 2012-12-05 12:30:25 +02:00
Mihai Bazon
5cc90db7d0 Don't messup compressor stack while optimizing Switch
Fix #59
2012-11-30 11:16:09 +02:00
Mihai Bazon
13c4dfcabd fix #55 2012-11-24 10:02:08 +02:00
Mihai Bazon
4f555e2232 fix for https://github.com/mishoo/UglifyJS/issues/474 2012-11-23 10:20:00 +02:00
Mihai Bazon
089ac908b7 fix #51 2012-11-18 17:37:45 +02:00
Mihai Bazon
0d3fd2ef30 retain (1,eval) as is when it's the expression of an AST_Call
otherwise we change the meaning of eval from global to lexical.
2012-11-17 12:05:31 +02:00
Richard van Velzen
e98119496a Add support for somewhat preserving line numbers.
Usage: uglifyjs2 -b "beautify=0,preserve_line=1" /path/to/js

ref #46
2012-11-14 15:30:18 +02:00
Mihai Bazon
bdfcbf496b better solution for the last test in constant switch folding 2012-11-14 12:21:43 +02:00
Mihai Bazon
dba8da4800 optimize constant switch blocks
ref. mishoo/UglifyJS#441
2012-11-14 12:06:07 +02:00
Mihai Bazon
60c0f40250 Merge branch 'optimize_concat' of https://github.com/rvanvelzen/UglifyJS2 into rvanvelzen-optimize_concat 2012-11-13 14:38:55 +02:00
Mihai Bazon
e02771a5f2 don't change order in binary expressions if both operands have side effects 2012-11-13 14:32:07 +02:00
Richard van Velzen
f96f796f71 Add simple optimization for empty-string concats.
ref. #43
2012-11-12 15:41:03 +01:00
Mihai Bazon
53355bdb24 fix invalid AST produced by dropping unused variable
close #44
2012-11-12 13:23:57 +02:00
Dan Wolff
b49230ab8d convert x.toString() to ""+x instead of x+""
In some places this can save one byte in whitespace, e.g. after return.
Example:

function f(arg) {
        // return""+arg - no space between return and ""
        return arg.toString();
}
2012-11-11 15:53:34 +02:00
Mihai Bazon
1e5e13ed81 AST_LabelRef no longer inherits from AST_SymbolRef 2012-11-08 15:39:14 +02:00
Mihai Bazon
e312c5c2a7 fix API breakage
close #36, #38
2012-11-08 12:31:28 +02:00
Mihai Bazon
1a5fd3e052 optimization for if/break as first statement in a loop body
for(...; x; ...) if (y) break; → for(...; x&&!y; ...);

similarly for `while` and some combinations (i.e. the `break` appears in the
`else` clause, etc.)
2012-11-08 11:43:14 +02:00
Mihai Bazon
46be3f2bf1 fix another small regression
we do need parens here: `new (foo.bar().baz)`, but not here: `new foo.bar.baz`
2012-11-07 13:31:43 +02:00
Mihai Bazon
80da21dab4 fix regression from 5346fb94 (shouldn't parenthesize i++ in x[i++]) 2012-11-07 13:02:51 +02:00
Mihai Bazon
5276a4a873 add AST_Accessor and AST_SymbolAccessor node types
AST_Accessor will represent the function for a setter or getter.  Since they
are not mangleable, and they should not introduce a name in scope, we have a
new node for their name (AST_SymbolAccessor) which doesn't inherit from
AST_SymbolDeclaration.

fix #37
2012-11-07 12:43:27 +02:00
Mihai Bazon
a1ae0c8609 parenthesize property access when it's the expression in New
refs #35
2012-11-07 12:26:33 +02:00
Mihai Bazon
a90c1aeafe further fix for parens around New (refs #35) 2012-11-07 11:49:06 +02:00
Mihai Bazon
ff388a8d2d parenthesize a Call expression when its parent is New
fix #35
2012-11-07 11:36:15 +02:00
Mihai Bazon
5346fb94bb add proper parens around unary expressions
fix #34
2012-11-07 11:23:50 +02:00
Mihai Bazon
a4f6d46118 add option to mangle names even if eval/with is in use
(for more fair comparison to Closure compiler)
2012-11-06 18:19:51 +02:00
Mihai Bazon
ffccb233e5 convert while into for 2012-11-05 16:01:20 +02:00
Mihai Bazon
fba0c1aafe minor 2012-11-05 16:01:09 +02:00
Mihai Bazon
774f2ded94 minor optimization
for `==` or `!=` against a constant, prefer to display the constant first.
should help a bit after gzip, i.e.:

    typeof foo=="undefined"
    ^^^^^^    ^^^^^^^^^^^^^

vs:

    "undefined"==typeof foo
    ^^^^^^^^^^^^^^^^^^^     (longer sequence that could repeat)

idea stolen from closure.
2012-11-05 13:13:06 +02:00
Mihai Bazon
85af942d64 print final semicolon
close #28
2012-11-05 13:09:39 +02:00
Mihai Bazon
8413787efc use a Dictionary object instead of plain object for hashes
to mitigate the `__proto__` issue

related to #30
2012-11-02 10:58:45 +02:00
Mihai Bazon
cf409800be it's safe to negate expression in !EXP only in boolean context
#kendo
2012-11-01 15:49:05 +02:00
Mihai Bazon
18270dd9f3 added unsafe_comps for negating <= with >
since it has the potential to break code, let's keep it disabled by default
2012-11-01 15:14:56 +02:00
Mihai Bazon
d4c25c571b fix compressing UnaryPrefix
only try negating the expression if the operator is `!`

#kendo
2012-11-01 13:35:08 +02:00
Mihai Bazon
abe0ebbf02 don't move expressions containing the binary in operator into the for initializer
(opera can't parse it)

close #25
2012-10-30 14:50:47 +02:00
Mihai Bazon
cb3cafa14d cripple scope to make IE happy :-(
close #24
2012-10-25 18:52:35 +03:00
Mihai Bazon
70fd2b1f33 fix for if (...) return; else return ...;
(it was assumed that the first `return` always contains a value)

close #22
2012-10-24 09:33:32 +03:00
Mihai Bazon
30faaf13ed more sequence optimizations (lift some sequences above binary/unary expressions so that we can avoid parens) 2012-10-22 11:58:06 +03:00
Mihai Bazon
fc8314e810 minor fix for dropping unused definitions.
function f(x, y) {
        var g = function() { return h() };
        var h = function() { return g() };
        return x + y;
    }

now compresses to `function f(x, y) { return x + y }`
2012-10-19 12:57:29 +03:00
Mihai Bazon
afb7faa6fa more optimizations for some break/continue cases 2012-10-18 15:14:57 +03:00
Mihai Bazon
253bd8559b more small optimizations
(unlikely to help for hand-written code)
2012-10-17 21:57:08 +03:00
Mihai Bazon
6a099fba66 define aborts on AST_If: true if both branches abort 2012-10-17 16:17:14 +03:00
Mihai Bazon
a21f3c6cdd employ a better parser for command-line arguments
to support passing commas in strings in for example:

    uglifyjs2 -cd TEST="'a,b'" <<EOF
    console.log(TEST);
    EOF

    → console.log("a,b")

close #14
2012-10-17 15:56:45 +03:00
Mihai Bazon
8f66458598 the sort option is broken anyway, removed it
we need to mangle names from outermost to innermost scope; mangling names
from inner scopes before we got to the outer scope won't work correctly,
therefore sorting doesn't make sense.
2012-10-17 15:24:47 +03:00
Mihai Bazon
6472f9410e add semicolons option in the code generator (default: true)
pass `false` to separate statements with newlines instead of semicolons
2012-10-17 14:52:08 +03:00
Mihai Bazon
8957b3a694 fix small glitches in source map generation 2012-10-16 15:54:12 +03:00
Mihai Bazon
fcc0229087 drop unused function arguments
also add test for "drop_unused" (the last one fails for now)
2012-10-13 15:04:44 +03:00
Mihai Bazon
b071c9d079 add parens to AST_Seq whose parent is AST_Unary 2012-10-13 14:32:08 +03:00
Mihai Bazon
851b48e4a3 fix compressing benchmark.js (it tried to evaluate a statement)
the following code in benchmark.js triggered the issue:

    support.decompilation = Function(
      'return (' + (function(x) { return { 'x': '' + (1 + x) + '', 'y': 0 }; }) + ')'
    )()(0).x === '1';

technically that could be resolved into a constant expression, but seems
it's being used here for browser bugs detection :-\
2012-10-13 12:57:10 +03:00
Mihai Bazon
708abb1ab1 minor 2012-10-13 12:42:01 +03:00
Mihai Bazon
370d3e0917 fix regression from fb5c01c073
is_digit takes a char code now, not a string
2012-10-13 12:24:27 +03:00
Mihai Bazon
b51fe0dcc3 fix end tokens in spidermonkey ast import 2012-10-13 11:37:58 +03:00
Mihai Bazon
8149be551e minor 2012-10-12 14:55:54 +03:00
Mihai Bazon
1b6f8d463f remove the $self hack
operations are destructive anyway, so there's no point to clone the nodes in
the transformer.  speed++
2012-10-12 11:07:35 +03:00
Mihai Bazon
72cb5328ee fix in_boolean_context() (two tests were broken) 2012-10-12 10:49:41 +03:00
Mihai Bazon
fc39553714 use AST_Lambda for object setters/getters
so that the optimization that drops the name if unused doesn't apply.
close #12
2012-10-12 10:11:01 +03:00
Mihai Bazon
d9d67317b1 fix pos in syntax error exception 2012-10-11 15:25:38 +03:00
Mihai Bazon
fb5c01c073 stealing more hacks from acorn in the name of speed 2012-10-11 15:17:42 +03:00
Mihai Bazon
f4584af42c using makeComparator from acorn to generate functions that tests whether a
string is keyword, reserved etc.

speeds up the parser a bit, though not spectacular.. still far from acorn.
2012-10-11 11:52:05 +03:00
Mihai Bazon
172aa7a93c cleanup
- use prototype-less objects where feasible (minor speed improvement)
- get rid of HOP
2012-10-11 11:07:42 +03:00
Mihai Bazon
5053a29bc0 fix propagation of symbol references 2012-10-11 10:28:48 +03:00
Mihai Bazon
9cdaed9860 fix node name 2012-10-10 23:16:40 +03:00
Mihai Bazon
dacce1b1fa seems cleaner if AST_Label doesn't inherit from AST_SymbolDeclaration 2012-10-10 11:37:51 +03:00
Mihai Bazon
f26f3b44bc small improvements in wrap_commonjs:
- use MAP.splice instead of a BlockStatement to inject code (avoids some
  warnings in the linter)
- use the original symbol in exports, so that we get the proper source mapping
2012-10-10 11:28:05 +03:00
Mihai Bazon
c5ecbfc756 drop unused variable 2012-10-10 11:27:06 +03:00
Mihai Bazon
3799ac8973 add --lint and display {file} in scope_warnings 2012-10-10 11:26:59 +03:00
Mihai Bazon
86182afa7f minor 2012-10-09 22:56:59 +03:00
Mihai Bazon
a84d07e312 add AST_Infinity node 2012-10-09 18:35:53 +03:00
Mihai Bazon
88beddfa91 make --comments keep @cc_on too 2012-10-09 18:25:00 +03:00
Mihai Bazon
1b0aab2ce9 added $propdoc to AST nodes and some cleanups
hopefully we can make the AST documentation self-generating
2012-10-09 18:20:39 +03:00
Mihai Bazon
9ead49641d minor AST cleanup (AST_BlockStatement may inherit from AST_Block) 2012-10-09 13:59:17 +03:00
Mihai Bazon
e1862cd36f add --ast-help
displays a rather cruel description of the AST classes, derived
directly from the node definitions.
2012-10-09 13:21:21 +03:00
Mihai Bazon
2c025f23db fix detecting symbols in use 2012-10-09 13:13:55 +03:00
Mihai Bazon
d4970b35ac should not expose base54.sort() in the API docs, I think 2012-10-08 13:37:27 +03:00
Mihai Bazon
dd8286bce1 added --self to easily get a browser-runnable version of UglifyJS 2012-10-08 12:55:18 +03:00
Mihai Bazon
093a9031dc eliminate redundant directives in the same scope 2012-10-08 12:53:17 +03:00
Mihai Bazon
80a18fe2fa for certain nodes that we invent we might not have a original source file to
map from, so just use "?".  and in any case, don't fail hard when addMapping throws.
2012-10-08 12:52:25 +03:00
Mihai Bazon
455ac5435d remove unused code 2012-10-05 22:59:05 +03:00
Mihai Bazon
4a2b91220a minor 2012-10-05 20:24:56 +03:00
Mihai Bazon
a1e0885930 replace (function(){ ...no side effects ... })() with undefined. 2012-10-05 16:51:16 +03:00
Mihai Bazon
7ae09120ed prevent mangling only when eval is *called*, not when it's just referenced 2012-10-05 16:17:31 +03:00
Mihai Bazon
ecd9f21467 fixed import of locations from SpiderMonkey AST 2012-10-05 15:05:06 +03:00
Mihai Bazon
a9b6f9909a use the appropriate constructor for symbols 2012-10-04 17:28:35 +03:00
Mihai Bazon
708ec0467c minor 2012-10-04 17:28:09 +03:00
Mihai Bazon
682a58a1f5 removed some unused variables 2012-10-04 08:49:18 +03:00
Mihai Bazon
f20c251882 moving code around 2012-10-03 21:39:47 +03:00
Mihai Bazon
2bd8a118c2 define AST_Node.from_mozilla_ast(ast)
returns an UglifyJS2 AST given a Mozilla AST.  Still needs some work to do
(need to create specific nodes like AST_SymbolRef, AST_SymbolLambda
etc. instead of base AST_Symbol, in order for the mangler/compressor to work
properly)
2012-10-03 20:03:17 +03:00
Mihai Bazon
11863d6f9a more cleanup (dropped AST_SwitchBlock) 2012-10-03 15:52:31 +03:00
Mihai Bazon
3412498795 AST cleanup (dropped AST_StatementBase) 2012-10-03 15:41:11 +03:00
Mihai Bazon
c11de17e99 added option for side-effect-free statements, fix test 2012-10-03 13:08:03 +03:00
Mihai Bazon
e0f5075e45 fix endless loop in tests 2012-10-03 12:49:47 +03:00
Mihai Bazon
0678ae2076 fix for a = !b && !c && !d && !e → a=!(b||c||d||e) 2012-10-03 11:34:05 +03:00
Mihai Bazon
378ed17809 disable hoist_vars by default and change comparations to comparisons 2012-10-03 11:27:05 +03:00
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