mirror of https://github.com/exaloop/codon.git
Add no-suspend yield support
commit
417be680b6
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue