Hi, Antoine:
Say I have (Python notation):
def coroutine(n):
for i in range(n):
yield idef consumer(n):
for val in coroutine(n):
# do something with valHow does consumer() know the coroutine has exited after the n'th
iteration? It can't call @coro.done() as there is a single suspend
point...
There is a single suspend point at a python level, but not, necessarily, at LLVM
level. I would inject two more suspend points in your python frontend, so the
LLVM looks like this:
Iterator coroutine(int n) {
int current_value;
CORO_BEGIN(..., ¤t_value); // designate current_value as promise
SUSPEND(); // coroutine starts suspended
for (int i = 0; i < n; ++i) {
curren_value = i; SUSPEND(); // yield i
}
SUSPEND(/*final=*/true);
...
}
int __next__(void* hdl) {
coro.resume(hdl);
if (coro.done(hdl)) throw StopIteration();
return *(int*)coro.promise(hdl);
}
Essentially, for every generator, you always insert an initial suspend point
before any user authored code and you insert a final suspend point after all
the user authored code.
Gor