Skip to content

Commit 4a91e0a

Browse files
committed
Use from_vectorcall_owned in descriptor/type vectorcall, add stack debug_asserts
1 parent 714e8af commit 4a91e0a

File tree

3 files changed

+14
-5
lines changed

3 files changed

+14
-5
lines changed

crates/vm/src/builtins/descriptor.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -435,14 +435,14 @@ fn vectorcall_method_descriptor(
435435
vm: &VirtualMachine,
436436
) -> PyResult {
437437
let zelf: &Py<PyMethodDescriptor> = zelf_obj.downcast_ref().unwrap();
438-
let func_args = FuncArgs::from_vectorcall(&args, nargs, kwnames);
438+
let func_args = FuncArgs::from_vectorcall_owned(args, nargs, kwnames);
439439
(zelf.method.func)(vm, func_args)
440440
}
441441

442442
/// Vectorcall for wrapper_descriptor: calls wrapped slot function
443443
fn vectorcall_wrapper(
444444
zelf_obj: &PyObject,
445-
args: Vec<PyObjectRef>,
445+
mut args: Vec<PyObjectRef>,
446446
nargs: usize,
447447
kwnames: Option<&[PyObjectRef]>,
448448
vm: &VirtualMachine,
@@ -456,7 +456,7 @@ fn vectorcall_wrapper(
456456
zelf.typ.name()
457457
)));
458458
}
459-
let obj = args[0].clone();
459+
let obj = args.remove(0);
460460
if !obj.fast_isinstance(zelf.typ) {
461461
return Err(vm.new_type_error(format!(
462462
"descriptor '{}' requires a '{}' object but received a '{}'",
@@ -465,7 +465,7 @@ fn vectorcall_wrapper(
465465
obj.class().name()
466466
)));
467467
}
468-
let rest = FuncArgs::from_vectorcall(&args[1..], nargs - 1, kwnames);
468+
let rest = FuncArgs::from_vectorcall_owned(args, nargs - 1, kwnames);
469469
zelf.wrapped.call(obj, rest, vm)
470470
}
471471

crates/vm/src/builtins/type.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2356,7 +2356,7 @@ fn vectorcall_type(
23562356
}
23572357

23582358
// Fallback: construct FuncArgs and use standard call
2359-
let func_args = FuncArgs::from_vectorcall(&args, nargs, kwnames);
2359+
let func_args = FuncArgs::from_vectorcall_owned(args, nargs, kwnames);
23602360
PyType::call(zelf, func_args, vm)
23612361
}
23622362

crates/vm/src/frame.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5673,6 +5673,10 @@ impl ExecutingFrame<'_> {
56735673
fn execute_call_vectorcall(&mut self, nargs: u32, vm: &VirtualMachine) -> FrameResult {
56745674
let nargs_usize = nargs as usize;
56755675
let stack_len = self.state.stack.len();
5676+
debug_assert!(
5677+
stack_len >= nargs_usize + 2,
5678+
"CALL stack underflow: need callable + self_or_null + {nargs_usize} args, have {stack_len}"
5679+
);
56765680
let callable_idx = stack_len - nargs_usize - 2;
56775681
let self_or_null_idx = stack_len - nargs_usize - 1;
56785682
let args_start = stack_len - nargs_usize;
@@ -5717,8 +5721,13 @@ impl ExecutingFrame<'_> {
57175721
.downcast_ref::<PyTuple>()
57185722
.expect("kwarg names should be tuple");
57195723
let kw_count = kwarg_names_tuple.len();
5724+
debug_assert!(kw_count <= nargs_usize, "CALL_KW kw_count exceeds nargs");
57205725

57215726
let stack_len = self.state.stack.len();
5727+
debug_assert!(
5728+
stack_len >= nargs_usize + 2,
5729+
"CALL_KW stack underflow: need callable + self_or_null + {nargs_usize} args, have {stack_len}"
5730+
);
57225731
let callable_idx = stack_len - nargs_usize - 2;
57235732
let self_or_null_idx = stack_len - nargs_usize - 1;
57245733
let args_start = stack_len - nargs_usize;

0 commit comments

Comments
 (0)