LibJS: Pass var environment binding counts through FFI

Thread the var environment binding count through the Rust and C++ SFD
metadata helpers wherever the function environment binding count already
travels. This lets CreateVariableEnvironment use the cached var
environment shape for functions with parameter expressions.
This commit is contained in:
Andreas Kling 2026-05-18 17:16:40 +02:00 committed by Andreas Kling
parent c9fa4ce695
commit cd38cdf6cf
4 changed files with 18 additions and 0 deletions

View file

@ -253,6 +253,7 @@ unsafe extern "C" {
this_value_needs_environment_resolution: bool,
function_environment_needed: bool,
function_environment_bindings_count: usize,
var_environment_bindings_count: usize,
might_need_arguments_object: bool,
contains_direct_call_to_eval: bool,
);
@ -264,6 +265,7 @@ unsafe extern "C" {
this_value_needs_environment_resolution: bool,
function_environment_needed: bool,
function_environment_bindings_count: usize,
var_environment_bindings_count: usize,
might_need_arguments_object: bool,
contains_direct_call_to_eval: bool,
);
@ -275,6 +277,7 @@ unsafe extern "C" {
this_value_needs_environment_resolution: bool,
function_environment_needed: bool,
function_environment_bindings_count: usize,
var_environment_bindings_count: usize,
might_need_arguments_object: bool,
contains_direct_call_to_eval: bool,
);
@ -474,6 +477,7 @@ unsafe fn materialize_shared_function_data(
precompiled.metadata.this_value_needs_environment_resolution;
let function_environment_needed = precompiled.metadata.function_environment_needed;
let function_environment_bindings_count = precompiled.metadata.function_environment_bindings_count;
let var_environment_bindings_count = precompiled.metadata.var_environment_bindings_count;
let might_need_arguments = precompiled.metadata.might_need_arguments;
let contains_eval = precompiled.metadata.contains_eval;
let precompiled_ptr = Box::into_raw(precompiled) as *mut c_void;
@ -484,6 +488,7 @@ unsafe fn materialize_shared_function_data(
this_value_needs_environment_resolution,
function_environment_needed,
function_environment_bindings_count,
var_environment_bindings_count,
might_need_arguments,
contains_eval,
);

View file

@ -1097,6 +1097,7 @@ unsafe fn materialize_function(
function.metadata.this_value_needs_environment_resolution,
function.metadata.function_environment_needed,
function.metadata.function_environment_bindings_count,
function.metadata.var_environment_bindings_count,
function.metadata.might_need_arguments,
function.metadata.contains_eval,
);

View file

@ -2854,6 +2854,7 @@ pub unsafe extern "C" fn rust_materialize_compiled_function(
let this_value_needs_environment_resolution = precompiled.metadata.this_value_needs_environment_resolution;
let function_environment_needed = precompiled.metadata.function_environment_needed;
let function_environment_bindings_count = precompiled.metadata.function_environment_bindings_count;
let var_environment_bindings_count = precompiled.metadata.var_environment_bindings_count;
let might_need_arguments = precompiled.metadata.might_need_arguments;
let contains_eval = precompiled.metadata.contains_eval;
let precompiled_ptr = Box::into_raw(precompiled) as *mut c_void;
@ -2864,6 +2865,7 @@ pub unsafe extern "C" fn rust_materialize_compiled_function(
this_value_needs_environment_resolution,
function_environment_needed,
function_environment_bindings_count,
var_environment_bindings_count,
might_need_arguments,
contains_eval,
);
@ -3215,6 +3217,7 @@ unsafe fn write_sfd_metadata(sfd_ptr: *mut c_void, metadata: &bytecode::generato
metadata.this_value_needs_environment_resolution,
metadata.function_environment_needed,
metadata.function_environment_bindings_count,
metadata.var_environment_bindings_count,
metadata.might_need_arguments,
metadata.contains_eval,
);
@ -3319,6 +3322,7 @@ unsafe extern "C" {
this_value_needs_environment_resolution: bool,
function_environment_needed: bool,
function_environment_bindings_count: usize,
var_environment_bindings_count: usize,
might_need_arguments_object: bool,
contains_direct_call_to_eval: bool,
);

View file

@ -1190,6 +1190,7 @@ extern "C" void rust_sfd_set_metadata(
bool this_value_needs_environment_resolution,
bool function_environment_needed,
size_t function_environment_bindings_count,
size_t var_environment_bindings_count,
bool might_need_arguments_object,
bool contains_direct_call_to_eval)
{
@ -1199,6 +1200,7 @@ extern "C" void rust_sfd_set_metadata(
shared.m_function_environment_needed = function_environment_needed;
shared.update_asm_call_metadata();
shared.m_function_environment_bindings_count = function_environment_bindings_count;
shared.m_var_environment_bindings_count = var_environment_bindings_count;
shared.m_might_need_arguments_object = might_need_arguments_object;
shared.m_contains_direct_call_to_eval = contains_direct_call_to_eval;
}
@ -1225,6 +1227,7 @@ extern "C" void rust_sfd_set_precompiled_executable(
bool this_value_needs_environment_resolution,
bool function_environment_needed,
size_t function_environment_bindings_count,
size_t var_environment_bindings_count,
bool might_need_arguments_object,
bool contains_direct_call_to_eval)
{
@ -1235,6 +1238,7 @@ extern "C" void rust_sfd_set_precompiled_executable(
shared.m_this_value_needs_environment_resolution = this_value_needs_environment_resolution;
shared.m_function_environment_needed = function_environment_needed;
shared.m_function_environment_bindings_count = function_environment_bindings_count;
shared.m_var_environment_bindings_count = var_environment_bindings_count;
shared.m_might_need_arguments_object = might_need_arguments_object;
shared.m_contains_direct_call_to_eval = contains_direct_call_to_eval;
shared.set_executable(executable);
@ -1251,6 +1255,7 @@ extern "C" void rust_sfd_set_cached_bytecode_executable(
bool this_value_needs_environment_resolution,
bool function_environment_needed,
size_t function_environment_bindings_count,
size_t var_environment_bindings_count,
bool might_need_arguments_object,
bool contains_direct_call_to_eval)
{
@ -1260,6 +1265,7 @@ extern "C" void rust_sfd_set_cached_bytecode_executable(
shared.m_this_value_needs_environment_resolution = this_value_needs_environment_resolution;
shared.m_function_environment_needed = function_environment_needed;
shared.m_function_environment_bindings_count = function_environment_bindings_count;
shared.m_var_environment_bindings_count = var_environment_bindings_count;
shared.m_might_need_arguments_object = might_need_arguments_object;
shared.m_contains_direct_call_to_eval = contains_direct_call_to_eval;
shared.m_cached_bytecode_executable = cached_executable_ptr;
@ -1273,6 +1279,7 @@ extern "C" void rust_sfd_set_precompiled_bytecode_executable(
bool this_value_needs_environment_resolution,
bool function_environment_needed,
size_t function_environment_bindings_count,
size_t var_environment_bindings_count,
bool might_need_arguments_object,
bool contains_direct_call_to_eval)
{
@ -1282,6 +1289,7 @@ extern "C" void rust_sfd_set_precompiled_bytecode_executable(
shared.m_this_value_needs_environment_resolution = this_value_needs_environment_resolution;
shared.m_function_environment_needed = function_environment_needed;
shared.m_function_environment_bindings_count = function_environment_bindings_count;
shared.m_var_environment_bindings_count = var_environment_bindings_count;
shared.m_might_need_arguments_object = might_need_arguments_object;
shared.m_contains_direct_call_to_eval = contains_direct_call_to_eval;
shared.m_precompiled_bytecode_executable = precompiled_executable_ptr;