| author | |
| committer | |
| log | a62b5d84d834757682be9b5a0606ff8168c1d594 |
| tree | e72d2fcb10666ca1225e60dce251a414b1fd82d4 |
| parent | d71a43ec2c28a53a3e1d9bcb538707eca00a6fc0 |
5 files changed, 39 insertions(+), 0 deletions(-)
src/AstGen.zig+1| ... | ... | @@ -2557,6 +2557,7 @@ fn addEnsureResult(gz: *GenZir, maybe_unused_result: Zir.Inst.Ref, statement: As |
| 2557 | 2557 | .slice_start, |
| 2558 | 2558 | .slice_end, |
| 2559 | 2559 | .slice_sentinel, |
| 2560 | .slice_length, | |
| 2560 | 2561 | .import, |
| 2561 | 2562 | .switch_block, |
| 2562 | 2563 | .switch_cond, |
src/Autodoc.zig+1| ... | ... | @@ -1287,6 +1287,7 @@ fn walkInstruction( |
| 1287 | 1287 | .expr = .{ .sliceIndex = slice_index }, |
| 1288 | 1288 | }; |
| 1289 | 1289 | }, |
| 1290 | .slice_length => @panic("TODO: implement walkInstruction for .slice_length"), | |
| 1290 | 1291 | |
| 1291 | 1292 | // @check array_cat and array_mul |
| 1292 | 1293 | .add, |
src/Sema.zig+10| ... | ... | @@ -985,6 +985,7 @@ fn analyzeBodyInner( |
| 985 | 985 | .slice_end => try sema.zirSliceEnd(block, inst), |
| 986 | 986 | .slice_sentinel => try sema.zirSliceSentinel(block, inst), |
| 987 | 987 | .slice_start => try sema.zirSliceStart(block, inst), |
| 988 | .slice_length => try sema.zirSliceLength(block, inst), | |
| 988 | 989 | .str => try sema.zirStr(block, inst), |
| 989 | 990 | .switch_block => try sema.zirSwitchBlock(block, inst), |
| 990 | 991 | .switch_cond => try sema.zirSwitchCond(block, inst, false), |
| ... | ... | @@ -9961,6 +9962,15 @@ fn zirSliceSentinel(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErr |
| 9961 | 9962 | return sema.analyzeSlice(block, src, array_ptr, start, end, sentinel, sentinel_src, ptr_src, start_src, end_src); |
| 9962 | 9963 | } |
| 9963 | 9964 | |
| 9965 | fn zirSliceLength(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | |
| 9966 | const tracy = trace(@src()); | |
| 9967 | defer tracy.end(); | |
| 9968 | ||
| 9969 | const inst_data = sema.code.instructions.items(.data)[inst].pl_node; | |
| 9970 | const src = inst_data.src(); | |
| 9971 | return sema.fail(block, src, "TODO: implement .slice_length", .{}); | |
| 9972 | } | |
| 9973 | ||
| 9964 | 9974 | fn zirSwitchCapture( |
| 9965 | 9975 | sema: *Sema, |
| 9966 | 9976 | block: *Block, |
src/Zir.zig+14| ... | ... | @@ -570,6 +570,10 @@ pub const Inst = struct { |
| 570 | 570 | /// Returns a pointer to the subslice. |
| 571 | 571 | /// Uses the `pl_node` field. AST node is the slice syntax. Payload is `SliceSentinel`. |
| 572 | 572 | slice_sentinel, |
| 573 | /// Slice operation `array_ptr[start..][0..len]`. No sentinel. | |
| 574 | /// Returns a pointer to the subslice. | |
| 575 | /// Uses the `pl_node` field. AST node is the slice syntax. Payload is `SliceLength`. | |
| 576 | slice_length, | |
| 573 | 577 | /// Write a value to a pointer. For loading, see `load`. |
| 574 | 578 | /// Source location is assumed to be same as previous instruction. |
| 575 | 579 | /// Uses the `bin` union field. |
| ... | ... | @@ -1135,6 +1139,7 @@ pub const Inst = struct { |
| 1135 | 1139 | .slice_start, |
| 1136 | 1140 | .slice_end, |
| 1137 | 1141 | .slice_sentinel, |
| 1142 | .slice_length, | |
| 1138 | 1143 | .import, |
| 1139 | 1144 | .typeof_log2_int_type, |
| 1140 | 1145 | .resolve_inferred_alloc, |
| ... | ... | @@ -1430,6 +1435,7 @@ pub const Inst = struct { |
| 1430 | 1435 | .slice_start, |
| 1431 | 1436 | .slice_end, |
| 1432 | 1437 | .slice_sentinel, |
| 1438 | .slice_length, | |
| 1433 | 1439 | .import, |
| 1434 | 1440 | .typeof_log2_int_type, |
| 1435 | 1441 | .switch_capture, |
| ... | ... | @@ -1667,6 +1673,7 @@ pub const Inst = struct { |
| 1667 | 1673 | .slice_start = .pl_node, |
| 1668 | 1674 | .slice_end = .pl_node, |
| 1669 | 1675 | .slice_sentinel = .pl_node, |
| 1676 | .slice_length = .pl_node, | |
| 1670 | 1677 | .store = .bin, |
| 1671 | 1678 | .store_node = .pl_node, |
| 1672 | 1679 | .store_to_block_ptr = .bin, |
| ... | ... | @@ -2980,6 +2987,13 @@ pub const Inst = struct { |
| 2980 | 2987 | sentinel: Ref, |
| 2981 | 2988 | }; |
| 2982 | 2989 | |
| 2990 | pub const SliceLength = struct { | |
| 2991 | lhs: Ref, | |
| 2992 | start: Ref, | |
| 2993 | len: Ref, | |
| 2994 | start_src_node_offset: i32, | |
| 2995 | }; | |
| 2996 | ||
| 2983 | 2997 | /// The meaning of these operands depends on the corresponding `Tag`. |
| 2984 | 2998 | pub const Bin = struct { |
| 2985 | 2999 | lhs: Ref, |
src/print_zir.zig+13| ... | ... | @@ -267,6 +267,7 @@ const Writer = struct { |
| 267 | 267 | .slice_start => try self.writeSliceStart(stream, inst), |
| 268 | 268 | .slice_end => try self.writeSliceEnd(stream, inst), |
| 269 | 269 | .slice_sentinel => try self.writeSliceSentinel(stream, inst), |
| 270 | .slice_length => try self.writeSliceLength(stream, inst), | |
| 270 | 271 | |
| 271 | 272 | .union_init => try self.writeUnionInit(stream, inst), |
| 272 | 273 | |
| ... | ... | @@ -756,6 +757,18 @@ const Writer = struct { |
| 756 | 757 | try self.writeSrc(stream, inst_data.src()); |
| 757 | 758 | } |
| 758 | 759 | |
| 760 | fn writeSliceLength(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void { | |
| 761 | const inst_data = self.code.instructions.items(.data)[inst].pl_node; | |
| 762 | const extra = self.code.extraData(Zir.Inst.SliceLength, inst_data.payload_index).data; | |
| 763 | try self.writeInstRef(stream, extra.lhs); | |
| 764 | try stream.writeAll(", "); | |
| 765 | try self.writeInstRef(stream, extra.start); | |
| 766 | try stream.writeAll(", "); | |
| 767 | try self.writeInstRef(stream, extra.len); | |
| 768 | try stream.writeAll(") "); | |
| 769 | try self.writeSrc(stream, inst_data.src()); | |
| 770 | } | |
| 771 | ||
| 759 | 772 | fn writeUnionInit(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void { |
| 760 | 773 | const inst_data = self.code.instructions.items(.data)[inst].pl_node; |
| 761 | 774 | const extra = self.code.extraData(Zir.Inst.UnionInit, inst_data.payload_index).data; |