]> git.kaiwu.me - quickjs.git/commitdiff
fixed class name init in static initializers
authorFabrice Bellard <fabrice@bellard.org>
Mon, 8 Jan 2024 17:39:58 +0000 (18:39 +0100)
committerFabrice Bellard <fabrice@bellard.org>
Mon, 8 Jan 2024 17:39:58 +0000 (18:39 +0100)
quickjs.c
tests/test_language.js

index fb1af99e70eeb88c980e92740c2e8a78151ead39..b4f73ec243feb6678f2f3712d7fa05958cb98861 100644 (file)
--- 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);
 
index cc3349d3871b0bcfe25d07533a2e67d775453017..f1df6a083acb24b607834783d32d78a52b46ca14 100644 (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()