mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-05-03 01:38:52 +00:00
LibJS: Stop using execute_ast_node() for class property evaluation
Instead, generate bytecode to execute their AST nodes and save the resulting operands inside the NewClass instruction. Moving property expression evaluation to happen before NewClass execution also moves along creation of new private environment and its population with private members (private members should be visible during property evaluation). Before: - NewClass After: - CreatePrivateEnvironment - AddPrivateName - ... - AddPrivateName - NewClass - LeavePrivateEnvironment
This commit is contained in:
parent
b46fc47bf7
commit
6fb1d9e516
Notes:
sideshowbarker
2024-07-17 03:10:07 +09:00
Author: https://github.com/kalenikaliaksandr
Commit: 6fb1d9e516
Pull-request: https://github.com/SerenityOS/serenity/pull/24290
9 changed files with 153 additions and 36 deletions
|
@ -547,6 +547,7 @@ FLATTEN_ON_CLANG void Interpreter::run_bytecode(size_t entry_point)
|
|||
}
|
||||
|
||||
HANDLE_INSTRUCTION(Add);
|
||||
HANDLE_INSTRUCTION_WITHOUT_EXCEPTION_CHECK(AddPrivateName);
|
||||
HANDLE_INSTRUCTION(ArrayAppend);
|
||||
HANDLE_INSTRUCTION(AsyncIteratorClose);
|
||||
HANDLE_INSTRUCTION(BitwiseAnd);
|
||||
|
@ -561,6 +562,7 @@ FLATTEN_ON_CLANG void Interpreter::run_bytecode(size_t entry_point)
|
|||
HANDLE_INSTRUCTION(CopyObjectExcludingProperties);
|
||||
HANDLE_INSTRUCTION_WITHOUT_EXCEPTION_CHECK(CreateLexicalEnvironment);
|
||||
HANDLE_INSTRUCTION_WITHOUT_EXCEPTION_CHECK(CreateVariableEnvironment);
|
||||
HANDLE_INSTRUCTION_WITHOUT_EXCEPTION_CHECK(CreatePrivateEnvironment);
|
||||
HANDLE_INSTRUCTION(CreateVariable);
|
||||
HANDLE_INSTRUCTION(CreateRestParams);
|
||||
HANDLE_INSTRUCTION(CreateArguments);
|
||||
|
@ -601,6 +603,7 @@ FLATTEN_ON_CLANG void Interpreter::run_bytecode(size_t entry_point)
|
|||
HANDLE_INSTRUCTION(IteratorToArray);
|
||||
HANDLE_INSTRUCTION_WITHOUT_EXCEPTION_CHECK(LeaveFinally);
|
||||
HANDLE_INSTRUCTION_WITHOUT_EXCEPTION_CHECK(LeaveLexicalEnvironment);
|
||||
HANDLE_INSTRUCTION_WITHOUT_EXCEPTION_CHECK(LeavePrivateEnvironment);
|
||||
HANDLE_INSTRUCTION_WITHOUT_EXCEPTION_CHECK(LeaveUnwindContext);
|
||||
HANDLE_INSTRUCTION(LeftShift);
|
||||
HANDLE_INSTRUCTION(LessThan);
|
||||
|
@ -1140,6 +1143,12 @@ void NewPrimitiveArray::execute_impl(Bytecode::Interpreter& interpreter) const
|
|||
interpreter.set(dst(), array);
|
||||
}
|
||||
|
||||
void AddPrivateName::execute_impl(Bytecode::Interpreter& interpreter) const
|
||||
{
|
||||
auto const& name = interpreter.current_executable().get_identifier(m_name);
|
||||
interpreter.vm().running_execution_context().private_environment->add_private_name(name);
|
||||
}
|
||||
|
||||
ThrowCompletionOr<void> ArrayAppend::execute_impl(Bytecode::Interpreter& interpreter) const
|
||||
{
|
||||
return append(interpreter.vm(), interpreter.get(dst()), interpreter.get(src()), m_is_spread);
|
||||
|
@ -1266,6 +1275,13 @@ void CreateLexicalEnvironment::execute_impl(Bytecode::Interpreter& interpreter)
|
|||
running_execution_context.saved_lexical_environments.append(make_and_swap_envs(running_execution_context.lexical_environment));
|
||||
}
|
||||
|
||||
void CreatePrivateEnvironment::execute_impl(Bytecode::Interpreter& interpreter) const
|
||||
{
|
||||
auto& running_execution_context = interpreter.vm().running_execution_context();
|
||||
auto outer_private_environment = running_execution_context.private_environment;
|
||||
running_execution_context.private_environment = new_private_environment(interpreter.vm(), outer_private_environment);
|
||||
}
|
||||
|
||||
ThrowCompletionOr<void> CreateVariableEnvironment::execute_impl(Bytecode::Interpreter& interpreter) const
|
||||
{
|
||||
auto& running_execution_context = interpreter.vm().running_execution_context();
|
||||
|
@ -1754,6 +1770,12 @@ void LeaveLexicalEnvironment::execute_impl(Bytecode::Interpreter& interpreter) c
|
|||
running_execution_context.lexical_environment = running_execution_context.saved_lexical_environments.take_last();
|
||||
}
|
||||
|
||||
void LeavePrivateEnvironment::execute_impl(Bytecode::Interpreter& interpreter) const
|
||||
{
|
||||
auto& running_execution_context = interpreter.vm().running_execution_context();
|
||||
running_execution_context.private_environment = running_execution_context.private_environment->outer_environment();
|
||||
}
|
||||
|
||||
void LeaveUnwindContext::execute_impl(Bytecode::Interpreter& interpreter) const
|
||||
{
|
||||
interpreter.leave_unwind_context();
|
||||
|
@ -1923,7 +1945,14 @@ ThrowCompletionOr<void> NewClass::execute_impl(Bytecode::Interpreter& interprete
|
|||
Value super_class;
|
||||
if (m_super_class.has_value())
|
||||
super_class = interpreter.get(m_super_class.value());
|
||||
interpreter.set(dst(), TRY(new_class(interpreter.vm(), super_class, m_class_expression, m_lhs_name)));
|
||||
Vector<Value> element_keys;
|
||||
for (size_t i = 0; i < m_element_keys_count; ++i) {
|
||||
Value element_key;
|
||||
if (m_element_keys[i].has_value())
|
||||
element_key = interpreter.get(m_element_keys[i].value());
|
||||
element_keys.append(element_key);
|
||||
}
|
||||
interpreter.set(dst(), TRY(new_class(interpreter.vm(), super_class, m_class_expression, m_lhs_name, element_keys)));
|
||||
return {};
|
||||
}
|
||||
|
||||
|
@ -1969,6 +1998,11 @@ ByteString NewPrimitiveArray::to_byte_string_impl(Bytecode::Executable const& ex
|
|||
format_value_list("elements"sv, elements()));
|
||||
}
|
||||
|
||||
ByteString AddPrivateName::to_byte_string_impl(Bytecode::Executable const& executable) const
|
||||
{
|
||||
return ByteString::formatted("AddPrivateName {}"sv, executable.identifier_table->get(m_name));
|
||||
}
|
||||
|
||||
ByteString ArrayAppend::to_byte_string_impl(Bytecode::Executable const& executable) const
|
||||
{
|
||||
return ByteString::formatted("Append {}, {}{}",
|
||||
|
@ -2052,6 +2086,11 @@ ByteString CreateLexicalEnvironment::to_byte_string_impl(Bytecode::Executable co
|
|||
return "CreateLexicalEnvironment"sv;
|
||||
}
|
||||
|
||||
ByteString CreatePrivateEnvironment::to_byte_string_impl(Bytecode::Executable const&) const
|
||||
{
|
||||
return "CreatePrivateEnvironment"sv;
|
||||
}
|
||||
|
||||
ByteString CreateVariableEnvironment::to_byte_string_impl(Bytecode::Executable const&) const
|
||||
{
|
||||
return "CreateVariableEnvironment"sv;
|
||||
|
@ -2421,6 +2460,11 @@ ByteString LeaveLexicalEnvironment::to_byte_string_impl(Bytecode::Executable con
|
|||
return "LeaveLexicalEnvironment"sv;
|
||||
}
|
||||
|
||||
ByteString LeavePrivateEnvironment::to_byte_string_impl(Bytecode::Executable const&) const
|
||||
{
|
||||
return "LeavePrivateEnvironment"sv;
|
||||
}
|
||||
|
||||
ByteString LeaveUnwindContext::to_byte_string_impl(Bytecode::Executable const&) const
|
||||
{
|
||||
return "LeaveUnwindContext";
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue