mirror of
https://github.com/bellard/quickjs.git
synced 2024-11-22 13:48:11 +08:00
fixed class name init in static initializers
This commit is contained in:
parent
c3635861f6
commit
5935a26eae
27
quickjs.c
27
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_atom(s, JS_ATOM_this);
|
||||||
emit_u16(s, 0);
|
emit_u16(s, 0);
|
||||||
// stack is now: fclosure this
|
// 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);
|
emit_op(s, OP_swap);
|
||||||
// stack is now: this fclosure
|
// stack is now: this fclosure
|
||||||
emit_op(s, OP_call_method);
|
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);
|
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 */
|
/* initialize the static fields */
|
||||||
if (class_fields[1].fields_init_fd != NULL) {
|
if (class_fields[1].fields_init_fd != NULL) {
|
||||||
ClassFieldsDef *cf = &class_fields[1];
|
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);
|
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);
|
||||||
pop_scope(s);
|
pop_scope(s);
|
||||||
|
|
||||||
|
@ -326,6 +326,15 @@ function test_class()
|
|||||||
/* test class name scope */
|
/* test class name scope */
|
||||||
var E1 = class E { static F() { return E; } };
|
var E1 = class E { static F() { return E; } };
|
||||||
assert(E1 === E1.F());
|
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()
|
function test_template()
|
||||||
|
Loading…
Reference in New Issue
Block a user