Legacy octal integer strict mode fixes
authorAnthony Van de Gejuchte <anthonyvdgent@gmail.com>
Thu, 21 Jul 2016 01:19:24 +0000 (03:19 +0200)
committerAnthony Van de Gejuchte <anthonyvdgent@gmail.com>
Thu, 21 Jul 2016 12:42:16 +0000 (14:42 +0200)
lib/parse.js
test/mocha/number-literal.js [new file with mode: 0644]
test/mocha/string-literal.js

index bd6f95f..ec82d47 100644 (file)
@@ -349,6 +349,9 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
             return is_alphanumeric_char(code);
         });
         if (prefix) num = prefix + num;
+        if (RE_OCT_NUMBER.test(num) && next_token.has_directive("use strict")) {
+            parse_error("SyntaxError: Legacy octal literals are not allowed in strict mode");
+        }
         var valid = parse_js_number(num);
         if (!isNaN(valid)) {
             return token("num", valid);
@@ -392,7 +395,7 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
         // Parse
         if (ch === "0") return "\0";
         if (ch.length > 0 && next_token.has_directive("use strict"))
-            parse_error("SyntaxError: Octal literals are not allowed in strict mode");
+            parse_error("SyntaxError: Legacy octal escape sequences are not allowed in strict mode");
         return String.fromCharCode(parseInt(ch, 8));
     }
 
diff --git a/test/mocha/number-literal.js b/test/mocha/number-literal.js
new file mode 100644 (file)
index 0000000..8e05574
--- /dev/null
@@ -0,0 +1,24 @@
+var assert = require("assert");
+var uglify = require("../../");
+
+describe("Number literals", function () {
+    it("Should not allow legacy octal literals in strict mode", function() {
+        var inputs = [
+            '"use strict";00;',
+            '"use strict"; var foo = 00;'
+        ];
+
+        var test = function(input) {
+            return function() {
+                uglify.parse(input);
+            }
+        }
+        var error = function(e) {
+            return e instanceof uglify.JS_Parse_Error &&
+                e.message === "SyntaxError: Legacy octal literals are not allowed in strict mode";
+        }
+        for (var i = 0; i < inputs.length; i++) {
+            assert.throws(test(inputs[i]), error, inputs[i]);
+        }
+    });
+});
\ No newline at end of file
index fc4c427..eb9e6f1 100644 (file)
@@ -49,7 +49,7 @@ describe("String literals", function() {
 
         var error = function(e) {
             return e instanceof UglifyJS.JS_Parse_Error &&
-                e.message === "SyntaxError: Octal literals are not allowed in strict mode";
+                e.message === "SyntaxError: Legacy octal escape sequences are not allowed in strict mode";
         }
 
         for (var input in inputs) {