fixed class name init in static initializers

This commit is contained in:
Fabrice Bellard 2024-01-08 18:39:58 +01:00
parent c3635861f6
commit 5935a26eae
2 changed files with 19 additions and 17 deletions

View file

@ -22951,14 +22951,6 @@ static __exception int js_parse_class(JSParseState *s, BOOL is_class_expr,
emit_atom(s, JS_ATOM_this);
emit_u16(s, 0);
// stack is now: fclosure this
/* XXX: should do it only once */
if (class_name != JS_ATOM_NULL) {
// TODO(bnoordhuis) pass as argument to init method?
emit_op(s, OP_dup);
emit_op(s, OP_scope_put_var_init);
emit_atom(s, class_name);
emit_u16(s, s->cur_func->scope_level);
}
emit_op(s, OP_swap);
// stack is now: this fclosure
emit_op(s, OP_call_method);
@ -23279,6 +23271,16 @@ static __exception int js_parse_class(JSParseState *s, BOOL is_class_expr,
emit_op(s, OP_add_brand);
}
if (class_name != JS_ATOM_NULL) {
/* store the class name in the scoped class name variable (it
is independent from the class statement variable
definition) */
emit_op(s, OP_dup);
emit_op(s, OP_scope_put_var_init);
emit_atom(s, class_name);
emit_u16(s, fd->scope_level);
}
/* initialize the static fields */
if (class_fields[1].fields_init_fd != NULL) {
ClassFieldsDef *cf = &class_fields[1];
@ -23289,15 +23291,6 @@ static __exception int js_parse_class(JSParseState *s, BOOL is_class_expr,
emit_op(s, OP_drop);
}
if (class_name != JS_ATOM_NULL) {
/* store the class name in the scoped class name variable (it
is independent from the class statement variable
definition) */
emit_op(s, OP_dup);
emit_op(s, OP_scope_put_var_init);
emit_atom(s, class_name);
emit_u16(s, fd->scope_level);
}
pop_scope(s);
pop_scope(s);

View file

@ -326,6 +326,15 @@ function test_class()
/* test class name scope */
var E1 = class E { static F() { return E; } };
assert(E1 === E1.F());
class S {
static x = 42;
static y = S.x;
static z = this.x;
}
assert(S.x === 42);
assert(S.y === 42);
assert(S.z === 42);
};
function test_template()