| author | |
| committer | |
| log | 28b7306a31f52f53e7936018c01c0e8d24ebf6ea |
| tree | 60cc50145b2d8ed05d1eb34ca7bcc091e20e97ca |
| parent | d9d8c4242649b8e93dca675a0151d6f39c1d4817 |
| parent | 3cf302a71d50114c44cedbe0114e513063b93302 |
| signature |
Take advantage of mem.spanZ accepting null4 files changed, 21 insertions(+), 12 deletions(-)
lib/std/debug.zig+1-1| ... | ... | @@ -1254,7 +1254,7 @@ pub const DebugInfo = struct { |
| 1254 | 1254 | if (context.address >= seg_start and context.address < seg_end) { |
| 1255 | 1255 | // Android libc uses NULL instead of an empty string to mark the |
| 1256 | 1256 | // main program |
| 1257 | context.name = if (info.dlpi_name) |dlpi_name| mem.spanZ(dlpi_name) else ""; | |
| 1257 | context.name = mem.spanZ(info.dlpi_name) orelse ""; | |
| 1258 | 1258 | context.base_address = info.dlpi_addr; |
| 1259 | 1259 | // Stop the iteration |
| 1260 | 1260 | return error.Found; |
lib/std/mem.zig+16-6| ... | ... | @@ -559,10 +559,14 @@ test "Span" { |
| 559 | 559 | /// When there is both a sentinel and an array length or slice length, the |
| 560 | 560 | /// length value is used instead of the sentinel. |
| 561 | 561 | pub fn span(ptr: var) Span(@TypeOf(ptr)) { |
| 562 | const Result = Span(@TypeOf(ptr)); | |
| 563 | if (@typeInfo(@TypeOf(ptr)) == .Optional and ptr == null) { | |
| 564 | return null; | |
| 562 | if (@typeInfo(@TypeOf(ptr)) == .Optional) { | |
| 563 | if (ptr) |non_null| { | |
| 564 | return span(non_null); | |
| 565 | } else { | |
| 566 | return null; | |
| 567 | } | |
| 565 | 568 | } |
| 569 | const Result = Span(@TypeOf(ptr)); | |
| 566 | 570 | const l = len(ptr); |
| 567 | 571 | if (@typeInfo(Result).Pointer.sentinel) |s| { |
| 568 | 572 | return ptr[0..l :s]; |
| ... | ... | @@ -576,16 +580,21 @@ test "span" { |
| 576 | 580 | const ptr = @as([*:3]u16, array[0..2 :3]); |
| 577 | 581 | testing.expect(eql(u16, span(ptr), &[_]u16{ 1, 2 })); |
| 578 | 582 | testing.expect(eql(u16, span(&array), &[_]u16{ 1, 2, 3, 4, 5 })); |
| 583 | testing.expectEqual(@as(?[:0]u16, null), span(@as(?[*:0]u16, null))); | |
| 579 | 584 | } |
| 580 | 585 | |
| 581 | 586 | /// Same as `span`, except when there is both a sentinel and an array |
| 582 | 587 | /// length or slice length, scans the memory for the sentinel value |
| 583 | 588 | /// rather than using the length. |
| 584 | 589 | pub fn spanZ(ptr: var) Span(@TypeOf(ptr)) { |
| 585 | const Result = Span(@TypeOf(ptr)); | |
| 586 | if (@typeInfo(@TypeOf(ptr)) == .Optional and ptr == null) { | |
| 587 | return null; | |
| 590 | if (@typeInfo(@TypeOf(ptr)) == .Optional) { | |
| 591 | if (ptr) |non_null| { | |
| 592 | return spanZ(non_null); | |
| 593 | } else { | |
| 594 | return null; | |
| 595 | } | |
| 588 | 596 | } |
| 597 | const Result = Span(@TypeOf(ptr)); | |
| 589 | 598 | const l = lenZ(ptr); |
| 590 | 599 | if (@typeInfo(Result).Pointer.sentinel) |s| { |
| 591 | 600 | return ptr[0..l :s]; |
| ... | ... | @@ -599,6 +608,7 @@ test "spanZ" { |
| 599 | 608 | const ptr = @as([*:3]u16, array[0..2 :3]); |
| 600 | 609 | testing.expect(eql(u16, spanZ(ptr), &[_]u16{ 1, 2 })); |
| 601 | 610 | testing.expect(eql(u16, spanZ(&array), &[_]u16{ 1, 2, 3, 4, 5 })); |
| 611 | testing.expectEqual(@as(?[:0]u16, null), spanZ(@as(?[*:0]u16, null))); | |
| 602 | 612 | } |
| 603 | 613 | |
| 604 | 614 | /// Takes a pointer to an array, an array, a sentinel-terminated pointer, |
lib/std/os.zig+1-1| ... | ... | @@ -1078,7 +1078,7 @@ pub fn execvpe_expandArg0( |
| 1078 | 1078 | mem.set(?[*:0]u8, argv_buf, null); |
| 1079 | 1079 | defer { |
| 1080 | 1080 | for (argv_buf) |arg| { |
| 1081 | const arg_buf = if (arg) |ptr| mem.spanZ(ptr) else break; | |
| 1081 | const arg_buf = mem.spanZ(arg) orelse break; | |
| 1082 | 1082 | allocator.free(arg_buf); |
| 1083 | 1083 | } |
| 1084 | 1084 | allocator.free(argv_buf); |
src-self-hosted/stage2.zig+3-4| ... | ... | @@ -689,12 +689,11 @@ fn stage2CrossTarget( |
| 689 | 689 | mcpu_oz: ?[*:0]const u8, |
| 690 | 690 | dynamic_linker_oz: ?[*:0]const u8, |
| 691 | 691 | ) !CrossTarget { |
| 692 | const zig_triple = if (zig_triple_oz) |zig_triple_z| mem.spanZ(zig_triple_z) else "native"; | |
| 693 | const mcpu = if (mcpu_oz) |mcpu_z| mem.spanZ(mcpu_z) else null; | |
| 694 | const dynamic_linker = if (dynamic_linker_oz) |dl_z| mem.spanZ(dl_z) else null; | |
| 692 | const mcpu = mem.spanZ(mcpu_oz); | |
| 693 | const dynamic_linker = mem.spanZ(dynamic_linker_oz); | |
| 695 | 694 | var diags: CrossTarget.ParseOptions.Diagnostics = .{}; |
| 696 | 695 | const target: CrossTarget = CrossTarget.parse(.{ |
| 697 | .arch_os_abi = zig_triple, | |
| 696 | .arch_os_abi = mem.spanZ(zig_triple_oz) orelse "native", | |
| 698 | 697 | .cpu_features = mcpu, |
| 699 | 698 | .dynamic_linker = dynamic_linker, |
| 700 | 699 | .diagnostics = &diags, |