summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabrice Bellard <fabrice@bellard.org>2025-04-16 14:14:21 +0200
committerFabrice Bellard <fabrice@bellard.org>2025-04-16 14:14:21 +0200
commit1d5e7cf3004919f4bbb0d2ce032c675493279e3b (patch)
treefe92923bc0fe0594d649b1397c43a29c97a6bcf3
parent5449fd42d62e5f3fda38736475f7c65c133b5cd2 (diff)
downloadquickjs-1d5e7cf3004919f4bbb0d2ce032c675493279e3b.tar.gz
quickjs-1d5e7cf3004919f4bbb0d2ce032c675493279e3b.zip
fixed destructuring parsing: do it only in assignment expressions
-rw-r--r--quickjs.c27
-rw-r--r--test262_errors.txt2
2 files changed, 12 insertions, 17 deletions
diff --git a/quickjs.c b/quickjs.c
index 4187cab..83e933b 100644
--- a/quickjs.c
+++ b/quickjs.c
@@ -24653,20 +24653,12 @@ static __exception int js_parse_postfix_expr(JSParseState *s, int parse_flags)
break;
case '{':
case '[':
- {
- int skip_bits;
- if (js_parse_skip_parens_token(s, &skip_bits, FALSE) == '=') {
- if (js_parse_destructuring_element(s, 0, 0, FALSE, skip_bits & SKIP_HAS_ELLIPSIS, TRUE, FALSE) < 0)
- return -1;
- } else {
- if (s->token.val == '{') {
- if (js_parse_object_literal(s))
- return -1;
- } else {
- if (js_parse_array_literal(s))
- return -1;
- }
- }
+ if (s->token.val == '{') {
+ if (js_parse_object_literal(s))
+ return -1;
+ } else {
+ if (js_parse_array_literal(s))
+ return -1;
}
break;
case TOK_NEW:
@@ -25639,7 +25631,7 @@ static __exception int js_parse_cond_expr(JSParseState *s, int parse_flags)
/* allowed parse_flags: PF_IN_ACCEPTED */
static __exception int js_parse_assign_expr2(JSParseState *s, int parse_flags)
{
- int opcode, op, scope;
+ int opcode, op, scope, skip_bits;
JSAtom name0 = JS_ATOM_NULL;
JSAtom name;
@@ -25816,6 +25808,11 @@ static __exception int js_parse_assign_expr2(JSParseState *s, int parse_flags)
return js_parse_function_decl(s, JS_PARSE_FUNC_ARROW,
JS_FUNC_NORMAL, JS_ATOM_NULL,
s->token.ptr);
+ } else if ((s->token.val == '{' || s->token.val == '[') &&
+ js_parse_skip_parens_token(s, &skip_bits, FALSE) == '=') {
+ if (js_parse_destructuring_element(s, 0, 0, FALSE, skip_bits & SKIP_HAS_ELLIPSIS, TRUE, FALSE) < 0)
+ return -1;
+ return 0;
}
next:
if (s->token.val == TOK_IDENT) {
diff --git a/test262_errors.txt b/test262_errors.txt
index 0baea7b..1399fc9 100644
--- a/test262_errors.txt
+++ b/test262_errors.txt
@@ -1,6 +1,4 @@
test262/test/language/destructuring/binding/keyed-destructuring-property-reference-target-evaluation-order-with-bindings.js:73: Test262Error: Actual [binding::source, binding::sourceKey, sourceKey, get source, binding::defaultValue, binding::varTarget] and expected [binding::source, binding::sourceKey, sourceKey, binding::varTarget, get source, binding::defaultValue] should have the same contents.
-test262/test/language/expressions/in/private-field-invalid-assignment-target.js:23: unexpected error type: Test262: This statement should not be evaluated.
-test262/test/language/expressions/in/private-field-invalid-assignment-target.js:23: strict mode: unexpected error type: Test262: This statement should not be evaluated.
test262/test/language/module-code/top-level-await/module-graphs-does-not-hang.js:10: TypeError: $DONE() not called
test262/test/language/statements/with/get-binding-value-call-with-proxy-env.js:39: Test262Error: Actual [has:Object, get:Symbol(Symbol.unscopables), get:Object] and expected [has:Object, get:Symbol(Symbol.unscopables), has:Object, get:Object] should have the same contents.
test262/test/language/statements/with/get-binding-value-idref-with-proxy-env.js:39: Test262Error: Actual [has:Object, get:Symbol(Symbol.unscopables), get:Object] and expected [has:Object, get:Symbol(Symbol.unscopables), has:Object, get:Object] should have the same contents.