commit 9fb5b047e97896d7b25e897dc3737769d6b35a78 (tree)
parent e58a0c5e9e9a6eab7f5efdc60b0f3d5b9c106786
Author: dweiller <4678790+dweiller@users.noreplay.github.com>
Date: Sun, 30 Apr 2023 15:01:21 +1000
astgen: lower s[start..][0..len] to slice_length ZIR
Diffstat:
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/src/AstGen.zig b/src/AstGen.zig
@@ -849,10 +849,25 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE
return rvalue(gz, ri, result, node);
},
.slice => {
+ const extra = tree.extraData(node_datas[node].rhs, Ast.Node.Slice);
+ const lhs_node = node_datas[node].lhs;
+ if (node_tags[lhs_node] == .slice_open and nodeIsTriviallyZero(tree, extra.start)) {
+ const lhs = try expr(gz, scope, .{ .rl = .ref }, node_datas[lhs_node].lhs);
+ const start = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, node_datas[lhs_node].rhs);
+ const cursor = maybeAdvanceSourceCursorToMainToken(gz, node);
+ const len = if (extra.end != 0) try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, extra.end) else .none;
+ try emitDbgStmt(gz, cursor);
+ const result = try gz.addPlNode(.slice_length, node, Zir.Inst.SliceLength{
+ .lhs = lhs,
+ .start = start,
+ .len = len,
+ .start_src_node_offset = gz.nodeIndexToRelative(lhs_node),
+ });
+ return rvalue(gz, ri, result, node);
+ }
const lhs = try expr(gz, scope, .{ .rl = .ref }, node_datas[node].lhs);
const cursor = maybeAdvanceSourceCursorToMainToken(gz, node);
- const extra = tree.extraData(node_datas[node].rhs, Ast.Node.Slice);
const start = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, extra.start);
const end = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, extra.end);
try emitDbgStmt(gz, cursor);