mirror of
https://github.com/ziglang/zig.git
synced 2026-01-28 18:25:26 +00:00
errorName: return a null-terminated slice
This commit is contained in:
parent
00e1c0082c
commit
171102ea7c
@ -7475,7 +7475,7 @@ test "main" {
|
||||
{#header_close#}
|
||||
|
||||
{#header_open|@errorName#}
|
||||
<pre>{#syntax#}@errorName(err: anyerror) []const u8{#endsyntax#}</pre>
|
||||
<pre>{#syntax#}@errorName(err: anyerror) [:0]const u8{#endsyntax#}</pre>
|
||||
<p>
|
||||
This function returns the string representation of an error. The string representation
|
||||
of {#syntax#}error.OutOfMem{#endsyntax#} is {#syntax#}"OutOfMem"{#endsyntax#}.
|
||||
|
||||
@ -16864,26 +16864,27 @@ static IrInstGen *ir_analyze_instruction_err_name(IrAnalyze *ira, IrInstSrcErrNa
|
||||
if (type_is_invalid(casted_value->value->type))
|
||||
return ira->codegen->invalid_inst_gen;
|
||||
|
||||
ZigType *u8_ptr_type = get_pointer_to_type_extra(ira->codegen, ira->codegen->builtin_types.entry_u8,
|
||||
true, false, PtrLenUnknown, 0, 0, 0, false);
|
||||
ZigType *str_type = get_slice_type(ira->codegen, u8_ptr_type);
|
||||
if (instr_is_comptime(casted_value)) {
|
||||
ZigValue *val = ir_resolve_const(ira, casted_value, UndefBad);
|
||||
if (val == nullptr)
|
||||
return ira->codegen->invalid_inst_gen;
|
||||
ErrorTableEntry *err = casted_value->value->data.x_err_set;
|
||||
if (!err->cached_error_name_val) {
|
||||
ZigValue *array_val = create_const_str_lit(ira->codegen, &err->name)->data.x_ptr.data.ref.pointee;
|
||||
err->cached_error_name_val = create_const_slice(ira->codegen, array_val, 0, buf_len(&err->name), true);
|
||||
err->cached_error_name_val = create_sentineled_str_lit(
|
||||
ira->codegen, &err->name,
|
||||
ira->codegen->intern.for_zero_byte());
|
||||
}
|
||||
IrInstGen *result = ir_const(ira, &instruction->base.base, nullptr);
|
||||
copy_const_val(ira->codegen, result->value, err->cached_error_name_val);
|
||||
result->value->type = str_type;
|
||||
result->value = err->cached_error_name_val;
|
||||
return result;
|
||||
}
|
||||
|
||||
ira->codegen->generate_error_name_table = true;
|
||||
|
||||
ZigType *u8_ptr_type = get_pointer_to_type_extra2(ira->codegen, ira->codegen->builtin_types.entry_u8,
|
||||
true, false, PtrLenUnknown, 0, 0, 0, false,
|
||||
VECTOR_INDEX_NONE, nullptr, ira->codegen->intern.for_zero_byte());
|
||||
ZigType *str_type = get_slice_type(ira->codegen, u8_ptr_type);
|
||||
return ir_build_err_name_gen(ira, &instruction->base.base, value, str_type);
|
||||
}
|
||||
|
||||
|
||||
@ -9,3 +9,13 @@ test "@tagName() returns a string literal" {
|
||||
try std.testing.expectEqualStrings("TestEnumValue", tag_name);
|
||||
try std.testing.expectEqualStrings("TestEnumValue", ptr_tag_name[0..tag_name.len]);
|
||||
}
|
||||
|
||||
const TestError = error{TestErrorCode};
|
||||
const error_name = @errorName(TestError.TestErrorCode);
|
||||
const ptr_error_name: [*:0]const u8 = error_name;
|
||||
|
||||
test "@errorName() returns a string literal" {
|
||||
try std.testing.expectEqual([:0]const u8, @TypeOf(error_name));
|
||||
try std.testing.expectEqualStrings("TestErrorCode", error_name);
|
||||
try std.testing.expectEqualStrings("TestErrorCode", ptr_error_name[0..error_name.len]);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user