(
func: &PyFunction,
func_args: &FuncArgs,
jitted_code: &'a CompiledCode,
vm: &VirtualMachine,
)
| 152 | /// `fill_locals_from_args` which will raise the actual exception if needed. |
| 153 | #[cfg(feature = "jit")] |
| 154 | pub(crate) fn get_jit_args<'a>( |
| 155 | func: &PyFunction, |
| 156 | func_args: &FuncArgs, |
| 157 | jitted_code: &'a CompiledCode, |
| 158 | vm: &VirtualMachine, |
| 159 | ) -> Result<Args<'a>, ArgsError> { |
| 160 | let mut jit_args = jitted_code.args_builder(); |
| 161 | let nargs = func_args.args.len(); |
| 162 | |
| 163 | let code: &Py<PyCode> = &func.code; |
| 164 | let arg_names = code.arg_names(); |
| 165 | let arg_count = code.arg_count; |
| 166 | let posonlyarg_count = code.posonlyarg_count; |
| 167 | |
| 168 | if nargs > arg_count as usize || nargs < posonlyarg_count as usize { |
| 169 | return Err(ArgsError::WrongNumberOfArgs); |
| 170 | } |
| 171 | |
| 172 | // Add positional arguments |
| 173 | for i in 0..nargs { |
| 174 | jit_args.set(i, get_jit_value(vm, &func_args.args[i])?)?; |
| 175 | } |
| 176 | |
| 177 | // Handle keyword arguments |
| 178 | for (name, value) in &func_args.kwargs { |
| 179 | let arg_pos = |
| 180 | |args: &[&PyStrInterned], name: &str| args.iter().position(|arg| arg.as_str() == name); |
| 181 | if let Some(arg_idx) = arg_pos(arg_names.args, name) { |
| 182 | if jit_args.is_set(arg_idx) { |
| 183 | return Err(ArgsError::ArgPassedMultipleTimes); |
| 184 | } |
| 185 | jit_args.set(arg_idx, get_jit_value(vm, value)?)?; |
| 186 | } else if let Some(kwarg_idx) = arg_pos(arg_names.kwonlyargs, name) { |
| 187 | let arg_idx = kwarg_idx + arg_count as usize; |
| 188 | if jit_args.is_set(arg_idx) { |
| 189 | return Err(ArgsError::ArgPassedMultipleTimes); |
| 190 | } |
| 191 | jit_args.set(arg_idx, get_jit_value(vm, value)?)?; |
| 192 | } else { |
| 193 | return Err(ArgsError::NotAKeywordArg); |
| 194 | } |
| 195 | } |
| 196 | |
| 197 | let (defaults, kwdefaults) = func.defaults_and_kwdefaults.lock().clone(); |
| 198 | |
| 199 | // fill in positional defaults |
| 200 | if let Some(defaults) = defaults { |
| 201 | for (i, default) in defaults.iter().enumerate() { |
| 202 | let arg_idx = i + arg_count as usize - defaults.len(); |
| 203 | if !jit_args.is_set(arg_idx) { |
| 204 | jit_args.set(arg_idx, get_jit_value(vm, default)?)?; |
| 205 | } |
| 206 | } |
| 207 | } |
| 208 | |
| 209 | // fill in keyword only defaults |
| 210 | if let Some(kw_only_defaults) = kwdefaults { |
| 211 | for (i, name) in arg_names.kwonlyargs.iter().enumerate() { |
no test coverage detected