Commit 47abe102 authored by Sathya Gunasekaran's avatar Sathya Gunasekaran Committed by Commit Bot

[class] Add bytecode expectations test for private class fields

Bug: v8:5368
Change-Id: I7ec4bb6c0f50d8a72a12f5d4521c5fdcba526014
Reviewed-on: https://chromium-review.googlesource.com/929876Reviewed-by: 's avatarMythri Alle <mythria@chromium.org>
Commit-Queue: Sathya Gunasekaran <gsathya@chromium.org>
Cr-Commit-Position: refs/heads/master@{#51479}
parent e234176b
#
# Autogenerated by generate-bytecode-expectations.
#
---
wrap: yes
private fields: yes
---
snippet: "
{
class A {
#a;
constructor() {
this.#a = 1;
}
}
class B {
#a = 1;
}
new A;
new B;
}
"
frame size: 9
parameter count: 1
bytecode array length: 131
bytecodes: [
/* 30 E> */ B(StackCheck),
B(Ldar), R(closure),
B(CreateBlockContext), U8(0),
B(PushContext), R(4),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
B(LdaTheHole),
B(Star), R(8),
B(CreateClosure), U8(2), U8(0), U8(2),
B(Star), R(5),
B(LdaConstant), U8(1),
B(Star), R(6),
B(CallRuntime), U16(Runtime::kCreatePrivateFieldSymbol), R(0), U8(0),
B(StaCurrentContextSlot), U8(4),
B(Mov), R(5), R(7),
B(CallRuntime), U16(Runtime::kDefineClass), R(6), U8(3),
B(Star), R(6),
B(Mov), R(7), R(1),
B(CreateClosure), U8(3), U8(1), U8(2),
B(Star), R(7),
B(StaNamedProperty), R(5), U8(4), U8(2),
B(PopContext), R(4),
B(Mov), R(1), R(2),
B(Ldar), R(closure),
/* 38 E> */ B(CreateBlockContext), U8(5),
B(PushContext), R(4),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
B(LdaTheHole),
B(Star), R(8),
B(CreateClosure), U8(7), U8(4), U8(2),
B(Star), R(5),
B(LdaConstant), U8(6),
B(Star), R(6),
B(CallRuntime), U16(Runtime::kCreatePrivateFieldSymbol), R(0), U8(0),
B(StaCurrentContextSlot), U8(4),
B(Mov), R(5), R(7),
B(CallRuntime), U16(Runtime::kDefineClass), R(6), U8(3),
B(Star), R(6),
B(Mov), R(7), R(0),
B(CreateClosure), U8(8), U8(5), U8(2),
B(Star), R(7),
B(StaNamedProperty), R(5), U8(4), U8(6),
B(PopContext), R(4),
B(Mov), R(0), R(3),
/* 136 S> */ B(Ldar), R(1),
/* 136 E> */ B(Construct), R(1), R(0), U8(0), U8(8),
/* 145 S> */ B(Ldar), R(0),
/* 145 E> */ B(Construct), R(0), R(0), U8(0), U8(10),
B(LdaUndefined),
/* 154 S> */ B(Return),
]
constant pool: [
SCOPE_INFO_TYPE,
FIXED_ARRAY_TYPE,
SHARED_FUNCTION_INFO_TYPE,
SHARED_FUNCTION_INFO_TYPE,
SYMBOL_TYPE,
SCOPE_INFO_TYPE,
FIXED_ARRAY_TYPE,
SHARED_FUNCTION_INFO_TYPE,
SHARED_FUNCTION_INFO_TYPE,
]
handlers: [
]
---
snippet: "
{
class A extends class {} {
#a;
constructor() {
super();
this.#a = 1;
}
}
class B extends class {} {
#a = 1;
#b = this.#a;
foo() { return this.#a; }
bar(v) { this.#b = v; }
constructor() {
super();
this.foo();
this.bar(3);
}
}
class C extends B {
#a = 2;
constructor() {
(() => super())();
}
}
new A;
new B;
new C;
};
"
frame size: 15
parameter count: 1
bytecode array length: 263
bytecodes: [
/* 30 E> */ B(StackCheck),
B(Ldar), R(closure),
B(CreateBlockContext), U8(0),
B(PushContext), R(6),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
B(LdaTheHole),
B(Star), R(14),
B(CreateClosure), U8(3), U8(0), U8(2),
B(Star), R(11),
B(LdaConstant), U8(2),
B(Star), R(12),
B(Mov), R(11), R(13),
B(CallRuntime), U16(Runtime::kDefineClass), R(12), U8(3),
B(Star), R(12),
B(CreateClosure), U8(4), U8(1), U8(2),
B(Star), R(7),
B(LdaConstant), U8(1),
B(Star), R(8),
B(CallRuntime), U16(Runtime::kCreatePrivateFieldSymbol), R(0), U8(0),
B(StaCurrentContextSlot), U8(4),
B(Mov), R(7), R(9),
B(Mov), R(13), R(10),
B(CallRuntime), U16(Runtime::kDefineClass), R(8), U8(3),
B(Star), R(8),
B(Mov), R(9), R(2),
B(CreateClosure), U8(5), U8(2), U8(2),
B(Star), R(9),
B(StaNamedProperty), R(7), U8(6), U8(3),
B(PopContext), R(6),
B(Mov), R(2), R(3),
B(Ldar), R(closure),
/* 38 E> */ B(CreateBlockContext), U8(7),
B(PushContext), R(6),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(5),
B(LdaTheHole),
B(Star), R(14),
B(CreateClosure), U8(10), U8(5), U8(2),
B(Star), R(11),
B(LdaConstant), U8(9),
B(Star), R(12),
B(Mov), R(11), R(13),
B(CallRuntime), U16(Runtime::kDefineClass), R(12), U8(3),
B(Star), R(12),
B(CreateClosure), U8(11), U8(6), U8(2),
B(Star), R(7),
B(LdaConstant), U8(8),
B(Star), R(8),
B(CallRuntime), U16(Runtime::kCreatePrivateFieldSymbol), R(0), U8(0),
B(StaCurrentContextSlot), U8(4),
B(CallRuntime), U16(Runtime::kCreatePrivateFieldSymbol), R(0), U8(0),
B(StaCurrentContextSlot), U8(5),
B(CreateClosure), U8(12), U8(7), U8(2),
B(Star), R(11),
B(CreateClosure), U8(13), U8(8), U8(2),
B(Star), R(12),
B(Mov), R(7), R(9),
B(Mov), R(13), R(10),
B(CallRuntime), U16(Runtime::kDefineClass), R(8), U8(5),
B(Star), R(8),
B(Mov), R(9), R(1),
B(CreateClosure), U8(14), U8(9), U8(2),
B(Star), R(9),
B(StaNamedProperty), R(7), U8(6), U8(10),
B(PopContext), R(6),
B(Mov), R(1), R(4),
B(Ldar), R(closure),
/* 140 E> */ B(CreateBlockContext), U8(15),
B(PushContext), R(6),
B(LdaTheHole),
B(StaCurrentContextSlot), U8(4),
/* 356 E> */ B(CreateClosure), U8(17), U8(12), U8(2),
B(Star), R(7),
B(LdaConstant), U8(16),
B(Star), R(8),
B(CallRuntime), U16(Runtime::kCreatePrivateFieldSymbol), R(0), U8(0),
B(StaCurrentContextSlot), U8(4),
B(Mov), R(7), R(9),
B(Mov), R(1), R(10),
B(CallRuntime), U16(Runtime::kDefineClass), R(8), U8(3),
B(Star), R(8),
B(Mov), R(9), R(0),
B(CreateClosure), U8(18), U8(13), U8(2),
B(Star), R(9),
B(StaNamedProperty), R(7), U8(6), U8(14),
B(PopContext), R(6),
B(Mov), R(0), R(5),
/* 430 S> */ B(Ldar), R(2),
/* 430 E> */ B(Construct), R(2), R(0), U8(0), U8(16),
/* 439 S> */ B(Ldar), R(1),
/* 439 E> */ B(Construct), R(1), R(0), U8(0), U8(18),
/* 448 S> */ B(Ldar), R(0),
/* 448 E> */ B(Construct), R(0), R(0), U8(0), U8(20),
B(LdaUndefined),
/* 458 S> */ B(Return),
]
constant pool: [
SCOPE_INFO_TYPE,
FIXED_ARRAY_TYPE,
FIXED_ARRAY_TYPE,
SHARED_FUNCTION_INFO_TYPE,
SHARED_FUNCTION_INFO_TYPE,
SHARED_FUNCTION_INFO_TYPE,
SYMBOL_TYPE,
SCOPE_INFO_TYPE,
FIXED_ARRAY_TYPE,
FIXED_ARRAY_TYPE,
SHARED_FUNCTION_INFO_TYPE,
SHARED_FUNCTION_INFO_TYPE,
SHARED_FUNCTION_INFO_TYPE,
SHARED_FUNCTION_INFO_TYPE,
SHARED_FUNCTION_INFO_TYPE,
SCOPE_INFO_TYPE,
FIXED_ARRAY_TYPE,
SHARED_FUNCTION_INFO_TYPE,
SHARED_FUNCTION_INFO_TYPE,
]
handlers: [
]
......@@ -45,6 +45,7 @@ class ProgramOptions final {
do_expressions_(false),
async_iteration_(false),
public_fields_(false),
private_fields_(false),
static_fields_(false),
verbose_(false) {}
......@@ -66,6 +67,7 @@ class ProgramOptions final {
bool do_expressions() const { return do_expressions_; }
bool async_iteration() const { return async_iteration_; }
bool public_fields() const { return public_fields_; }
bool private_fields() const { return private_fields_; }
bool static_fields() const { return static_fields_; }
bool verbose() const { return verbose_; }
bool suppress_runtime_errors() const { return rebaseline_ && !verbose_; }
......@@ -85,6 +87,7 @@ class ProgramOptions final {
bool do_expressions_;
bool async_iteration_;
bool public_fields_;
bool private_fields_;
bool static_fields_;
bool verbose_;
std::vector<std::string> input_filenames_;
......@@ -177,6 +180,8 @@ ProgramOptions ProgramOptions::FromCommandLine(int argc, char** argv) {
options.async_iteration_ = true;
} else if (strcmp(argv[i], "--public-fields") == 0) {
options.public_fields_ = true;
} else if (strcmp(argv[i], "--private-fields") == 0) {
options.private_fields_ = true;
} else if (strcmp(argv[i], "--static-fields") == 0) {
options.static_fields_ = true;
} else if (strcmp(argv[i], "--verbose") == 0) {
......@@ -285,6 +290,8 @@ void ProgramOptions::UpdateFromHeader(std::istream& stream) {
async_iteration_ = ParseBoolean(line.c_str() + 17);
} else if (line.compare(0, 15, "public fields: ") == 0) {
public_fields_ = ParseBoolean(line.c_str() + 15);
} else if (line.compare(0, 16, "private fields: ") == 0) {
private_fields_ = ParseBoolean(line.c_str() + 16);
} else if (line.compare(0, 15, "static fields: ") == 0) {
static_fields_ = ParseBoolean(line.c_str() + 15);
} else if (line == "---") {
......@@ -311,6 +318,7 @@ void ProgramOptions::PrintHeader(std::ostream& stream) const { // NOLINT
if (do_expressions_) stream << "\ndo expressions: yes";
if (async_iteration_) stream << "\nasync iteration: yes";
if (public_fields_) stream << "\npublic fields: yes";
if (private_fields_) stream << "\nprivate fields: yes";
if (static_fields_) stream << "\nstatic fields: yes";
stream << "\n\n";
......@@ -416,6 +424,7 @@ void GenerateExpectationsFile(std::ostream& stream, // NOLINT
if (options.do_expressions()) i::FLAG_harmony_do_expressions = true;
if (options.public_fields()) i::FLAG_harmony_public_fields = true;
if (options.private_fields()) i::FLAG_harmony_private_fields = true;
if (options.static_fields()) i::FLAG_harmony_static_fields = true;
stream << "#\n# Autogenerated by generate-bytecode-expectations.\n#\n\n";
......@@ -426,6 +435,7 @@ void GenerateExpectationsFile(std::ostream& stream, // NOLINT
i::FLAG_harmony_do_expressions = false;
i::FLAG_harmony_public_fields = false;
i::FLAG_harmony_private_fields = false;
i::FLAG_harmony_static_fields = false;
}
......@@ -474,6 +484,7 @@ void PrintUsage(const char* exec_path) {
" --top-level Process top level code, not the top-level function.\n"
" --do-expressions Enable harmony_do_expressions flag.\n"
" --public-fields Enable harmony_public_fields flag.\n"
" --private-fields Enable harmony_private_fields flag.\n"
" --static-fields Enable harmony_static_fields flag.\n"
" --output=file.name\n"
" Specify the output file. If not specified, output goes to "
......
......@@ -2233,7 +2233,7 @@ TEST(ClassAndSuperClass) {
LoadGolden("ClassAndSuperClass.golden")));
}
TEST(ClassFields) {
TEST(PublicClassFields) {
bool old_flag = i::FLAG_harmony_public_fields;
i::FLAG_harmony_public_fields = true;
InitializedIgnitionHandleScope scope;
......@@ -2283,10 +2283,70 @@ TEST(ClassFields) {
"}\n"};
CHECK(CompareTexts(BuildActual(printer, snippets),
LoadGolden("ClassFields.golden")));
LoadGolden("PublicClassFields.golden")));
i::FLAG_harmony_public_fields = old_flag;
}
TEST(PrivateClassFields) {
bool old_flag = i::FLAG_harmony_private_fields;
i::FLAG_harmony_private_fields = true;
InitializedIgnitionHandleScope scope;
BytecodeExpectationsPrinter printer(CcTest::isolate());
const char* snippets[] = {
"{\n"
" class A {\n"
" #a;\n"
" constructor() {\n"
" this.#a = 1;\n"
" }\n"
" }\n"
"\n"
" class B {\n"
" #a = 1;\n"
" }\n"
" new A;\n"
" new B;\n"
"}\n",
"{\n"
" class A extends class {} {\n"
" #a;\n"
" constructor() {\n"
" super();\n"
" this.#a = 1;\n"
" }\n"
" }\n"
"\n"
" class B extends class {} {\n"
" #a = 1;\n"
" #b = this.#a;\n"
" foo() { return this.#a; }\n"
" bar(v) { this.#b = v; }\n"
" constructor() {\n"
" super();\n"
" this.foo();\n"
" this.bar(3);\n"
" }\n"
" }\n"
"\n"
" class C extends B {\n"
" #a = 2;\n"
" constructor() {\n"
" (() => super())();\n"
" }\n"
" }\n"
"\n"
" new A;\n"
" new B;\n"
" new C;\n"
"};\n"};
CHECK(CompareTexts(BuildActual(printer, snippets),
LoadGolden("PrivateClassFields.golden")));
i::FLAG_harmony_private_fields = old_flag;
}
TEST(StaticClassFields) {
bool old_flag = i::FLAG_harmony_public_fields;
bool old_static_flag = i::FLAG_harmony_static_fields;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment