Add `--screw-ie` option
authorMihai Bazon <mihai@bazon.net>
Sat, 2 Mar 2013 12:28:34 +0000 (14:28 +0200)
committerMihai Bazon <mihai@bazon.net>
Sat, 2 Mar 2013 12:28:34 +0000 (14:28 +0200)
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)

bin/uglifyjs
lib/scope.js

index dc9a451..9d2eedc 100755 (executable)
@@ -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);
         }
index f23f6eb..100a4db 100644 (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,13 +124,15 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(){
             node.init_scope_vars();
         }
         if (node instanceof AST_SymbolLambda) {
-            //scope.def_function(node);
-            //
-            // 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);
+            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