LibJS: Cache generated bytecode for ScriptFunction

It's silly to generate new bytecode every time you call a function.
Let's just cache the code instead. :^)
This commit is contained in:
Andreas Kling 2021-06-07 15:19:48 +02:00
parent 7cbe4daa7c
commit 4ba2eb8fe5
Notes: sideshowbarker 2024-07-18 12:41:42 +09:00
2 changed files with 9 additions and 6 deletions

View file

@ -151,13 +151,15 @@ Value ScriptFunction::execute_function_body()
if (bytecode_interpreter) {
prepare_arguments();
auto block = Bytecode::Generator::generate(m_body);
VERIFY(block);
if constexpr (JS_BYTECODE_DEBUG) {
dbgln("Compiled Bytecode::Block for function '{}':", m_name);
block->dump();
if (!m_bytecode_block) {
m_bytecode_block = Bytecode::Generator::generate(m_body);
VERIFY(m_bytecode_block);
if constexpr (JS_BYTECODE_DEBUG) {
dbgln("Compiled Bytecode::Block for function '{}':", m_name);
m_bytecode_block->dump();
}
}
return bytecode_interpreter->run(*block);
return bytecode_interpreter->run(*m_bytecode_block);
} else {
OwnPtr<Interpreter> local_interpreter;
ast_interpreter = vm.interpreter_if_exists();

View file

@ -47,6 +47,7 @@ private:
FlyString m_name;
NonnullRefPtr<Statement> m_body;
const Vector<FunctionNode::Parameter> m_parameters;
OwnPtr<Bytecode::Block> m_bytecode_block;
ScopeObject* m_parent_scope { nullptr };
i32 m_function_length { 0 };
bool m_is_strict { false };