diff --git a/CMakeLists.txt b/CMakeLists.txt index 1feb0fc95412df800bd48cdf377e6c5e73fc02cc..78e796ca22ccbae2e33e1d94c70f5bf73f1f7b34 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -219,6 +219,7 @@ install(FILES "${CMAKE_SOURCE_DIR}/std/mem.zig" DESTINATION "${ZIG_STD_DEST}") install(FILES "${CMAKE_SOURCE_DIR}/std/list.zig" DESTINATION "${ZIG_STD_DEST}") install(FILES "${CMAKE_SOURCE_DIR}/std/hash_map.zig" DESTINATION "${ZIG_STD_DEST}") install(FILES "${CMAKE_SOURCE_DIR}/std/empty.zig" DESTINATION "${ZIG_STD_DEST}") +install(FILES "${CMAKE_SOURCE_DIR}/std/debug.zig" DESTINATION "${ZIG_STD_DEST}") add_executable(run_tests ${TEST_SOURCES}) target_link_libraries(run_tests) diff --git a/std/debug.zig b/std/debug.zig new file mode 100644 index 0000000000000000000000000000000000000000..1a289b645e52db5b6d54d6cafc3ac39ca0503abc --- /dev/null +++ b/std/debug.zig @@ -0,0 +1,16 @@ +const io = @import("io.zig"); + +pub fn assert(b: bool) { + if (!b) unreachable{} +} + +pub fn print_stack_trace() { + var maybe_fp: ?&const u8 = @frame_address(); + while (true) { + const fp = maybe_fp ?? break; + const return_address = *(&const usize)(usize(fp) + @sizeof(usize)); + %%io.stderr.print_u64(return_address); + %%io.stderr.printf("\n"); + maybe_fp = *(&const ?&const u8)(fp); + } +} diff --git a/std/hash_map.zig b/std/hash_map.zig index 86cd3daee82474edaef2e06d685e70f438402b8a..f5147fdf2f02ec15311cb81968613e999f0110d7 100644 --- a/std/hash_map.zig +++ b/std/hash_map.zig @@ -1,4 +1,4 @@ -const assert = @import("index.zig").assert; +const assert = @import("debug.zig").assert; const math = @import("math.zig"); const mem = @import("mem.zig"); const Allocator = mem.Allocator; diff --git a/std/index.zig b/std/index.zig index 5f2ac7fd8c7cc1090e56500776194f30b5b02857..b22a34e59acfd013d712d45cbef6e902042cf5ff 100644 --- a/std/index.zig +++ b/std/index.zig @@ -8,13 +8,10 @@ pub const net = @import("net.zig"); pub const list = @import("list.zig"); pub const hash_map = @import("hash_map.zig"); pub const mem = @import("mem.zig"); +pub const debug = @import("debug.zig"); pub const linux = switch(@compile_var("os")) { linux => @import("linux.zig"), else => null_import, }; -pub fn assert(b: bool) { - if (!b) unreachable{} -} - const null_import = @import("empty.zig"); diff --git a/std/list.zig b/std/list.zig index 923a17734568c668417927838839876659c6ba1b..31300a071eddd4e48f7aa68f07d995314417aaf6 100644 --- a/std/list.zig +++ b/std/list.zig @@ -1,4 +1,4 @@ -const assert = @import("index.zig").assert; +const assert = @import("debug.zig").assert; const mem = @import("mem.zig"); const Allocator = mem.Allocator; diff --git a/std/mem.zig b/std/mem.zig index a21706b92188b4503e4d423d2129f57b41b99f28..d2a1ab049f62d945d403c7fb16a8164f0552cfa8 100644 --- a/std/mem.zig +++ b/std/mem.zig @@ -1,3 +1,5 @@ +const assert = @import("debug.zig").assert; + pub error NoMem; pub type Context = u8; @@ -8,3 +10,9 @@ pub struct Allocator { context: ?&Context, } +/// Copy all of source into dest at position 0. +/// dest.len must be >= source.len. +pub fn copy(T)(dest: []T, source: []T) { + assert(dest.len >= source.len); + @memcpy(dest.ptr, source.ptr, @sizeof(T) * source.len); +} diff --git a/std/net.zig b/std/net.zig index cf0c12672e7fb0378d29b1f1c259c158af388364..f98b6fbadf22dcdb5252ca75bdf44d836411a774 100644 --- a/std/net.zig +++ b/std/net.zig @@ -1,6 +1,6 @@ const linux = @import("linux.zig"); const errno = @import("errno.zig"); -const assert = @import("index.zig").assert; +const assert = @import("debug.zig").assert; pub error SigInterrupt; pub error Unexpected; diff --git a/std/str.zig b/std/str.zig index 529c8ae7a0c90df36eb62d7a542bd650f34f1f20..06879e9be5978465f0373123fc38e0ea7c7e9237 100644 --- a/std/str.zig +++ b/std/str.zig @@ -1,4 +1,4 @@ -const assert = @import("index.zig").assert; +const assert = @import("debug.zig").assert; pub const eql = slice_eql(u8); diff --git a/test/self_hosted.zig b/test/self_hosted.zig index 0a9ef689724202a4bdaf055af580f870ec12c1e6..748d4ccc0b5bd5d3fe75486e86036026631b19ad 100644 --- a/test/self_hosted.zig +++ b/test/self_hosted.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const assert = std.assert; +const assert = std.debug.assert; const str = std.str; const cstr = std.cstr; const other = @import("other.zig");