support shorthand property name in object literal (#4263)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sun, 8 Nov 2020 02:44:44 +0000 (02:44 +0000)
committerGitHub <noreply@github.com>
Sun, 8 Nov 2020 02:44:44 +0000 (10:44 +0800)
lib/parse.js
test/ufuzz/index.js

index 82717d2..78311f8 100644 (file)
@@ -1219,7 +1219,7 @@ function parse($TEXT, options) {
         var tok = S.token, ret;
         switch (tok.type) {
           case "name":
-            ret = _make_symbol(AST_SymbolRef);
+            ret = _make_symbol(AST_SymbolRef, tok);
             break;
           case "num":
             ret = new AST_Number({ start: tok, end: tok, value: tok.value });
@@ -1337,36 +1337,45 @@ function parse($TEXT, options) {
         var first = true, a = [];
         while (!is("punc", "}")) {
             if (first) first = false; else expect(",");
-            if (!options.strict && is("punc", "}"))
-                // allow trailing comma
-                break;
+            // allow trailing comma
+            if (!options.strict && is("punc", "}")) break;
             var start = S.token;
             var type = start.type;
             var name = as_property_name();
-            if (type == "name" && !is("punc", ":")) {
-                var key = new AST_SymbolAccessor({
-                    start: S.token,
-                    name: "" + as_property_name(),
-                    end: prev()
-                });
-                if (name == "get") {
-                    a.push(new AST_ObjectGetter({
-                        start : start,
-                        key   : key,
-                        value : create_accessor(),
-                        end   : prev()
-                    }));
-                    continue;
-                }
-                if (name == "set") {
-                    a.push(new AST_ObjectSetter({
-                        start : start,
-                        key   : key,
-                        value : create_accessor(),
-                        end   : prev()
-                    }));
-                    continue;
-                }
+            if (!is("punc", ":") && type == "name") switch (name) {
+              case "get":
+                a.push(new AST_ObjectGetter({
+                    start: start,
+                    key: new AST_SymbolAccessor({
+                        start: S.token,
+                        name: "" + as_property_name(),
+                        end: prev(),
+                    }),
+                    value: create_accessor(),
+                    end: prev(),
+                }));
+                continue;
+              case "set":
+                a.push(new AST_ObjectSetter({
+                    start: start,
+                    key: new AST_SymbolAccessor({
+                        start: S.token,
+                        name: "" + as_property_name(),
+                        end: prev(),
+                    }),
+                    value: create_accessor(),
+                    end: prev(),
+                }));
+                continue;
+              default:
+                a.push(new AST_ObjectKeyVal({
+                    start: start,
+                    quote: start.quote,
+                    key: "" + name,
+                    value: _make_symbol(AST_SymbolRef, start),
+                    end: prev(),
+                }));
+                continue;
             }
             expect(":");
             a.push(new AST_ObjectKeyVal({
@@ -1405,12 +1414,12 @@ function parse($TEXT, options) {
         return name;
     }
 
-    function _make_symbol(type) {
-        var name = S.token.value;
-        return new (name == "this" ? AST_This : type)({
-            name  : String(name),
-            start : S.token,
-            end   : S.token
+    function _make_symbol(type, token) {
+        var name = token.value;
+        return new (name === "this" ? AST_This : type)({
+            name: "" + name,
+            starttoken,
+            end: token,
         });
     }
 
@@ -1424,7 +1433,7 @@ function parse($TEXT, options) {
             if (!noerror) croak("Name expected");
             return null;
         }
-        var sym = _make_symbol(type);
+        var sym = _make_symbol(type, S.token);
         if (S.input.has_directive("use strict") && sym instanceof AST_SymbolDeclaration) {
             strict_verify_symbol(sym);
         }
index 1ebc655..48e5a2f 100644 (file)
@@ -944,13 +944,16 @@ function createAccessor(recurmax, stmtDepth, canThrow) {
 function createObjectLiteral(recurmax, stmtDepth, canThrow) {
     recurmax--;
     var obj = ["({"];
-    for (var i = rng(6); --i >= 0;) {
-        if (rng(20) == 0) {
-            obj.push(createAccessor(recurmax, stmtDepth, canThrow));
-        } else {
-            var key = KEYS[rng(KEYS.length)];
-            obj.push(key + ":(" + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + "),");
-        }
+    for (var i = rng(6); --i >= 0;) switch (rng(20)) {
+      case 0:
+        obj.push(createAccessor(recurmax, stmtDepth, canThrow));
+        break;
+      case 1:
+        obj.push(getVarName() + ",");
+        break;
+      default:
+        obj.push(KEYS[rng(KEYS.length)] + ":(" + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + "),");
+        break;
     }
     obj.push("})");
     return obj.join("\n");