support class static initialization block (#5488)

This commit is contained in:
Alex Lam S.L
2022-06-06 05:01:15 +01:00
committed by GitHub
parent d2bd0d1c1c
commit 88b4283200
6 changed files with 304 additions and 31 deletions

View File

@@ -241,6 +241,208 @@ class_super: {
node_version: ">=4"
}
static_init: {
input: {
var a = "foo";
var b = null;
class A {
static {
var a = "bar";
b = true;
var c = 42;
console.log(a, b, c);
}
}
console.log(a, b, typeof c);
}
expect_exact: 'var a="foo";var b=null;class A{static{var a="bar";b=true;var c=42;console.log(a,b,c)}}console.log(a,b,typeof c);'
expect_stdout: [
"bar true 42",
"foo true undefined",
]
node_version: ">=16"
}
static_field_init: {
options = {
side_effects: true,
}
input: {
(class {
static [console.log("foo")] = console.log("bar");
static {
console.log("baz");
}
static [console.log("moo")] = console.log("moz");
});
}
expect: {
(class {
static [(console.log("foo"), console.log("moo"))] = (
console.log("bar"),
(() => {
console.log("baz");
})(),
console.log("moz")
);
});
}
expect_stdout: [
"foo",
"moo",
"bar",
"baz",
"moz",
]
node_version: ">=16"
}
static_field_init_strict: {
options = {
side_effects: true,
}
input: {
"use strict";
(class {
static [console.log("foo")] = console.log("bar");
static {
console.log("baz");
}
static [console.log("moo")] = console.log("moz");
});
}
expect: {
"use strict";
console.log("foo"),
console.log("moo"),
(() => (
console.log("bar"),
(() => {
console.log("baz");
})(),
console.log("moz")
))();
}
expect_stdout: [
"foo",
"moo",
"bar",
"baz",
"moz",
]
node_version: ">=16"
}
static_init_side_effects_1: {
options = {
merge_vars: true,
side_effects: true,
}
input: {
var a = "FAIL";
(class {
static {
a = "PASS";
}
});
console.log(a);
}
expect: {
var a = "FAIL";
(class {
static {
a = "PASS";
}
});
console.log(a);
}
expect_stdout: "PASS"
node_version: ">=16"
}
static_init_side_effects_1_strict: {
options = {
merge_vars: true,
side_effects: true,
}
input: {
"use strict";
var a = "FAIL";
(class {
static {
a = "PASS";
}
});
console.log(a);
}
expect: {
"use strict";
var a = "FAIL";
(() => (() => {
a = "PASS";
})())();
console.log(a);
}
expect_stdout: "PASS"
node_version: ">=16"
}
static_init_side_effects_2: {
options = {
hoist_props: true,
reduce_vars: true,
side_effects: true,
}
input: {
var a = "FAIL";
(class {
static {
a = "PASS";
}
});
console.log(a);
}
expect: {
var a = "FAIL";
(class {
static {
a = "PASS";
}
});
console.log(a);
}
expect_stdout: "PASS"
node_version: ">=16"
}
static_init_side_effects_2_strict: {
options = {
hoist_props: true,
reduce_vars: true,
side_effects: true,
}
input: {
"use strict";
var a = "FAIL";
(class {
static {
a = "PASS";
}
});
console.log(a);
}
expect: {
"use strict";
var a = "FAIL";
(() => (() => {
a = "PASS";
})())();
console.log(a);
}
expect_stdout: "PASS"
node_version: ">=16"
}
block_scoped: {
options = {
evaluate: true,

View File

@@ -140,6 +140,7 @@ var SUPPORT = function(matrix) {
class: "class C { f() {} }",
class_field: "class C { p = 0; }",
class_private: "class C { #f() {} }",
class_static_init: "class C { static {} }",
computed_key: "({[0]: 0});",
const_block: "var a; { const a = 0; }",
default_value: "[ a = 0 ] = [];",
@@ -1181,7 +1182,11 @@ function createStatement(recurmax, canThrow, canBreak, canContinue, cannotReturn
unique_vars.length = unique_len;
});
}
if (n !== 0) s += " finally { " + createStatements(3, recurmax, canThrow, canBreak, canContinue, cannotReturn, stmtDepth) + " }";
if (n !== 0) s += [
" finally { ",
createStatements(rng(5) + 1, recurmax, canThrow, canBreak, canContinue, cannotReturn, stmtDepth),
" }",
].join("");
return s;
case STMT_C:
return "c = c + 1;";
@@ -1839,6 +1844,16 @@ function createClassLiteral(recurmax, stmtDepth, canThrow, name) {
async = save_async;
}
s += ";\n";
} else if (SUPPORT.class_static_init && fixed && !internal && rng(10) == 0) {
async = false;
generator = false;
s += [
"{ ",
createStatements(rng(5) + 1, recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CANNOT_RETURN, stmtDepth),
" }\n",
].join("");
generator = save_generator;
async = save_async;
} else {
if (!fixed && !internal && constructor && rng(10) == 0) {
internal = constructor;