| author | |
| committer | |
| log | 8be95af48011f71f1902dff4ffbf5ea95cf1bcf4 |
| tree | 699f358122478afdfeabd613dc6734f5dd2ff2ac |
| parent | 8d4cb852856631543aa961a6149b9a22021a1573 |
| signature |
2 files changed, 12 insertions(+), 0 deletions(-)
BRANCH_TODO+5| ... | ... | @@ -31,3 +31,8 @@ |
| 31 | 31 | * grep for "coroutine" and "coro" and replace all that nomenclature with "async functions" |
| 32 | 32 | * when there are multiple calls to async functions in a function, reuse the same frame buffer, so that the |
| 33 | 33 | needed bytes is equal to the largest callee's frame |
| 34 | * if an async function is never called with async then a few optimizations can be made: | |
| 35 | - the return does not need to be atomic | |
| 36 | - it can be assumed that these are always available: the awaiter ptr, return ptr if applicable, | |
| 37 | error return trace ptr if applicable. | |
| 38 | - it can be assumed that it is never cancelled |
src/analyze.cpp+7| ... | ... | @@ -5198,6 +5198,13 @@ static Error resolve_coro_frame(CodeGen *g, ZigType *frame_type) { |
| 5198 | 5198 | if (callee->body_node == nullptr) { |
| 5199 | 5199 | continue; |
| 5200 | 5200 | } |
| 5201 | if (callee->anal_state == FnAnalStateProbing) { | |
| 5202 | ErrorMsg *msg = add_node_error(g, fn->proto_node, | |
| 5203 | buf_sprintf("unable to determine async function frame of '%s'", buf_ptr(&fn->symbol_name))); | |
| 5204 | add_error_note(g, msg, call->base.source_node, | |
| 5205 | buf_sprintf("analysis of function '%s' depends on the frame", buf_ptr(&callee->symbol_name))); | |
| 5206 | return ErrorSemanticAnalyzeFail; | |
| 5207 | } | |
| 5201 | 5208 | |
| 5202 | 5209 | analyze_fn_body(g, callee); |
| 5203 | 5210 | if (callee->anal_state == FnAnalStateInvalid) { |