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

Function task_eager_start

crates/stdlib/src/_asyncio.rs:1950–2018  ·  view source on GitHub ↗

Eager start: run first step synchronously

(zelf: &PyRef<PyTask>, vm: &VirtualMachine)

Source from the content-addressed store, hash-verified

1948
1949 /// Eager start: run first step synchronously
1950 fn task_eager_start(zelf: &PyRef<PyTask>, vm: &VirtualMachine) -> PyResult<()> {
1951 let loop_obj = zelf.base.fut_loop.read().clone();
1952 let loop_obj = match loop_obj {
1953 Some(l) => l,
1954 None => return Err(vm.new_runtime_error("Task has no loop")),
1955 };
1956
1957 // Register task before running step
1958 let task_obj: PyObjectRef = zelf.clone().into();
1959 _register_task(task_obj.clone(), vm)?;
1960
1961 // Register as eager task
1962 _register_eager_task(task_obj.clone(), vm)?;
1963
1964 // Swap current task - save previous task
1965 let prev_task = _swap_current_task(loop_obj.clone(), task_obj.clone(), vm)?;
1966
1967 // Get coro and context
1968 let coro = zelf.task_coro.read().clone();
1969 let context = zelf.task_context.read().clone();
1970
1971 // Run the first step with context (using context.run(callable, *args))
1972 let step_result = if let Some(ctx) = context {
1973 // Call context.run(coro.send, None)
1974 let coro_ref = match coro {
1975 Some(c) => c,
1976 None => {
1977 let _ = _swap_current_task(loop_obj.clone(), prev_task, vm);
1978 _unregister_eager_task(task_obj.clone(), vm)?;
1979 return Ok(());
1980 }
1981 };
1982 let send_method = coro_ref.get_attr(vm.ctx.intern_str("send"), vm)?;
1983 vm.call_method(&ctx, "run", (send_method, vm.ctx.none()))
1984 } else {
1985 // Run without context
1986 match coro {
1987 Some(c) => vm.call_method(&c, "send", (vm.ctx.none(),)),
1988 None => {
1989 let _ = _swap_current_task(loop_obj.clone(), prev_task, vm);
1990 _unregister_eager_task(task_obj.clone(), vm)?;
1991 return Ok(());
1992 }
1993 }
1994 };
1995
1996 // Restore previous task
1997 let _ = _swap_current_task(loop_obj.clone(), prev_task, vm);
1998
1999 // Unregister from eager tasks
2000 _unregister_eager_task(task_obj.clone(), vm)?;
2001
2002 // Handle the result
2003 match step_result {
2004 Ok(result) => {
2005 task_step_handle_result(zelf, result, vm)?;
2006 }
2007 Err(e) => {

Callers 1

py_initMethod · 0.85

Calls 15

task_step_handle_resultFunction · 0.85
intern_strMethod · 0.80
noneMethod · 0.80
_register_taskFunction · 0.70
_register_eager_taskFunction · 0.70
_swap_current_taskFunction · 0.70
_unregister_eager_taskFunction · 0.70
ErrClass · 0.50
cloneMethod · 0.45
readMethod · 0.45
get_attrMethod · 0.45

Tested by

no test coverage detected