From 317de38e84ca49e1f045e9503ef7a022977b203a Mon Sep 17 00:00:00 2001 From: theMackabu Date: Sat, 4 Apr 2026 17:33:54 -0700 Subject: [PATCH] arrow param void token list --- examples/results.txt | 2 +- src/silver/ast.c | 57 +++++++++++++++++----------------------- src/silver/ops/globals.h | 11 ++++---- 3 files changed, 30 insertions(+), 40 deletions(-) diff --git a/examples/results.txt b/examples/results.txt index a547e04..b3e1f5f 100644 --- a/examples/results.txt +++ b/examples/results.txt @@ -680,7 +680,7 @@ compat-table/es6/arrow.lexical-this.js: OK compat-table/es6/arrow.new-target.js: OK compat-table/es6/arrow.no-line-break.js: failed compat-table/es6/arrow.no-prototype.js: OK -compat-table/es6/arrow.precedence.js: failed +compat-table/es6/arrow.precedence.js: OK compat-table/es6/arrow.this-call-apply.js: OK compat-table/es6/class.accessor-properties.js: OK compat-table/es6/class.anonymous.js: OK diff --git a/src/silver/ast.c b/src/silver/ast.c index 315bb2e..4f54aaf 100644 --- a/src/silver/ast.c +++ b/src/silver/ast.c @@ -520,20 +520,8 @@ static sv_ast_t *parse_primary(P) { l_globalthis: { CONSUME(); return mk(N_GLOBAL_THIS); } l_ident: { - uint32_t ident_off = (uint32_t)TOFF; CONSUME(); - sv_ast_t *id = mk_ident_from_tok(p); - if (LA() == TOK_ARROW) { - NEXT(); CONSUME(); - sv_ast_t *fn = mk(N_FUNC); - fn->flags = FN_ARROW; - fn->src_off = ident_off; - sv_ast_list_push(&fn->args, id); - fn->body = parse_arrow_body(p); - fn->src_end = (uint32_t)(TOFF + TLEN); - return fn; - } - return id; + return mk_ident_from_tok(p); } l_paren: { @@ -541,30 +529,15 @@ static sv_ast_t *parse_primary(P) { CONSUME(); if (NEXT() == TOK_RPAREN) { CONSUME(); - if (LA() == TOK_ARROW) { - NEXT(); CONSUME(); - sv_ast_t *fn = mk(N_FUNC); - fn->flags = FN_ARROW; - fn->src_off = paren_off; - fn->body = parse_arrow_body(p); - fn->src_end = (uint32_t)(TOFF + TLEN); - return fn; - } - return mk(N_UNDEF); + sv_ast_t *n = mk(N_UNDEF); + n->flags |= FN_PAREN; + n->src_off = paren_off; + return n; } sv_ast_t *expr = parse_expr(p); expect(p, TOK_RPAREN); - if (LA() == TOK_ARROW) { - NEXT(); CONSUME(); - sv_ast_t *fn = mk(N_FUNC); - fn->flags = FN_ARROW; - fn->src_off = paren_off; - push_arrow_params_from_expr(fn, expr); - fn->body = parse_arrow_body(p); - fn->src_end = (uint32_t)(TOFF + TLEN); - return fn; - } expr->flags |= FN_PAREN; + expr->src_off = paren_off; return expr; } @@ -1186,6 +1159,24 @@ static bool is_assign_op(uint8_t tok) { static sv_ast_t *parse_assign(P) { sv_ast_t *left = parse_ternary(p); uint8_t op = NEXT(); + if (op == TOK_ARROW) { + CONSUME(); + sv_ast_t *fn = mk(N_FUNC); + fn->flags = FN_ARROW; + fn->src_off = left->src_off; + if (left->type == N_IDENT) { + sv_ast_list_push(&fn->args, left); + } else if (left->flags & FN_PAREN) { + if (left->type != N_UNDEF) + push_arrow_params_from_expr(fn, left); + } else { + SV_MKERR_TYPED(JS, JS_ERR_SYNTAX, "Malformed arrow function parameter list"); + return mk(N_EMPTY); + } + fn->body = parse_arrow_body(p); + fn->src_end = (uint32_t)(TOFF + TLEN); + return fn; + } if (is_assign_op(op)) { if (left->type == N_NEW_TARGET) { SV_MKERR_TYPED(JS, JS_ERR_SYNTAX, "Invalid left-hand side in assignment"); diff --git a/src/silver/ops/globals.h b/src/silver/ops/globals.h index d08f0fd..517a4fb 100644 --- a/src/silver/ops/globals.h +++ b/src/silver/ops/globals.h @@ -106,17 +106,16 @@ static inline ant_value_t sv_op_get_global( ) { sv_atom_t *a = &func->atoms[sv_get_u32(ip + 1)]; ant_value_t super_val = sv_vm_get_super_val(vm); - if (a->len == 5 && memcmp(a->str, "super", 5) == 0 && - vtype(super_val) != T_UNDEF) { + if (a->len == 5 && memcmp(a->str, "super", 5) == 0 && vtype(super_val) != T_UNDEF) { ant_value_t sv = super_val; vm->stack[vm->sp++] = sv; return sv; } ant_value_t val = sv_global_get_interned_ic(js, a->str, func, ip); - if (is_undefined(val)) - return js_mkerr_typed( - js, JS_ERR_REFERENCE, "'%.*s' is not defined", - (int)a->len, a->str); + if (is_undefined(val) && lkp_interned(js, js->global, a->str, a->len) == 0) return js_mkerr_typed( + js, JS_ERR_REFERENCE, "'%.*s' is not defined", + (int)a->len, a->str + ); vm->stack[vm->sp++] = val; return val; } -- 2.51.2