(
&self,
func_args: FuncArgs,
locals: Option<ArgMapping>,
vm: &VirtualMachine,
)
| 531 | } |
| 532 | |
| 533 | pub fn invoke_with_locals( |
| 534 | &self, |
| 535 | func_args: FuncArgs, |
| 536 | locals: Option<ArgMapping>, |
| 537 | vm: &VirtualMachine, |
| 538 | ) -> PyResult { |
| 539 | #[cfg(feature = "jit")] |
| 540 | if let Some(jitted_code) = self.jitted_code.lock().as_ref() { |
| 541 | use crate::convert::ToPyObject; |
| 542 | match jit::get_jit_args(self, &func_args, jitted_code, vm) { |
| 543 | Ok(args) => { |
| 544 | return Ok(args.invoke().to_pyobject(vm)); |
| 545 | } |
| 546 | Err(err) => info!( |
| 547 | "jit: function `{}` is falling back to being interpreted because of the \ |
| 548 | error: {}", |
| 549 | self.code.obj_name, err |
| 550 | ), |
| 551 | } |
| 552 | } |
| 553 | |
| 554 | let code: PyRef<PyCode> = (*self.code).to_owned(); |
| 555 | |
| 556 | let locals = if code.flags.contains(bytecode::CodeFlags::NEWLOCALS) { |
| 557 | None |
| 558 | } else if let Some(locals) = locals { |
| 559 | Some(locals) |
| 560 | } else { |
| 561 | Some(ArgMapping::from_dict_exact(self.globals.clone())) |
| 562 | }; |
| 563 | |
| 564 | let is_gen = code.flags.contains(bytecode::CodeFlags::GENERATOR); |
| 565 | let is_coro = code.flags.contains(bytecode::CodeFlags::COROUTINE); |
| 566 | let use_datastack = !(is_gen || is_coro); |
| 567 | |
| 568 | // Construct frame: |
| 569 | let frame = Frame::new( |
| 570 | code, |
| 571 | Scope::new(locals, self.globals.clone()), |
| 572 | self.builtins.clone(), |
| 573 | self.closure.as_ref().map_or(&[], |c| c.as_slice()), |
| 574 | Some(self.to_owned().into()), |
| 575 | use_datastack, |
| 576 | vm, |
| 577 | ) |
| 578 | .into_ref(&vm.ctx); |
| 579 | |
| 580 | self.fill_locals_from_args(&frame, func_args, vm)?; |
| 581 | match (is_gen, is_coro) { |
| 582 | (true, false) => { |
| 583 | let obj = PyGenerator::new(frame.clone(), self.__name__(), self.__qualname__()) |
| 584 | .into_pyobject(vm); |
| 585 | frame.set_generator(&obj); |
| 586 | Ok(obj) |
| 587 | } |
| 588 | (false, true) => { |
| 589 | let obj = PyCoroutine::new(frame.clone(), self.__name__(), self.__qualname__()) |
| 590 | .into_pyobject(vm); |
no test coverage detected