aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2020-11-08 02:44:44 +0000
committerGitHub <noreply@github.com>2020-11-08 10:44:44 +0800
commitb82de04775a490f7a1ebf7a8911f7d1a24a5f0b6 (patch)
tree1c16707eee2326a03eeed13b1878399cc040aa12
parent4bbeb09f7c12bfb3d12ac5264bbdf033ee0b66dc (diff)
downloadtracifyjs-b82de04775a490f7a1ebf7a8911f7d1a24a5f0b6.tar.gz
tracifyjs-b82de04775a490f7a1ebf7a8911f7d1a24a5f0b6.zip
support shorthand property name in object literal (#4263)
-rw-r--r--lib/parse.js79
-rw-r--r--test/ufuzz/index.js17
2 files changed, 54 insertions, 42 deletions
diff --git a/lib/parse.js b/lib/parse.js
index 82717d26..78311f89 100644
--- a/lib/parse.js
+++ b/lib/parse.js
@@ -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,
+ start: token,
+ 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);
}
diff --git a/test/ufuzz/index.js b/test/ufuzz/index.js
index 1ebc655b..48e5a2fe 100644
--- a/test/ufuzz/index.js
+++ b/test/ufuzz/index.js
@@ -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");