fix corner case when parsing expression (#4435)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 22 Dec 2020 18:16:04 +0000 (18:16 +0000)
committerGitHub <noreply@github.com>
Tue, 22 Dec 2020 18:16:04 +0000 (02:16 +0800)
lib/parse.js
test/mocha/number-literal.js

index 111be3b..87293ca 100644 (file)
@@ -737,7 +737,7 @@ function parse($TEXT, options) {
 
     function semicolon(optional) {
         if (is("punc", ";")) next();
-        else if (!optional && !can_insert_semicolon()) expect_token("punc", ";");
+        else if (!optional && !can_insert_semicolon()) expect(";");
     }
 
     function parenthesised() {
@@ -1166,7 +1166,7 @@ function parse($TEXT, options) {
         expect("{");
         var a = [];
         while (!is("punc", "}")) {
-            if (is("eof")) expect_token("punc", "}");
+            if (is("eof")) expect("}");
             a.push(statement());
         }
         next();
@@ -1177,7 +1177,7 @@ function parse($TEXT, options) {
         expect("{");
         var a = [], branch, cur, default_branch, tmp;
         while (!is("punc", "}")) {
-            if (is("eof")) expect_token("punc", "}");
+            if (is("eof")) expect("}");
             if (is("keyword", "case")) {
                 if (branch) branch.end = prev();
                 cur = [];
@@ -1561,9 +1561,8 @@ function parse($TEXT, options) {
     }
 
     function as_name() {
-        if (!is("name")) expect_token("name");
         var name = S.token.value;
-        next();
+        expect_token("name");
         return name;
     }
 
@@ -1861,7 +1860,9 @@ function parse($TEXT, options) {
 
     if (options.expression) {
         handle_regexp();
-        return expression();
+        var exp = expression();
+        expect_token("eof");
+        return exp;
     }
 
     return function() {
index a2b16a9..61c3a6d 100644 (file)
@@ -89,4 +89,13 @@ describe("Number literals", function() {
             }, code);
         });
     });
+    it("Should reject invalid syntax under expression=true", function() {
+        assert.throws(function() {
+            UglifyJS.parse("42.g", {
+                expression: true,
+            });
+        }, function(e) {
+            return e instanceof UglifyJS.JS_Parse_Error;
+        });
+    });
 });