Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Use from_vectorcall_owned in descriptor/type vectorcall, add stack de…
…bug_asserts
  • Loading branch information
youknowone committed Mar 4, 2026
commit c47d1f2d9a82b368588f7e1e8b9665c30a7927cb
8 changes: 4 additions & 4 deletions crates/vm/src/builtins/descriptor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -435,14 +435,14 @@ fn vectorcall_method_descriptor(
vm: &VirtualMachine,
) -> PyResult {
let zelf: &Py<PyMethodDescriptor> = zelf_obj.downcast_ref().unwrap();
let func_args = FuncArgs::from_vectorcall(&args, nargs, kwnames);
let func_args = FuncArgs::from_vectorcall_owned(args, nargs, kwnames);
(zelf.method.func)(vm, func_args)
}

/// Vectorcall for wrapper_descriptor: calls wrapped slot function
fn vectorcall_wrapper(
zelf_obj: &PyObject,
args: Vec<PyObjectRef>,
mut args: Vec<PyObjectRef>,
nargs: usize,
kwnames: Option<&[PyObjectRef]>,
vm: &VirtualMachine,
Expand All @@ -456,7 +456,7 @@ fn vectorcall_wrapper(
zelf.typ.name()
)));
}
let obj = args[0].clone();
let obj = args.remove(0);
if !obj.fast_isinstance(zelf.typ) {
return Err(vm.new_type_error(format!(
"descriptor '{}' requires a '{}' object but received a '{}'",
Expand All @@ -465,7 +465,7 @@ fn vectorcall_wrapper(
obj.class().name()
)));
}
let rest = FuncArgs::from_vectorcall(&args[1..], nargs - 1, kwnames);
let rest = FuncArgs::from_vectorcall_owned(args, nargs - 1, kwnames);
zelf.wrapped.call(obj, rest, vm)
}

Expand Down
2 changes: 1 addition & 1 deletion crates/vm/src/builtins/type.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2359,7 +2359,7 @@ fn vectorcall_type(
}

// Fallback: construct FuncArgs and use standard call
let func_args = FuncArgs::from_vectorcall(&args, nargs, kwnames);
let func_args = FuncArgs::from_vectorcall_owned(args, nargs, kwnames);
PyType::call(zelf, func_args, vm)
}

Expand Down
9 changes: 9 additions & 0 deletions crates/vm/src/frame.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5603,6 +5603,10 @@ impl ExecutingFrame<'_> {
fn execute_call_vectorcall(&mut self, nargs: u32, vm: &VirtualMachine) -> FrameResult {
let nargs_usize = nargs as usize;
let stack_len = self.state.stack.len();
debug_assert!(
stack_len >= nargs_usize + 2,
"CALL stack underflow: need callable + self_or_null + {nargs_usize} args, have {stack_len}"
);
let callable_idx = stack_len - nargs_usize - 2;
let self_or_null_idx = stack_len - nargs_usize - 1;
let args_start = stack_len - nargs_usize;
Expand Down Expand Up @@ -5647,8 +5651,13 @@ impl ExecutingFrame<'_> {
.downcast_ref::<PyTuple>()
.expect("kwarg names should be tuple");
let kw_count = kwarg_names_tuple.len();
debug_assert!(kw_count <= nargs_usize, "CALL_KW kw_count exceeds nargs");

let stack_len = self.state.stack.len();
debug_assert!(
stack_len >= nargs_usize + 2,
"CALL_KW stack underflow: need callable + self_or_null + {nargs_usize} args, have {stack_len}"
);
let callable_idx = stack_len - nargs_usize - 2;
let self_or_null_idx = stack_len - nargs_usize - 1;
let args_start = stack_len - nargs_usize;
Expand Down