mirror of
https://github.com/LadybirdBrowser/ladybird
synced 2026-04-26 01:35:08 +02:00
LibJS+LibWeb: Join arguments into vector of registers+constants+locals
This is better because: - Better data locality - Allocate vector for registers+constants+locals+arguments in one go instead of allocating two vectors separately
This commit is contained in:
committed by
Andreas Kling
parent
cd9e491742
commit
c6cd03d7ca
Notes:
github-actions[bot]
2025-04-24 08:32:31 +00:00
Author: https://github.com/kalenikaliaksandr Commit: https://github.com/LadybirdBrowser/ladybird/commit/c6cd03d7ca8 Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/4434 Reviewed-by: https://github.com/alimpfard
@@ -500,15 +500,17 @@ ThrowCompletionOr<Value> ECMAScriptFunctionObject::internal_call(Value this_argu
|
||||
m_bytecode_executable = ecmascript_code().bytecode_executable();
|
||||
}
|
||||
|
||||
auto callee_context = ExecutionContext::create(m_bytecode_executable->number_of_registers + m_bytecode_executable->constants.size() + m_bytecode_executable->local_variable_names.size());
|
||||
u32 arguments_count = max(arguments_list.size(), formal_parameters().size());
|
||||
auto callee_context = ExecutionContext::create(m_bytecode_executable->number_of_registers + m_bytecode_executable->constants.size() + m_bytecode_executable->local_variable_names.size(), arguments_count);
|
||||
|
||||
// Non-standard
|
||||
callee_context->arguments.ensure_capacity(max(arguments_list.size(), formal_parameters().size()));
|
||||
callee_context->arguments.append(arguments_list.data(), arguments_list.size());
|
||||
auto arguments = callee_context->arguments();
|
||||
if (!arguments_list.is_empty())
|
||||
arguments.overwrite(0, arguments_list.data(), arguments_list.size() * sizeof(Value));
|
||||
callee_context->passed_argument_count = arguments_list.size();
|
||||
if (arguments_list.size() < formal_parameters().size()) {
|
||||
for (size_t i = arguments_list.size(); i < formal_parameters().size(); ++i)
|
||||
callee_context->arguments.append(js_undefined());
|
||||
arguments[i] = js_undefined();
|
||||
}
|
||||
|
||||
// 2. Let calleeContext be PrepareForOrdinaryCall(F, undefined).
|
||||
@@ -568,15 +570,17 @@ ThrowCompletionOr<GC::Ref<Object>> ECMAScriptFunctionObject::internal_construct(
|
||||
m_bytecode_executable = ecmascript_code().bytecode_executable();
|
||||
}
|
||||
|
||||
auto callee_context = ExecutionContext::create(m_bytecode_executable->number_of_registers + m_bytecode_executable->constants.size() + m_bytecode_executable->local_variable_names.size());
|
||||
u32 arguments_count = max(arguments_list.size(), formal_parameters().size());
|
||||
auto callee_context = ExecutionContext::create(m_bytecode_executable->number_of_registers + m_bytecode_executable->constants.size() + m_bytecode_executable->local_variable_names.size(), arguments_count);
|
||||
|
||||
// Non-standard
|
||||
callee_context->arguments.ensure_capacity(max(arguments_list.size(), formal_parameters().size()));
|
||||
callee_context->arguments.append(arguments_list.data(), arguments_list.size());
|
||||
auto arguments = callee_context->arguments();
|
||||
if (!arguments_list.is_empty())
|
||||
arguments.overwrite(0, arguments_list.data(), arguments_list.size() * sizeof(Value));
|
||||
callee_context->passed_argument_count = arguments_list.size();
|
||||
if (arguments_list.size() < formal_parameters().size()) {
|
||||
for (size_t i = arguments_list.size(); i < formal_parameters().size(); ++i)
|
||||
callee_context->arguments.append(js_undefined());
|
||||
arguments[i] = js_undefined();
|
||||
}
|
||||
|
||||
// 1. Let callerContext be the running execution context.
|
||||
|
||||
Reference in New Issue
Block a user