From 5935a26eaed46f9e00cc5db73900321db940579a Mon Sep 17 00:00:00 2001 From: Fabrice Bellard Date: Mon, 8 Jan 2024 18:39:58 +0100 Subject: [PATCH] fixed class name init in static initializers --- quickjs.c | 27 ++++++++++----------------- tests/test_language.js | 9 +++++++++ 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/quickjs.c b/quickjs.c index fb1af99..b4f73ec 100644 --- a/quickjs.c +++ b/quickjs.c @@ -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); diff --git a/tests/test_language.js b/tests/test_language.js index cc3349d..f1df6a0 100644 --- a/tests/test_language.js +++ b/tests/test_language.js @@ -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()