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

Method invoke_with_locals

crates/vm/src/builtins/function.rs:533–611  ·  view source on GitHub ↗
(
        &self,
        func_args: FuncArgs,
        locals: Option<ArgMapping>,
        vm: &VirtualMachine,
    )

Source from the content-addressed store, hash-verified

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);

Callers 2

__build_class__Function · 0.80
invokeMethod · 0.80

Calls 15

get_jit_argsFunction · 0.85
newFunction · 0.85
fill_locals_from_argsMethod · 0.80
set_generatorMethod · 0.80
run_frameMethod · 0.80
datastack_popMethod · 0.80
SomeClass · 0.50
as_refMethod · 0.45
lockMethod · 0.45
to_pyobjectMethod · 0.45
invokeMethod · 0.45

Tested by

no test coverage detected