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)
This commit is contained in:
Mihai Bazon
2013-03-02 14:28:34 +02:00
parent dac6efb43d
commit 26746ce316
2 changed files with 17 additions and 10 deletions

View File

@@ -21,6 +21,7 @@ mangling you need to use `-c` and `-m`.\
.describe("source-map-root", "The path to the original source to be included in the source map.")
.describe("source-map-url", "The path to the source map to be added in //@ sourceMappingURL. Defaults to the value passed with --source-map.")
.describe("in-source-map", "Input source map, useful if you're compressing JS that was generated from some other original code.")
.describe("screw-ie", "Pass this flag if you don't care about full compliance with Internet Explorer quirks (by default UglifyJS will try to be IE-proof).")
.describe("p", "Skip prefix for original filenames that appear in source maps. \
For example -p 3 will drop 3 directories from file names and ensure they are relative paths.")
.describe("o", "Output file (default STDOUT).")
@@ -71,6 +72,7 @@ You need to pass an argument to this option to specify the name that your module
.string("d")
.string("comments")
.string("wrap")
.boolean("screw-ie")
.boolean("export-all")
.boolean("self")
.boolean("v")
@@ -246,7 +248,7 @@ var SCOPE_IS_NEEDED = COMPRESS || MANGLE || ARGS.lint;
if (SCOPE_IS_NEEDED) {
time_it("scope", function(){
TOPLEVEL.figure_out_scope();
TOPLEVEL.figure_out_scope({ screw_ie: ARGS.screw_ie });
if (ARGS.lint) {
TOPLEVEL.scope_warnings();
}
@@ -261,7 +263,7 @@ if (COMPRESS) {
if (SCOPE_IS_NEEDED) {
time_it("scope", function(){
TOPLEVEL.figure_out_scope();
TOPLEVEL.figure_out_scope({ screw_ie: ARGS.screw_ie });
if (MANGLE) {
TOPLEVEL.compute_char_frequency(MANGLE);
}

View File

@@ -67,7 +67,10 @@ SymbolDef.prototype = {
}
};
AST_Toplevel.DEFMETHOD("figure_out_scope", function(){
AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
options = defaults(options, {
screw_ie: false
});
// This does what ast_add_scope did in UglifyJS v1.
//
// Part of it could be done at parse time, but it would complicate
@@ -121,14 +124,16 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(){
node.init_scope_vars();
}
if (node instanceof AST_SymbolLambda) {
//scope.def_function(node);
//
if (options.screw_ie) {
scope.def_function(node);
} else {
// https://github.com/mishoo/UglifyJS2/issues/24 — MSIE
// leaks function expression names into the containing
// scope. Don't like this fix but seems we can't do any
// better. IE: please die. Please!
(node.scope = scope.parent_scope).def_function(node);
}
}
else if (node instanceof AST_SymbolDefun) {
// Careful here, the scope where this should be defined is
// the parent scope. The reason is that we enter a new