Skip to content

Commit b8a1d72

Browse files
committed
Use datastack path for __init__ dispatch in CallAllocAndEnterInit
specialization_run_init used prepare_exact_args_frame which heap-allocates a FrameObject with 4-5 atomic refcount bumps per call. Switch to invoke_prepared_exact_args which uses InterpreterFrame::new_on_datastack with zero refcount bumps. CallAllocAndEnterInit already guards against tracing (eval_frame_active) and recursion limits before reaching this path. Assisted-by: Claude
1 parent 74ae2d4 commit b8a1d72

2 files changed

Lines changed: 2 additions & 5 deletions

File tree

crates/vm/src/builtins/function.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -791,7 +791,7 @@ impl Py<PyFunction> {
791791
frame
792792
}
793793

794-
fn invoke_prepared_exact_args(
794+
pub(crate) fn invoke_prepared_exact_args(
795795
&self,
796796
args: impl ExactSizeIterator<Item = PyObjectRef>,
797797
vm: &VirtualMachine,

crates/vm/src/frame.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2673,10 +2673,7 @@ impl ExecutingFrame<'_> {
26732673
.iter_mut()
26742674
.map(|slot| slot.take().expect("arg slot must be filled"));
26752675

2676-
let init_frame = init_func.prepare_exact_args_frame(taken, vm);
2677-
let init_result = vm.run_frame(init_frame.clone());
2678-
release_datastack_frame(&init_frame, vm);
2679-
let init_result = init_result?;
2676+
let init_result = init_func.invoke_prepared_exact_args(taken, vm)?;
26802677

26812678
if !vm.is_none(&init_result) {
26822679
return Err(vm.new_type_error(format!(

0 commit comments

Comments
 (0)