authorgravatar for 4678790+dweiller@users.noreply.github.comDominic <4678790+dweiller@users.noreply.github.com> 2023-04-30 15:01:21+10:00
committergravatar for 4678790+dweiller@users.noreply.github.comDominic <4678790+dweiller@users.noreply.github.com> 2023-05-07 15:55:20+10:00
log9fb5b047e97896d7b25e897dc3737769d6b35a78
tree4962dffa70f837cd238eb42518e75cd666f7cfaf
parente58a0c5e9e9a6eab7f5efdc60b0f3d5b9c106786

astgen: lower s[start..][0..len] to slice_length ZIR


1 files changed, 16 insertions(+), 1 deletions(-)

src/AstGen.zig+16-1
...@@ -849,10 +849,25 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE...@@ -849,10 +849,25 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE
849 return rvalue(gz, ri, result, node);849 return rvalue(gz, ri, result, node);
850 },850 },
851 .slice => {851 .slice => {
852 const extra = tree.extraData(node_datas[node].rhs, Ast.Node.Slice);
853 const lhs_node = node_datas[node].lhs;
854 if (node_tags[lhs_node] == .slice_open and nodeIsTriviallyZero(tree, extra.start)) {
855 const lhs = try expr(gz, scope, .{ .rl = .ref }, node_datas[lhs_node].lhs);
856 const start = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, node_datas[lhs_node].rhs);
857 const cursor = maybeAdvanceSourceCursorToMainToken(gz, node);
858 const len = if (extra.end != 0) try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, extra.end) else .none;
859 try emitDbgStmt(gz, cursor);
860 const result = try gz.addPlNode(.slice_length, node, Zir.Inst.SliceLength{
861 .lhs = lhs,
862 .start = start,
863 .len = len,
864 .start_src_node_offset = gz.nodeIndexToRelative(lhs_node),
865 });
866 return rvalue(gz, ri, result, node);
867 }
852 const lhs = try expr(gz, scope, .{ .rl = .ref }, node_datas[node].lhs);868 const lhs = try expr(gz, scope, .{ .rl = .ref }, node_datas[node].lhs);
853869
854 const cursor = maybeAdvanceSourceCursorToMainToken(gz, node);870 const cursor = maybeAdvanceSourceCursorToMainToken(gz, node);
855 const extra = tree.extraData(node_datas[node].rhs, Ast.Node.Slice);
856 const start = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, extra.start);871 const start = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, extra.start);
857 const end = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, extra.end);872 const end = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, extra.end);
858 try emitDbgStmt(gz, cursor);873 try emitDbgStmt(gz, cursor);