Add no-suspend yield support

pull/335/head
Ibrahim Numanagić 2023-03-05 10:30:37 -08:00
commit 417be680b6
2 changed files with 19 additions and 1 deletions

View File

@ -206,6 +206,10 @@ void TranslateVisitor::visit(CallExpr *expr) {
arrayType->setAstType(expr->getType());
result = make<ir::StackAllocInstr>(expr, arrayType, sz);
return;
} else if (expr->expr->getId() && startswith(expr->expr->getId()->value,
"__internal__.yield_in_no_suspend:0")) {
result = make<ir::YieldInInstr>(expr, getType(expr->getType()), false);
return;
}
auto ft = expr->expr->type->getFunc();
@ -333,7 +337,16 @@ void TranslateVisitor::visit(ContinueStmt *stmt) {
result = make<ir::ContinueInstr>(stmt);
}
void TranslateVisitor::visit(ExprStmt *stmt) { result = transform(stmt->expr); }
void TranslateVisitor::visit(ExprStmt *stmt) {
if (stmt->expr->getCall() &&
stmt->expr->getCall()->expr->isId("__internal__.yield_final:0")) {
result = make<ir::YieldInstr>(stmt, transform(stmt->expr->getCall()->args[0].value),
true);
ctx->getBase()->setGenerator();
} else {
result = transform(stmt->expr);
}
}
void TranslateVisitor::visit(AssignStmt *stmt) {
if (stmt->lhs && stmt->lhs->isId(VAR_ARGV))

View File

@ -18,6 +18,11 @@ __vtable_size__ = 0
@extend
class __internal__:
def yield_final(val):
pass
def yield_in_no_suspend(T: type) -> T:
pass
@pure
@derives
@llvm