Skip to content

Commit 4d8cf97

Browse files
committed
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.
1 parent 981dafd commit 4d8cf97

File tree

1 file changed

+4
-15
lines changed

1 file changed

+4
-15
lines changed

crates/vm/src/builtins/builtin_func.rs

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -243,21 +243,10 @@ fn vectorcall_native_function(
243243

244244
let func_args = if needs_self {
245245
let self_obj = zelf.zelf.as_ref().unwrap().clone();
246-
let total_pos = nargs + 1;
247-
let mut pos_args = Vec::with_capacity(total_pos);
248-
pos_args.push(self_obj);
249-
pos_args.extend(args.into_iter().take(nargs));
250-
251-
if let Some(kwnames_slice) = kwnames {
252-
let kwargs =
253-
FuncArgs::from_vectorcall(&pos_args, total_pos, Some(kwnames_slice)).kwargs;
254-
FuncArgs {
255-
args: pos_args,
256-
kwargs,
257-
}
258-
} else {
259-
FuncArgs::from(pos_args)
260-
}
246+
let mut all_args = Vec::with_capacity(args.len() + 1);
247+
all_args.push(self_obj);
248+
all_args.extend(args);
249+
FuncArgs::from_vectorcall(&all_args, nargs + 1, kwnames)
261250
} else {
262251
FuncArgs::from_vectorcall(&args, nargs, kwnames)
263252
};

0 commit comments

Comments
 (0)