MCPcopy Index your code
hub / github.com/RustPython/RustPython / get_jit_args

Function get_jit_args

crates/vm/src/builtins/function/jit.rs:154–224  ·  view source on GitHub ↗
(
    func: &PyFunction,
    func_args: &FuncArgs,
    jitted_code: &'a CompiledCode,
    vm: &VirtualMachine,
)

Source from the content-addressed store, hash-verified

152/// `fill_locals_from_args` which will raise the actual exception if needed.
153#[cfg(feature = "jit")]
154pub(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() {

Callers 1

invoke_with_localsMethod · 0.85

Calls 14

get_jit_valueFunction · 0.85
args_builderMethod · 0.80
arg_namesMethod · 0.80
ErrClass · 0.50
lenMethod · 0.45
setMethod · 0.45
positionMethod · 0.45
iterMethod · 0.45
as_strMethod · 0.45
is_setMethod · 0.45
cloneMethod · 0.45
lockMethod · 0.45

Tested by

no test coverage detected