Skip to content
Merged
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
Fix vectorcall_native_function kwarg slice out-of-bounds
When needs_self was true and kwargs were present, pos_args only
contained positional args (self + original positionals) but
from_vectorcall expected kwarg values to follow in the slice.

Build the full args array (self + all original args including kwarg
values) before passing to from_vectorcall.
  • Loading branch information
youknowone committed Mar 3, 2026
commit 4d8cf97452fd9f9dad64832a20d56a9d46fc4a10
19 changes: 4 additions & 15 deletions crates/vm/src/builtins/builtin_func.rs
Original file line number Diff line number Diff line change
Expand Up @@ -243,21 +243,10 @@ fn vectorcall_native_function(

let func_args = if needs_self {
let self_obj = zelf.zelf.as_ref().unwrap().clone();
let total_pos = nargs + 1;
let mut pos_args = Vec::with_capacity(total_pos);
pos_args.push(self_obj);
pos_args.extend(args.into_iter().take(nargs));

if let Some(kwnames_slice) = kwnames {
let kwargs =
FuncArgs::from_vectorcall(&pos_args, total_pos, Some(kwnames_slice)).kwargs;
FuncArgs {
args: pos_args,
kwargs,
}
} else {
FuncArgs::from(pos_args)
}
let mut all_args = Vec::with_capacity(args.len() + 1);
all_args.push(self_obj);
all_args.extend(args);
FuncArgs::from_vectorcall(&all_args, nargs + 1, kwnames)
} else {
FuncArgs::from_vectorcall(&args, nargs, kwnames)
};
Expand Down
Loading