On Thu, Oct 23, 2025, at 08:41, Edmond Dantes wrote:
> Hi
> 
> > Assuming an awaitable is idempotent (such as the result of a coroutine), 
> > this is an infinite loop. There’s a 99.9% chance that’s unintended, which 
> > is part of the point of static analysis.
> 
> ```php
> foreach(($next = await($awaitable)) as $value) { }
> ```
> 
> executed as:
> 1. await($awaitable) - will return some value
> 2. foreach got this value
> 3. If the value has a valid interface, then foreach will iterate over it.
> 
> await($awaitable) -
> 
> It always returns only one value because under the hood it works like this:
> 
> ```
> function await(awaitable):
>     # 1) Create a waker for the current coroutine
>     waker = Waker(current_coroutine)
> 
>     # 2) Register an event handler inside the awaitable
>     handler = function(result, error):
>         waker.set_result(result, error)
>         awaitable.remove_handler(handler) # detach
>         Scheduler.enqueue(waker.coroutine)
> 
>     awaitable.add_handler(handler)
> 
>     try:
>         # 3) Suspend the current coroutine until resumed
>         Scheduler.suspend(current_coroutine)
> 
>         # 4) When the waker is triggered, return the stored result
>         return waker.get_result()
> 
>     finally:
>         # 5) Destroy/cleanup the waker object
>         waker.dispose()                  # release buffers/slots
> ```
> 
> > The RFC says that for coroutines, but not Awaitable. It is undefined.
> Sorry I can’t understand the meaning of this.
> 
> Thanks, Ed

Nowhere in the RFC does it explain how await() applies to the Awaitable 
interface, it only specifies it in the context of a coroutine.

— Rob

Reply via email to