Fix handling of "use asm" when no command line flags are passed to uglifyjs. SCOPE_IS...
authorkzc <zaxxon2011@gmail.com>
Wed, 7 Oct 2015 17:10:53 +0000 (13:10 -0400)
committerkzc <zaxxon2011@gmail.com>
Wed, 7 Oct 2015 17:10:53 +0000 (13:10 -0400)
bin/uglifyjs
lib/ast.js
lib/output.js
lib/parse.js

index 00342b8..eb970c6 100755 (executable)
@@ -401,7 +401,7 @@ async.eachLimit(files, 1, function (file, cb) {
         writeNameCache("props", cache);
     })();
 
-    var SCOPE_IS_NEEDED = COMPRESS || MANGLE || BEAUTIFY || ARGS.lint;
+    var SCOPE_IS_NEEDED = true;
     var TL_CACHE = readNameCache("vars");
 
     if (SCOPE_IS_NEEDED) {
index c5ec816..e795284 100644 (file)
@@ -864,10 +864,11 @@ var AST_String = DEFNODE("String", "value quote", {
     }
 }, AST_Constant);
 
-var AST_Number = DEFNODE("Number", "value", {
+var AST_Number = DEFNODE("Number", "value literal", {
     $documentation: "A number literal",
     $propdoc: {
-        value: "[number] the numeric value"
+        value: "[number] the numeric value",
+        literal: "[string] numeric value as string (optional)"
     }
 }, AST_Constant);
 
index 06c1e42..c15f3b2 100644 (file)
@@ -1158,8 +1158,10 @@ function OutputStream(options) {
         output.print_string(self.getValue(), self.quote);
     });
     DEFPRINT(AST_Number, function(self, output){
-        if (self.value_string !== undefined && self.scope && self.scope.has_directive('use asm')) {
-            output.print(self.value_string);
+        if (self.literal !== undefined
+            && +self.literal === self.value  /* paranoid check */
+            && self.scope && self.scope.has_directive('use asm')) {
+            output.print(self.literal);
         } else {
             output.print(make_num(self.getValue()));
         }
index 830b522..1ab0358 100644 (file)
@@ -335,7 +335,11 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
         if (prefix) num = prefix + num;
         var valid = parse_js_number(num);
         if (!isNaN(valid)) {
-            return token("num", valid);
+            var tok = token("num", valid);
+            if (num.indexOf('.') >= 0) {
+                tok.literal = num;
+            }
+            return tok;
         } else {
             parse_error("Invalid syntax: " + num);
         }
@@ -1148,10 +1152,7 @@ function parse($TEXT, options) {
             ret = _make_symbol(AST_SymbolRef);
             break;
           case "num":
-            ret = new AST_Number({ start: tok, end: tok, value: tok.value });
-            var value_string = $TEXT.substring(tok.pos, tok.endpos);
-            if (value_string.indexOf('.') >= 0)
-                ret.value_string = value_string;
+            ret = new AST_Number({ start: tok, end: tok, value: tok.value, literal: tok.literal });
             break;
           case "string":
             ret = new AST_String({