| ... | ... | @@ -876,100 +876,68 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE |
| 876 | 876 | |
| 877 | 877 | .for_simple, .@"for" => return forExpr(gz, scope, ri.br(), node, tree.fullFor(node).?, false), |
| 878 | 878 | |
| 879 | | .slice_open => { |
| 880 | | const lhs = try expr(gz, scope, .{ .rl = .ref }, node_datas[node].lhs); |
| 881 | | |
| 882 | | const cursor = maybeAdvanceSourceCursorToMainToken(gz, node); |
| 883 | | const start = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, node_datas[node].rhs); |
| 884 | | try emitDbgStmt(gz, cursor); |
| 885 | | const result = try gz.addPlNode(.slice_start, node, Zir.Inst.SliceStart{ |
| 886 | | .lhs = lhs, |
| 887 | | .start = start, |
| 888 | | }); |
| 889 | | return rvalue(gz, ri, result, node); |
| 890 | | }, |
| 891 | | .slice => { |
| 892 | | const extra = tree.extraData(node_datas[node].rhs, Ast.Node.Slice); |
| 893 | | const lhs_node = node_datas[node].lhs; |
| 894 | | const lhs_tag = node_tags[lhs_node]; |
| 879 | .slice_open, |
| 880 | .slice, |
| 881 | .slice_sentinel, |
| 882 | => { |
| 883 | const full = tree.fullSlice(node).?; |
| 884 | const lhs_tag = node_tags[full.ast.sliced]; |
| 895 | 885 | const lhs_is_slice_sentinel = lhs_tag == .slice_sentinel; |
| 896 | 886 | const lhs_is_open_slice = lhs_tag == .slice_open or |
| 897 | | (lhs_is_slice_sentinel and tree.extraData(node_datas[lhs_node].rhs, Ast.Node.SliceSentinel).end == 0); |
| 898 | | if (lhs_is_open_slice and nodeIsTriviallyZero(tree, extra.start)) { |
| 899 | | const lhs = try expr(gz, scope, .{ .rl = .ref }, node_datas[lhs_node].lhs); |
| 887 | (lhs_is_slice_sentinel and tree.fullSlice(full.ast.sliced).?.ast.end == 0); |
| 888 | if (node_tags[node] != .slice_open and |
| 889 | lhs_is_open_slice and |
| 890 | nodeIsTriviallyZero(tree, full.ast.start)) |
| 891 | { |
| 892 | const lhs = try expr(gz, scope, .{ .rl = .ref }, node_datas[full.ast.sliced].lhs); |
| 900 | 893 | |
| 901 | 894 | const start = if (lhs_is_slice_sentinel) start: { |
| 902 | | const lhs_extra = tree.extraData(node_datas[lhs_node].rhs, Ast.Node.SliceSentinel); |
| 895 | const lhs_extra = tree.extraData(node_datas[full.ast.sliced].rhs, Ast.Node.SliceSentinel); |
| 903 | 896 | break :start try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, lhs_extra.start); |
| 904 | | } else try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, node_datas[lhs_node].rhs); |
| 897 | } else try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, node_datas[full.ast.sliced].rhs); |
| 905 | 898 | |
| 906 | 899 | const cursor = maybeAdvanceSourceCursorToMainToken(gz, node); |
| 907 | | const len = if (extra.end != 0) try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, extra.end) else .none; |
| 900 | const len = if (full.ast.end != 0) try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, full.ast.end) else .none; |
| 901 | const sentinel = if (full.ast.sentinel != 0) try expr(gz, scope, .{ .rl = .none }, full.ast.sentinel) else .none; |
| 908 | 902 | try emitDbgStmt(gz, cursor); |
| 909 | 903 | const result = try gz.addPlNode(.slice_length, node, Zir.Inst.SliceLength{ |
| 910 | 904 | .lhs = lhs, |
| 911 | 905 | .start = start, |
| 912 | 906 | .len = len, |
| 913 | | .start_src_node_offset = gz.nodeIndexToRelative(lhs_node), |
| 914 | | .sentinel = .none, |
| 907 | .start_src_node_offset = gz.nodeIndexToRelative(full.ast.sliced), |
| 908 | .sentinel = sentinel, |
| 915 | 909 | }); |
| 916 | 910 | return rvalue(gz, ri, result, node); |
| 917 | 911 | } |
| 918 | | const lhs = try expr(gz, scope, .{ .rl = .ref }, node_datas[node].lhs); |
| 912 | const lhs = try expr(gz, scope, .{ .rl = .ref }, full.ast.sliced); |
| 919 | 913 | |
| 920 | 914 | const cursor = maybeAdvanceSourceCursorToMainToken(gz, node); |
| 921 | | const start = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, extra.start); |
| 922 | | const end = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, extra.end); |
| 915 | const start = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, full.ast.start); |
| 916 | const end = if (full.ast.end != 0) try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, full.ast.end) else .none; |
| 917 | const sentinel = if (full.ast.sentinel != 0) try expr(gz, scope, .{ .rl = .none }, full.ast.sentinel) else .none; |
| 923 | 918 | try emitDbgStmt(gz, cursor); |
| 924 | | const result = try gz.addPlNode(.slice_end, node, Zir.Inst.SliceEnd{ |
| 925 | | .lhs = lhs, |
| 926 | | .start = start, |
| 927 | | .end = end, |
| 928 | | }); |
| 929 | | return rvalue(gz, ri, result, node); |
| 930 | | }, |
| 931 | | .slice_sentinel => { |
| 932 | | const extra = tree.extraData(node_datas[node].rhs, Ast.Node.SliceSentinel); |
| 933 | | const lhs_node = node_datas[node].lhs; |
| 934 | | const lhs_tag = node_tags[lhs_node]; |
| 935 | | const lhs_is_slice_sentinel = lhs_tag == .slice_sentinel; |
| 936 | | const lhs_is_open_slice = lhs_tag == .slice_open or |
| 937 | | (lhs_is_slice_sentinel and tree.extraData(node_datas[lhs_node].rhs, Ast.Node.SliceSentinel).end == 0); |
| 938 | | if (lhs_is_open_slice and nodeIsTriviallyZero(tree, extra.start)) { |
| 939 | | const lhs = try expr(gz, scope, .{ .rl = .ref }, node_datas[lhs_node].lhs); |
| 940 | | |
| 941 | | const start = if (lhs_is_slice_sentinel) start: { |
| 942 | | const lhs_extra = tree.extraData(node_datas[lhs_node].rhs, Ast.Node.SliceSentinel); |
| 943 | | break :start try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, lhs_extra.start); |
| 944 | | } else try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, node_datas[lhs_node].rhs); |
| 945 | | |
| 946 | | const cursor = maybeAdvanceSourceCursorToMainToken(gz, node); |
| 947 | | const len = if (extra.end != 0) try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, extra.end) else .none; |
| 948 | | const sentinel = try expr(gz, scope, .{ .rl = .none }, extra.sentinel); |
| 949 | | try emitDbgStmt(gz, cursor); |
| 950 | | const result = try gz.addPlNode(.slice_length, node, Zir.Inst.SliceLength{ |
| 919 | if (sentinel != .none) { |
| 920 | const result = try gz.addPlNode(.slice_sentinel, node, Zir.Inst.SliceSentinel{ |
| 951 | 921 | .lhs = lhs, |
| 952 | 922 | .start = start, |
| 953 | | .len = len, |
| 954 | | .start_src_node_offset = gz.nodeIndexToRelative(lhs_node), |
| 923 | .end = end, |
| 955 | 924 | .sentinel = sentinel, |
| 956 | 925 | }); |
| 957 | 926 | return rvalue(gz, ri, result, node); |
| 927 | } else if (end != .none) { |
| 928 | const result = try gz.addPlNode(.slice_end, node, Zir.Inst.SliceEnd{ |
| 929 | .lhs = lhs, |
| 930 | .start = start, |
| 931 | .end = end, |
| 932 | }); |
| 933 | return rvalue(gz, ri, result, node); |
| 934 | } else { |
| 935 | const result = try gz.addPlNode(.slice_start, node, Zir.Inst.SliceStart{ |
| 936 | .lhs = lhs, |
| 937 | .start = start, |
| 938 | }); |
| 939 | return rvalue(gz, ri, result, node); |
| 958 | 940 | } |
| 959 | | const lhs = try expr(gz, scope, .{ .rl = .ref }, node_datas[node].lhs); |
| 960 | | |
| 961 | | const cursor = maybeAdvanceSourceCursorToMainToken(gz, node); |
| 962 | | const start = try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, extra.start); |
| 963 | | const end = if (extra.end != 0) try expr(gz, scope, .{ .rl = .{ .coerced_ty = .usize_type } }, extra.end) else .none; |
| 964 | | const sentinel = try expr(gz, scope, .{ .rl = .none }, extra.sentinel); |
| 965 | | try emitDbgStmt(gz, cursor); |
| 966 | | const result = try gz.addPlNode(.slice_sentinel, node, Zir.Inst.SliceSentinel{ |
| 967 | | .lhs = lhs, |
| 968 | | .start = start, |
| 969 | | .end = end, |
| 970 | | .sentinel = sentinel, |
| 971 | | }); |
| 972 | | return rvalue(gz, ri, result, node); |
| 973 | 941 | }, |
| 974 | 942 | |
| 975 | 943 | .deref => { |