summaryrefslogtreecommitdiff
path: root/quickjs.c
diff options
context:
space:
mode:
authorFabrice Bellard <fabrice@bellard.org>2025-04-10 16:23:25 +0200
committerFabrice Bellard <fabrice@bellard.org>2025-04-10 16:23:25 +0200
commit7adeb5c56e18858ab92337c59b393f0704538e22 (patch)
tree2a03e5eb8d07053ed2c7559634cf2880f88ec060 /quickjs.c
parent949c105aff1ff0c3edc0a1cb7c713c68509fc156 (diff)
downloadquickjs-7adeb5c56e18858ab92337c59b393f0704538e22.tar.gz
quickjs-7adeb5c56e18858ab92337c59b393f0704538e22.zip
Fix exporting destructured variables (saghul) (#382)
Diffstat (limited to 'quickjs.c')
-rw-r--r--quickjs.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/quickjs.c b/quickjs.c
index 7642d7d..fd464c9 100644
--- a/quickjs.c
+++ b/quickjs.c
@@ -23874,7 +23874,7 @@ fail:
present at the top level. */
static int js_parse_destructuring_element(JSParseState *s, int tok, int is_arg,
int hasval, int has_ellipsis,
- BOOL allow_initializer)
+ BOOL allow_initializer, BOOL export_flag)
{
int label_parse, label_assign, label_done, label_lvalue, depth_lvalue;
int start_addr, assign_addr;
@@ -23990,7 +23990,7 @@ static int js_parse_destructuring_element(JSParseState *s, int tok, int is_arg,
emit_op(s, OP_get_field2);
emit_u32(s, prop_name);
}
- if (js_parse_destructuring_element(s, tok, is_arg, TRUE, -1, TRUE) < 0)
+ if (js_parse_destructuring_element(s, tok, is_arg, TRUE, -1, TRUE, export_flag) < 0)
return -1;
if (s->token.val == '}')
break;
@@ -24114,6 +24114,11 @@ static int js_parse_destructuring_element(JSParseState *s, int tok, int is_arg,
if (tok) {
if (js_define_var(s, var_name, tok))
goto var_error;
+ if (export_flag) {
+ if (!add_export_entry(s, s->cur_func->module, var_name, var_name,
+ JS_EXPORT_TYPE_LOCAL))
+ goto var_error;
+ }
scope = s->cur_func->scope_level;
}
if (s->token.val == '=') { /* handle optional default value */
@@ -24189,7 +24194,7 @@ static int js_parse_destructuring_element(JSParseState *s, int tok, int is_arg,
emit_u8(s, 0);
emit_op(s, OP_drop);
}
- if (js_parse_destructuring_element(s, tok, is_arg, TRUE, skip_bits & SKIP_HAS_ELLIPSIS, TRUE) < 0)
+ if (js_parse_destructuring_element(s, tok, is_arg, TRUE, skip_bits & SKIP_HAS_ELLIPSIS, TRUE, export_flag) < 0)
return -1;
} else {
var_name = JS_ATOM_NULL;
@@ -24479,7 +24484,7 @@ static __exception int js_parse_postfix_expr(JSParseState *s, int parse_flags)
{
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) < 0)
+ if (js_parse_destructuring_element(s, 0, 0, FALSE, skip_bits & SKIP_HAS_ELLIPSIS, TRUE, FALSE) < 0)
return -1;
} else {
if (s->token.val == '{') {
@@ -26031,7 +26036,7 @@ static __exception int js_parse_var(JSParseState *s, int parse_flags, int tok,
if ((s->token.val == '[' || s->token.val == '{')
&& js_parse_skip_parens_token(s, &skip_bits, FALSE) == '=') {
emit_op(s, OP_undefined);
- if (js_parse_destructuring_element(s, tok, 0, TRUE, skip_bits & SKIP_HAS_ELLIPSIS, TRUE) < 0)
+ if (js_parse_destructuring_element(s, tok, 0, TRUE, skip_bits & SKIP_HAS_ELLIPSIS, TRUE, export_flag) < 0)
return -1;
} else {
return js_parse_error(s, "variable name expected");
@@ -26153,7 +26158,7 @@ static __exception int js_parse_for_in_of(JSParseState *s, int label_name,
if (!(s->token.val == TOK_IDENT && !s->token.u.ident.is_reserved)) {
if (s->token.val == '[' || s->token.val == '{') {
- if (js_parse_destructuring_element(s, tok, 0, TRUE, -1, FALSE) < 0)
+ if (js_parse_destructuring_element(s, tok, 0, TRUE, -1, FALSE, FALSE) < 0)
return -1;
has_destructuring = TRUE;
} else {
@@ -26182,7 +26187,7 @@ static __exception int js_parse_for_in_of(JSParseState *s, int label_name,
int skip_bits;
if ((s->token.val == '[' || s->token.val == '{')
&& ((tok1 = js_parse_skip_parens_token(s, &skip_bits, FALSE)) == TOK_IN || tok1 == TOK_OF)) {
- if (js_parse_destructuring_element(s, 0, 0, TRUE, skip_bits & SKIP_HAS_ELLIPSIS, TRUE) < 0)
+ if (js_parse_destructuring_element(s, 0, 0, TRUE, skip_bits & SKIP_HAS_ELLIPSIS, TRUE, FALSE) < 0)
return -1;
} else {
int lvalue_label;
@@ -26857,7 +26862,7 @@ static __exception int js_parse_statement_or_decl(JSParseState *s,
if (!(s->token.val == TOK_IDENT && !s->token.u.ident.is_reserved)) {
if (s->token.val == '[' || s->token.val == '{') {
/* XXX: TOK_LET is not completely correct */
- if (js_parse_destructuring_element(s, TOK_LET, 0, TRUE, -1, TRUE) < 0)
+ if (js_parse_destructuring_element(s, TOK_LET, 0, TRUE, -1, TRUE, FALSE) < 0)
goto fail;
} else {
js_parse_error(s, "identifier expected");
@@ -33802,7 +33807,7 @@ static __exception int js_parse_function_decl2(JSParseState *s,
emit_op(s, OP_get_arg);
emit_u16(s, idx);
}
- has_initializer = js_parse_destructuring_element(s, fd->has_parameter_expressions ? TOK_LET : TOK_VAR, 1, TRUE, -1, TRUE);
+ has_initializer = js_parse_destructuring_element(s, fd->has_parameter_expressions ? TOK_LET : TOK_VAR, 1, TRUE, -1, TRUE, FALSE);
if (has_initializer < 0)
goto fail;
if (has_initializer)