mirror of
https://github.com/ziglang/zig.git
synced 2025-12-29 09:33:18 +00:00
parent
442e244b4d
commit
02c5bda704
@ -7336,7 +7336,7 @@ Defer(body) = ("defer" | "deferror") body
|
||||
|
||||
IfExpression(body) = "if" "(" Expression ")" body option("else" BlockExpression(body))
|
||||
|
||||
SuspendExpression(body) = option(Symbol ":") "suspend" option(("|" Symbol "|" body))
|
||||
SuspendExpression(body) = "suspend" option(("|" Symbol "|" body))
|
||||
|
||||
IfErrorExpression(body) = "if" "(" Expression ")" option("|" option("*") Symbol "|") body "else" "|" Symbol "|" BlockExpression(body)
|
||||
|
||||
|
||||
@ -898,7 +898,6 @@ struct AstNodeAwaitExpr {
|
||||
};
|
||||
|
||||
struct AstNodeSuspend {
|
||||
Buf *name;
|
||||
AstNode *block;
|
||||
AstNode *promise_symbol;
|
||||
};
|
||||
@ -1929,7 +1928,6 @@ struct ScopeLoop {
|
||||
struct ScopeSuspend {
|
||||
Scope base;
|
||||
|
||||
Buf *name;
|
||||
IrBasicBlock *resume_block;
|
||||
bool reported_err;
|
||||
};
|
||||
|
||||
@ -161,7 +161,6 @@ ScopeSuspend *create_suspend_scope(AstNode *node, Scope *parent) {
|
||||
assert(node->type == NodeTypeSuspend);
|
||||
ScopeSuspend *scope = allocate<ScopeSuspend>(1);
|
||||
init_scope(&scope->base, ScopeIdSuspend, node, parent);
|
||||
scope->name = node->data.suspend.name;
|
||||
return scope;
|
||||
}
|
||||
|
||||
|
||||
17
src/ir.cpp
17
src/ir.cpp
@ -6186,15 +6186,6 @@ static IrInstruction *ir_gen_return_from_block(IrBuilder *irb, Scope *break_scop
|
||||
return ir_build_br(irb, break_scope, node, dest_block, is_comptime);
|
||||
}
|
||||
|
||||
static IrInstruction *ir_gen_break_from_suspend(IrBuilder *irb, Scope *break_scope, AstNode *node, ScopeSuspend *suspend_scope) {
|
||||
IrInstruction *is_comptime = ir_build_const_bool(irb, break_scope, node, false);
|
||||
|
||||
IrBasicBlock *dest_block = suspend_scope->resume_block;
|
||||
ir_gen_defers_for_block(irb, break_scope, dest_block->scope, false);
|
||||
|
||||
return ir_build_br(irb, break_scope, node, dest_block, is_comptime);
|
||||
}
|
||||
|
||||
static IrInstruction *ir_gen_break(IrBuilder *irb, Scope *break_scope, AstNode *node) {
|
||||
assert(node->type == NodeTypeBreak);
|
||||
|
||||
@ -6235,12 +6226,8 @@ static IrInstruction *ir_gen_break(IrBuilder *irb, Scope *break_scope, AstNode *
|
||||
return ir_gen_return_from_block(irb, break_scope, node, this_block_scope);
|
||||
}
|
||||
} else if (search_scope->id == ScopeIdSuspend) {
|
||||
ScopeSuspend *this_suspend_scope = (ScopeSuspend *)search_scope;
|
||||
if (node->data.break_expr.name != nullptr &&
|
||||
(this_suspend_scope->name != nullptr && buf_eql_buf(node->data.break_expr.name, this_suspend_scope->name)))
|
||||
{
|
||||
return ir_gen_break_from_suspend(irb, break_scope, node, this_suspend_scope);
|
||||
}
|
||||
add_node_error(irb->codegen, node, buf_sprintf("cannot break out of suspend block"));
|
||||
return irb->codegen->invalid_instruction;
|
||||
}
|
||||
search_scope = search_scope->parent;
|
||||
}
|
||||
|
||||
@ -648,30 +648,12 @@ static AstNode *ast_parse_asm_expr(ParseContext *pc, size_t *token_index, bool m
|
||||
}
|
||||
|
||||
/*
|
||||
SuspendExpression(body) = option(Symbol ":") "suspend" option(("|" Symbol "|" body))
|
||||
SuspendExpression(body) = "suspend" option(("|" Symbol "|" body))
|
||||
*/
|
||||
static AstNode *ast_parse_suspend_block(ParseContext *pc, size_t *token_index, bool mandatory) {
|
||||
size_t orig_token_index = *token_index;
|
||||
|
||||
Token *name_token = nullptr;
|
||||
Token *token = &pc->tokens->at(*token_index);
|
||||
if (token->id == TokenIdSymbol) {
|
||||
*token_index += 1;
|
||||
Token *colon_token = &pc->tokens->at(*token_index);
|
||||
if (colon_token->id == TokenIdColon) {
|
||||
*token_index += 1;
|
||||
name_token = token;
|
||||
token = &pc->tokens->at(*token_index);
|
||||
} else if (mandatory) {
|
||||
ast_expect_token(pc, colon_token, TokenIdColon);
|
||||
zig_unreachable();
|
||||
} else {
|
||||
*token_index = orig_token_index;
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
Token *suspend_token = token;
|
||||
Token *suspend_token = &pc->tokens->at(*token_index);
|
||||
if (suspend_token->id == TokenIdKeywordSuspend) {
|
||||
*token_index += 1;
|
||||
} else if (mandatory) {
|
||||
@ -693,9 +675,6 @@ static AstNode *ast_parse_suspend_block(ParseContext *pc, size_t *token_index, b
|
||||
}
|
||||
|
||||
AstNode *node = ast_create_node(pc, NodeTypeSuspend, suspend_token);
|
||||
if (name_token != nullptr) {
|
||||
node->data.suspend.name = token_buf(name_token);
|
||||
}
|
||||
node->data.suspend.promise_symbol = ast_parse_symbol(pc, token_index);
|
||||
ast_eat_token(pc, token_index, TokenIdBinOr);
|
||||
node->data.suspend.block = ast_parse_block(pc, token_index, true);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user