liblinux++

A hosted C++ runtime without any libc.
git clone git://henryandlizzy.uk/liblinux++
Log | Files | Refs

commit 83d715acb180f4fd7189cc8de00a8889a36abe6d
parent 9f14c4c1b95ad1cabd4d8c40fb85690740d44e90
Author: Henry Wilson <henry@henryandlizzy.uk>
Date:   Thu, 15 Jan 2026 01:48:16 +0000

coro: Tidy up

Diffstat:
Mcoro.cpp | 43+++++++++++++++++++++----------------------
1 file changed, 21 insertions(+), 22 deletions(-)

diff --git a/coro.cpp b/coro.cpp @@ -1,11 +1,5 @@ #include "linux.hpp" -struct coroutine_frame -{ - void(*resume)(coroutine_frame*) noexcept; - void(*destroy)(coroutine_frame*) noexcept; -}; - namespace std { @@ -23,32 +17,39 @@ struct coroutine_handle { } static coroutine_handle from_promise(T& promise) noexcept { - return coroutine_handle{((char*)&promise) - sizeof(coroutine_frame)}; + return from_address(reinterpret_cast<char*>(&promise) - sizeof(frame)); } void resume() const noexcept { - assert(frame); - assert(frame->resume); - frame->resume(frame); + assert(fp); + assert(fp->resume); + fp->resume(fp); } void destroy() const noexcept { - assert(frame); - assert(frame->destroy); - frame->destroy(frame); + assert(fp); + assert(fp->destroy); + fp->destroy(fp); } bool done() const noexcept { - assert(frame); - return not frame->resume; + assert(fp); + return not fp->resume; } + private: - coroutine_handle(void* ptr) noexcept : frame{reinterpret_cast<coroutine_frame*>(ptr)} {} - coroutine_frame* frame = nullptr; + struct frame + { + void(*resume)(frame*) noexcept; + void(*destroy)(frame*) noexcept; + }; + + coroutine_handle(void* ptr) noexcept : fp{reinterpret_cast<frame*>(ptr)} {} + frame* fp = nullptr; }; struct suspend_always { bool await_ready() noexcept { return false; } - template <typename T> // easier to do this that provide a <void> specialisation for now + template <typename T> // easier to make this a template method than provide a <void> specialisation to coroutine_handle for now void await_suspend(coroutine_handle<T>) noexcept {} void await_resume() noexcept {} }; @@ -68,9 +69,7 @@ struct task struct promise_type { std::suspend_never initial_suspend() noexcept { return {}; } std::suspend_always final_suspend() noexcept { return {}; } - task get_return_object() noexcept { - return {std::coroutine_handle<promise_type>::from_promise(*this)}; - } + task get_return_object() noexcept { return {*this}; } void unhandled_exception() noexcept {} void return_void() noexcept {} void* operator new(size_t s, span<char> storage) noexcept { @@ -85,7 +84,7 @@ struct task void resume() const noexcept { h.resume(); } private: friend struct promise_type; - task(std::coroutine_handle<promise_type> ch) : h{ch} {} + task(promise_type& p) : h{decltype(h)::from_promise(p)} {} std::coroutine_handle<promise_type> h; };