authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-04-24 14:39:44-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-04-24 14:39:44-07:00
log15922069651ce964b6d12b9ad83ae02aa2266e89
tree459f2572e09a0c475aee7e51c179e0e787c8ea5f
parente86cee258cb0eefca14a94f6b3abb39e8a5f2ef9

AstGen: implement await and resume

based on @Vexu's code from before

3 files changed, 52 insertions(+), 2 deletions(-)

src/AstGen.zig+22-2
......@@ -959,7 +959,19 @@ pub fn awaitExpr(
959959 node: ast.Node.Index,
960960) InnerError!Zir.Inst.Ref {
961961 const astgen = gz.astgen;
962 return astgen.failNode(node, "TODO AstGen awaitExpr", .{});
962 const tree = &astgen.file.tree;
963 const node_datas = tree.nodes.items(.data);
964 const rhs_node = node_datas[node].lhs;
965
966 if (gz.suspend_node != 0) {
967 return astgen.failNodeNotes(node, "cannot await inside suspend block", .{}, &[_]u32{
968 try astgen.errNoteNode(gz.suspend_node, "suspend block here", .{}),
969 });
970 }
971 const operand = try expr(gz, scope, .none, rhs_node);
972 const tag: Zir.Inst.Tag = if (gz.nosuspend_node != 0) .await_nosuspend else .@"await";
973 const result = try gz.addUnNode(tag, operand, node);
974 return rvalue(gz, scope, rl, result, node);
963975}
964976
965977pub fn resumeExpr(
......@@ -969,7 +981,12 @@ pub fn resumeExpr(
969981 node: ast.Node.Index,
970982) InnerError!Zir.Inst.Ref {
971983 const astgen = gz.astgen;
972 return astgen.failNode(node, "TODO AstGen resumeExpr", .{});
984 const tree = &astgen.file.tree;
985 const node_datas = tree.nodes.items(.data);
986 const rhs_node = node_datas[node].lhs;
987 const operand = try expr(gz, scope, .none, rhs_node);
988 const result = try gz.addUnNode(.@"resume", operand, node);
989 return rvalue(gz, scope, rl, result, node);
973990}
974991
975992pub fn fnProtoExpr(
......@@ -2005,6 +2022,9 @@ fn unusedResultExpr(gz: *GenZir, scope: *Scope, statement: ast.Node.Index) Inner
20052022 .memset,
20062023 .builtin_async_call,
20072024 .c_import,
2025 .@"resume",
2026 .@"await",
2027 .await_nosuspend,
20082028 .extended,
20092029 => break :b false,
20102030
src/Sema.zig+20
......@@ -317,6 +317,9 @@ pub fn analyzeBody(
317317 .memcpy => try sema.zirMemcpy(block, inst),
318318 .memset => try sema.zirMemset(block, inst),
319319 .builtin_async_call => try sema.zirBuiltinAsyncCall(block, inst),
320 .@"resume" => try sema.zirResume(block, inst),
321 .@"await" => try sema.zirAwait(block, inst, false),
322 .await_nosuspend => try sema.zirAwait(block, inst, true),
320323 .extended => try sema.zirExtended(block, inst),
321324
322325 .sqrt => try sema.zirUnaryMath(block, inst),
......@@ -5413,6 +5416,23 @@ fn zirBuiltinAsyncCall(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) I
54135416 return sema.mod.fail(&block.base, src, "TODO: Sema.zirBuiltinAsyncCall", .{});
54145417}
54155418
5419fn zirResume(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) InnerError!*Inst {
5420 const inst_data = sema.code.instructions.items(.data)[inst].un_node;
5421 const src = inst_data.src();
5422 return sema.mod.fail(&block.base, src, "TODO: Sema.zirResume", .{});
5423}
5424
5425fn zirAwait(
5426 sema: *Sema,
5427 block: *Scope.Block,
5428 inst: Zir.Inst.Index,
5429 is_nosuspend: bool,
5430) InnerError!*Inst {
5431 const inst_data = sema.code.instructions.items(.data)[inst].un_node;
5432 const src = inst_data.src();
5433 return sema.mod.fail(&block.base, src, "TODO: Sema.zirAwait", .{});
5434}
5435
54165436fn zirFuncExtended(
54175437 sema: *Sema,
54185438 block: *Scope.Block,
src/Zir.zig+10
......@@ -936,6 +936,10 @@ pub const Inst = struct {
936936 /// Uses the `un_node` field. The AST node is the var decl.
937937 resolve_inferred_alloc,
938938
939 @"resume",
940 @"await",
941 await_nosuspend,
942
939943 /// The ZIR instruction tag is one of the `Extended` ones.
940944 /// Uses the `extended` union field.
941945 extended,
......@@ -1185,6 +1189,9 @@ pub const Inst = struct {
11851189 .memset,
11861190 .builtin_async_call,
11871191 .c_import,
1192 .@"resume",
1193 .@"await",
1194 .await_nosuspend,
11881195 .extended,
11891196 => false,
11901197
......@@ -2416,6 +2423,9 @@ const Writer = struct {
24162423 .byte_swap,
24172424 .bit_reverse,
24182425 .elem_type,
2426 .@"resume",
2427 .@"await",
2428 .await_nosuspend,
24192429 => try self.writeUnNode(stream, inst),
24202430
24212431 .ref,