authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-07-09 14:38:32+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-07-09 14:41:47+03:00
log5b36b0ed0c6d9f6dbe7ec7261cef7802283eaa82
tree1126b76a3e4c15d79d31942e34e263388252569c
parentc830606bbee72054749d4bf56e9215cac7785afa

Sema: use `tupleFieldIndex`


1 files changed, 21 insertions(+), 28 deletions(-)

src/Sema.zig+21-28
...@@ -15862,7 +15862,8 @@ fn zirOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -15862,7 +15862,8 @@ fn zirOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1586215862
15863fn bitOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!u64 {15863fn bitOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!u64 {
15864 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;15864 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
15865 sema.src = .{ .node_offset_bin_op = inst_data.src_node };15865 const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };
15866 sema.src = src;
15866 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };15867 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
15867 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };15868 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
15868 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;15869 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
...@@ -15885,13 +15886,11 @@ fn bitOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!u6...@@ -15885,13 +15886,11 @@ fn bitOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!u6
15885 },15886 },
15886 }15887 }
1588715888
15888 const field_index = if (ty.isTuple()) b: {15889 const field_index = if (ty.isTuple()) blk: {
15889 if (std.fmt.parseUnsigned(u32, field_name, 10)) |idx| {15890 if (mem.eql(u8, field_name, "len")) {
15890 if (idx < ty.structFieldCount()) break :b idx;15891 return sema.fail(block, src, "no offset available for 'len' field of tuple", .{});
15891 } else |_| {}15892 }
15892 return sema.fail(block, rhs_src, "tuple '{}' has no such field '{s}'", .{15893 break :blk try sema.tupleFieldIndex(block, ty, field_name, rhs_src);
15893 ty.fmt(sema.mod), field_name,
15894 });
15895 } else try sema.structFieldIndex(block, ty, field_name, rhs_src);15894 } else try sema.structFieldIndex(block, ty, field_name, rhs_src);
1589615895
15897 switch (ty.containerLayout()) {15896 switch (ty.containerLayout()) {
...@@ -17173,13 +17172,11 @@ fn zirFieldParentPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileEr...@@ -17173,13 +17172,11 @@ fn zirFieldParentPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileEr
17173 }17172 }
17174 try sema.resolveTypeLayout(block, ty_src, struct_ty);17173 try sema.resolveTypeLayout(block, ty_src, struct_ty);
1717517174
17176 const field_index = if (struct_ty.isTuple()) b: {17175 const field_index = if (struct_ty.isTuple()) blk: {
17177 if (std.fmt.parseUnsigned(u32, field_name, 10)) |idx| {17176 if (mem.eql(u8, field_name, "len")) {
17178 if (idx < struct_ty.structFieldCount()) break :b idx;17177 return sema.fail(block, src, "cannot get @fieldParentPtr of 'len' field of tuple", .{});
17179 } else |_| {}17178 }
17180 return sema.fail(block, name_src, "tuple '{}' has no such field '{s}'", .{17179 break :blk try sema.tupleFieldIndex(block, struct_ty, field_name, name_src);
17181 struct_ty.fmt(sema.mod), field_name,
17182 });
17183 } else try sema.structFieldIndex(block, struct_ty, field_name, name_src);17180 } else try sema.structFieldIndex(block, struct_ty, field_name, name_src);
1718417181
17185 try sema.checkPtrOperand(block, ptr_src, field_ptr_ty);17182 try sema.checkPtrOperand(block, ptr_src, field_ptr_ty);
...@@ -19222,17 +19219,13 @@ fn tupleFieldIndex(...@@ -19222,17 +19219,13 @@ fn tupleFieldIndex(
19222 field_name: []const u8,19219 field_name: []const u8,
19223 field_name_src: LazySrcLoc,19220 field_name_src: LazySrcLoc,
19224) CompileError!u32 {19221) CompileError!u32 {
19225 const field_index = std.fmt.parseUnsigned(u32, field_name, 10) catch |err| {19222 if (std.fmt.parseUnsigned(u32, field_name, 10)) |field_index| {
19226 return sema.fail(block, field_name_src, "tuple '{}' has no such field '{s}': {s}", .{19223 if (field_index < tuple_ty.structFieldCount()) return field_index;
19227 tuple_ty.fmt(sema.mod), field_name, @errorName(err),19224 } else |_| {}
19228 });19225
19229 };19226 return sema.fail(block, field_name_src, "no field named '{s}' in tuple '{}'", .{
19230 if (field_index >= tuple_ty.structFieldCount()) {19227 field_name, tuple_ty.fmt(sema.mod),
19231 return sema.fail(block, field_name_src, "tuple '{}' has no such field '{s}'", .{19228 });
19232 tuple_ty.fmt(sema.mod), field_name,
19233 });
19234 }
19235 return field_index;
19236}19229}
1923719230
19238fn tupleFieldValByIndex(19231fn tupleFieldValByIndex(
...@@ -25768,8 +25761,8 @@ fn anonStructFieldIndex(...@@ -25768,8 +25761,8 @@ fn anonStructFieldIndex(
25768 return @intCast(u32, i);25761 return @intCast(u32, i);
25769 }25762 }
25770 }25763 }
25771 return sema.fail(block, field_src, "anonymous struct '{}' has no such field '{s}'", .{25764 return sema.fail(block, field_src, "no field named '{s}' in anonymous struct '{}'", .{
25772 struct_ty.fmt(sema.mod), field_name,25765 field_name, struct_ty.fmt(sema.mod),
25773 });25766 });
25774}25767}
2577525768