From 4d134a01f5a8baae346783f19d9b5db8c8256d32 Mon Sep 17 00:00:00 2001 From: Benjamin Feng Date: Wed, 29 Jan 2020 12:21:29 -0600 Subject: Move debug.global_allocator to testing.allocator --- lib/std/buffer.zig | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'lib/std/buffer.zig') diff --git a/lib/std/buffer.zig b/lib/std/buffer.zig index 42bf8e8142..ada3590616 100644 --- a/lib/std/buffer.zig +++ b/lib/std/buffer.zig @@ -150,7 +150,7 @@ pub const Buffer = struct { }; test "simple Buffer" { - var buf = try Buffer.init(debug.global_allocator, ""); + var buf = try Buffer.init(testing.allocator, ""); testing.expect(buf.len() == 0); try buf.append("hello"); try buf.append(" "); @@ -169,14 +169,14 @@ test "simple Buffer" { } test "Buffer.initSize" { - var buf = try Buffer.initSize(debug.global_allocator, 3); + var buf = try Buffer.initSize(testing.allocator, 3); testing.expect(buf.len() == 3); try buf.append("hello"); testing.expect(mem.eql(u8, buf.toSliceConst()[3..], "hello")); } test "Buffer.initCapacity" { - var buf = try Buffer.initCapacity(debug.global_allocator, 10); + var buf = try Buffer.initCapacity(testing.allocator, 10); testing.expect(buf.len() == 0); testing.expect(buf.capacity() >= 10); const old_cap = buf.capacity(); -- cgit v1.2.3 From aa9caf5064b3fc01579b7bd8c765ff33323a073a Mon Sep 17 00:00:00 2001 From: Benjamin Feng Date: Wed, 29 Jan 2020 13:18:04 -0600 Subject: Create leak_count_allocator --- doc/docgen.zig | 2 +- lib/std/array_list.zig | 15 +-- lib/std/buffer.zig | 11 +- lib/std/debug.zig | 2 +- lib/std/fifo.zig | 4 +- lib/std/fmt.zig | 15 ++- lib/std/fs/path.zig | 166 ++++++++++++++------------ lib/std/linked_list.zig | 6 +- lib/std/os/test.zig | 2 +- lib/std/priority_queue.zig | 28 ++--- lib/std/process.zig | 9 +- lib/std/special/test_runner.zig | 3 + lib/std/testing.zig | 42 +++++++ lib/std/unicode.zig | 18 ++- lib/std/zig/ast.zig | 2 +- test/compare_output.zig | 4 +- test/compile_errors.zig | 2 +- test/stage1/behavior/const_slice_child.zig | 2 +- test/standalone/brace_expansion/main.zig | 4 +- test/standalone/cat/main.zig | 2 +- test/standalone/empty_env/main.zig | 2 +- test/standalone/load_dynamic_library/main.zig | 4 +- 22 files changed, 208 insertions(+), 137 deletions(-) (limited to 'lib/std/buffer.zig') diff --git a/doc/docgen.zig b/doc/docgen.zig index 678eb26043..128314696e 100644 --- a/doc/docgen.zig +++ b/doc/docgen.zig @@ -672,7 +672,7 @@ const TermState = enum { test "term color" { const input_bytes = "A\x1b[32;1mgreen\x1b[0mB"; - const result = try termColor(std.testing.allocator, input_bytes); + const result = try termColor(std.testing.leak_count_allocator, input_bytes); testing.expectEqualSlices(u8, "AgreenB", result); } diff --git a/lib/std/array_list.zig b/lib/std/array_list.zig index be99a54e2b..57c0d706a2 100644 --- a/lib/std/array_list.zig +++ b/lib/std/array_list.zig @@ -320,7 +320,7 @@ test "std.ArrayList.basic" { } test "std.ArrayList.orderedRemove" { - var list = ArrayList(i32).init(testing.allocator); + var list = ArrayList(i32).init(testing.leak_count_allocator); defer list.deinit(); try list.append(1); @@ -347,7 +347,7 @@ test "std.ArrayList.orderedRemove" { } test "std.ArrayList.swapRemove" { - var list = ArrayList(i32).init(testing.allocator); + var list = ArrayList(i32).init(testing.leak_count_allocator); defer list.deinit(); try list.append(1); @@ -374,7 +374,7 @@ test "std.ArrayList.swapRemove" { } test "std.ArrayList.swapRemoveOrError" { - var list = ArrayList(i32).init(testing.allocator); + var list = ArrayList(i32).init(testing.leak_count_allocator); defer list.deinit(); // Test just after initialization @@ -402,7 +402,7 @@ test "std.ArrayList.swapRemoveOrError" { } test "std.ArrayList.insert" { - var list = ArrayList(i32).init(testing.allocator); + var list = ArrayList(i32).init(testing.leak_count_allocator); defer list.deinit(); try list.append(1); @@ -416,7 +416,7 @@ test "std.ArrayList.insert" { } test "std.ArrayList.insertSlice" { - var list = ArrayList(i32).init(testing.allocator); + var list = ArrayList(i32).init(testing.leak_count_allocator); defer list.deinit(); try list.append(1); @@ -443,7 +443,8 @@ const Item = struct { }; test "std.ArrayList: ArrayList(T) of struct T" { - var root = Item{ .integer = 1, .sub_items = ArrayList(Item).init(testing.allocator) }; - try root.sub_items.append(Item{ .integer = 42, .sub_items = ArrayList(Item).init(testing.allocator) }); + var root = Item{ .integer = 1, .sub_items = ArrayList(Item).init(testing.leak_count_allocator) }; + defer root.sub_items.deinit(); + try root.sub_items.append(Item{ .integer = 42, .sub_items = ArrayList(Item).init(testing.leak_count_allocator) }); testing.expect(root.sub_items.items[0].integer == 42); } diff --git a/lib/std/buffer.zig b/lib/std/buffer.zig index ada3590616..cc1166e0e7 100644 --- a/lib/std/buffer.zig +++ b/lib/std/buffer.zig @@ -150,7 +150,9 @@ pub const Buffer = struct { }; test "simple Buffer" { - var buf = try Buffer.init(testing.allocator, ""); + var buf = try Buffer.init(testing.leak_count_allocator, ""); + defer buf.deinit(); + testing.expect(buf.len() == 0); try buf.append("hello"); try buf.append(" "); @@ -159,6 +161,7 @@ test "simple Buffer" { testing.expect(mem.eql(u8, mem.toSliceConst(u8, buf.toSliceConst().ptr), buf.toSliceConst())); var buf2 = try Buffer.initFromBuffer(buf); + defer buf2.deinit(); testing.expect(buf.eql(buf2.toSliceConst())); testing.expect(buf.startsWith("hell")); @@ -169,14 +172,16 @@ test "simple Buffer" { } test "Buffer.initSize" { - var buf = try Buffer.initSize(testing.allocator, 3); + var buf = try Buffer.initSize(testing.leak_count_allocator, 3); + defer buf.deinit(); testing.expect(buf.len() == 3); try buf.append("hello"); testing.expect(mem.eql(u8, buf.toSliceConst()[3..], "hello")); } test "Buffer.initCapacity" { - var buf = try Buffer.initCapacity(testing.allocator, 10); + var buf = try Buffer.initCapacity(testing.leak_count_allocator, 10); + defer buf.deinit(); testing.expect(buf.len() == 0); testing.expect(buf.capacity() >= 10); const old_cap = buf.capacity(); diff --git a/lib/std/debug.zig b/lib/std/debug.zig index f2dcdd7e77..7e1a99a395 100644 --- a/lib/std/debug.zig +++ b/lib/std/debug.zig @@ -2193,7 +2193,7 @@ fn readInitialLength(comptime E: type, in_stream: *io.InStream(E), is_64: *bool) } pub const global_allocator = blk: { - @compileError("Please switch to std.testing.allocator."); + @compileError("Please switch to std.testing.leak_count_allocator."); }; var global_fixed_allocator = std.heap.ThreadSafeFixedBufferAllocator.init(global_allocator_mem[0..]); var global_allocator_mem: [100 * 1024]u8 = undefined; diff --git a/lib/std/fifo.zig b/lib/std/fifo.zig index ac8589f2ce..dd429289d1 100644 --- a/lib/std/fifo.zig +++ b/lib/std/fifo.zig @@ -347,7 +347,7 @@ pub fn LinearFifo( } test "LinearFifo(u8, .Dynamic)" { - var fifo = LinearFifo(u8, .Dynamic).init(testing.allocator); + var fifo = LinearFifo(u8, .Dynamic).init(testing.leak_count_allocator); defer fifo.deinit(); try fifo.write("HELLO"); @@ -422,7 +422,7 @@ test "LinearFifo" { var fifo = switch (bt) { .Static => FifoType.init(), .Slice => FifoType.init(buf[0..]), - .Dynamic => FifoType.init(testing.allocator), + .Dynamic => FifoType.init(testing.leak_count_allocator), }; defer fifo.deinit(); diff --git a/lib/std/fmt.zig b/lib/std/fmt.zig index 9757658447..529131065c 100644 --- a/lib/std/fmt.zig +++ b/lib/std/fmt.zig @@ -1598,7 +1598,8 @@ test "hexToBytes" { test "formatIntValue with comptime_int" { const value: comptime_int = 123456789123456789; - var buf = try std.Buffer.init(std.testing.allocator, ""); + var buf = try std.Buffer.init(std.testing.leak_count_allocator, ""); + defer buf.deinit(); try formatIntValue(value, "", FormatOptions{}, &buf, @TypeOf(std.Buffer.append).ReturnType.ErrorSet, std.Buffer.append); std.testing.expect(mem.eql(u8, buf.toSlice(), "123456789123456789")); } @@ -1652,19 +1653,23 @@ test "formatType max_depth" { inst.a = &inst; inst.tu.ptr = &inst.tu; - var buf0 = try std.Buffer.init(std.testing.allocator, ""); + var buf0 = try std.Buffer.init(std.testing.leak_count_allocator, ""); + defer buf0.deinit(); try formatType(inst, "", FormatOptions{}, &buf0, @TypeOf(std.Buffer.append).ReturnType.ErrorSet, std.Buffer.append, 0); std.testing.expect(mem.eql(u8, buf0.toSlice(), "S{ ... }")); - var buf1 = try std.Buffer.init(std.testing.allocator, ""); + var buf1 = try std.Buffer.init(std.testing.leak_count_allocator, ""); + defer buf1.deinit(); try formatType(inst, "", FormatOptions{}, &buf1, @TypeOf(std.Buffer.append).ReturnType.ErrorSet, std.Buffer.append, 1); std.testing.expect(mem.eql(u8, buf1.toSlice(), "S{ .a = S{ ... }, .tu = TU{ ... }, .e = E.Two, .vec = (10.200,2.220) }")); - var buf2 = try std.Buffer.init(std.testing.allocator, ""); + var buf2 = try std.Buffer.init(std.testing.leak_count_allocator, ""); + defer buf2.deinit(); try formatType(inst, "", FormatOptions{}, &buf2, @TypeOf(std.Buffer.append).ReturnType.ErrorSet, std.Buffer.append, 2); std.testing.expect(mem.eql(u8, buf2.toSlice(), "S{ .a = S{ .a = S{ ... }, .tu = TU{ ... }, .e = E.Two, .vec = (10.200,2.220) }, .tu = TU{ .ptr = TU{ ... } }, .e = E.Two, .vec = (10.200,2.220) }")); - var buf3 = try std.Buffer.init(std.testing.allocator, ""); + var buf3 = try std.Buffer.init(std.testing.leak_count_allocator, ""); + defer buf3.deinit(); try formatType(inst, "", FormatOptions{}, &buf3, @TypeOf(std.Buffer.append).ReturnType.ErrorSet, std.Buffer.append, 3); std.testing.expect(mem.eql(u8, buf3.toSlice(), "S{ .a = S{ .a = S{ .a = S{ ... }, .tu = TU{ ... }, .e = E.Two, .vec = (10.200,2.220) }, .tu = TU{ .ptr = TU{ ... } }, .e = E.Two, .vec = (10.200,2.220) }, .tu = TU{ .ptr = TU{ .ptr = TU{ ... } } }, .e = E.Two, .vec = (10.200,2.220) }")); } diff --git a/lib/std/fs/path.zig b/lib/std/fs/path.zig index 6c29a3950c..424e9f5759 100644 --- a/lib/std/fs/path.zig +++ b/lib/std/fs/path.zig @@ -665,15 +665,16 @@ pub fn resolvePosix(allocator: *Allocator, paths: []const []const u8) ![]u8 { } test "resolve" { - const cwd = try process.getCwdAlloc(testing.allocator); + const cwd = try process.getCwdAlloc(testing.leak_count_allocator); + defer testing.leak_count_allocator.free(cwd); if (builtin.os == .windows) { if (windowsParsePath(cwd).kind == WindowsPath.Kind.Drive) { cwd[0] = asciiUpper(cwd[0]); } - testing.expect(mem.eql(u8, testResolveWindows(&[_][]const u8{"."}), cwd)); + try testResolveWindows(&[_][]const u8{"."}, cwd); } else { - testing.expect(mem.eql(u8, testResolvePosix(&[_][]const u8{ "a/b/c/", "../../.." }), cwd)); - testing.expect(mem.eql(u8, testResolvePosix(&[_][]const u8{"."}), cwd)); + try testResolvePosix(&[_][]const u8{ "a/b/c/", "../../.." }, cwd); + try testResolvePosix(&[_][]const u8{"."}, cwd); } } @@ -683,66 +684,71 @@ test "resolveWindows" { return error.SkipZigTest; } if (builtin.os == .windows) { - const cwd = try process.getCwdAlloc(testing.allocator); + const cwd = try process.getCwdAlloc(testing.leak_count_allocator); + defer testing.leak_count_allocator.free(cwd); const parsed_cwd = windowsParsePath(cwd); { - const result = testResolveWindows(&[_][]const u8{ "/usr/local", "lib\\zig\\std\\array_list.zig" }); - const expected = try join(testing.allocator, &[_][]const u8{ + const expected = try join(testing.leak_count_allocator, &[_][]const u8{ parsed_cwd.disk_designator, "usr\\local\\lib\\zig\\std\\array_list.zig", }); + defer testing.leak_count_allocator.free(expected); if (parsed_cwd.kind == WindowsPath.Kind.Drive) { expected[0] = asciiUpper(parsed_cwd.disk_designator[0]); } - testing.expect(mem.eql(u8, result, expected)); + try testResolveWindows(&[_][]const u8{ "/usr/local", "lib\\zig\\std\\array_list.zig" }, expected); } { - const result = testResolveWindows(&[_][]const u8{ "usr/local", "lib\\zig" }); - const expected = try join(testing.allocator, &[_][]const u8{ + const expected = try join(testing.leak_count_allocator, &[_][]const u8{ cwd, "usr\\local\\lib\\zig", }); + defer testing.leak_count_allocator.free(expected); if (parsed_cwd.kind == WindowsPath.Kind.Drive) { expected[0] = asciiUpper(parsed_cwd.disk_designator[0]); } - testing.expect(mem.eql(u8, result, expected)); + try testResolveWindows(&[_][]const u8{ "usr/local", "lib\\zig" }, expected); } } - testing.expect(mem.eql(u8, testResolveWindows(&[_][]const u8{ "c:\\a\\b\\c", "/hi", "ok" }), "C:\\hi\\ok")); - testing.expect(mem.eql(u8, testResolveWindows(&[_][]const u8{ "c:/blah\\blah", "d:/games", "c:../a" }), "C:\\blah\\a")); - testing.expect(mem.eql(u8, testResolveWindows(&[_][]const u8{ "c:/blah\\blah", "d:/games", "C:../a" }), "C:\\blah\\a")); - testing.expect(mem.eql(u8, testResolveWindows(&[_][]const u8{ "c:/ignore", "d:\\a/b\\c/d", "\\e.exe" }), "D:\\e.exe")); - testing.expect(mem.eql(u8, testResolveWindows(&[_][]const u8{ "c:/ignore", "c:/some/file" }), "C:\\some\\file")); - testing.expect(mem.eql(u8, testResolveWindows(&[_][]const u8{ "d:/ignore", "d:some/dir//" }), "D:\\ignore\\some\\dir")); - testing.expect(mem.eql(u8, testResolveWindows(&[_][]const u8{ "//server/share", "..", "relative\\" }), "\\\\server\\share\\relative")); - testing.expect(mem.eql(u8, testResolveWindows(&[_][]const u8{ "c:/", "//" }), "C:\\")); - testing.expect(mem.eql(u8, testResolveWindows(&[_][]const u8{ "c:/", "//dir" }), "C:\\dir")); - testing.expect(mem.eql(u8, testResolveWindows(&[_][]const u8{ "c:/", "//server/share" }), "\\\\server\\share\\")); - testing.expect(mem.eql(u8, testResolveWindows(&[_][]const u8{ "c:/", "//server//share" }), "\\\\server\\share\\")); - testing.expect(mem.eql(u8, testResolveWindows(&[_][]const u8{ "c:/", "///some//dir" }), "C:\\some\\dir")); - testing.expect(mem.eql(u8, testResolveWindows(&[_][]const u8{ "C:\\foo\\tmp.3\\", "..\\tmp.3\\cycles\\root.js" }), "C:\\foo\\tmp.3\\cycles\\root.js")); + try testResolveWindows(&[_][]const u8{ "c:\\a\\b\\c", "/hi", "ok" }, "C:\\hi\\ok"); + try testResolveWindows(&[_][]const u8{ "c:/blah\\blah", "d:/games", "c:../a" }, "C:\\blah\\a"); + try testResolveWindows(&[_][]const u8{ "c:/blah\\blah", "d:/games", "C:../a" }, "C:\\blah\\a"); + try testResolveWindows(&[_][]const u8{ "c:/ignore", "d:\\a/b\\c/d", "\\e.exe" }, "D:\\e.exe"); + try testResolveWindows(&[_][]const u8{ "c:/ignore", "c:/some/file" }, "C:\\some\\file"); + try testResolveWindows(&[_][]const u8{ "d:/ignore", "d:some/dir//" }, "D:\\ignore\\some\\dir"); + try testResolveWindows(&[_][]const u8{ "//server/share", "..", "relative\\" }, "\\\\server\\share\\relative"); + try testResolveWindows(&[_][]const u8{ "c:/", "//" }, "C:\\"); + try testResolveWindows(&[_][]const u8{ "c:/", "//dir" }, "C:\\dir"); + try testResolveWindows(&[_][]const u8{ "c:/", "//server/share" }, "\\\\server\\share\\"); + try testResolveWindows(&[_][]const u8{ "c:/", "//server//share" }, "\\\\server\\share\\"); + try testResolveWindows(&[_][]const u8{ "c:/", "///some//dir" }, "C:\\some\\dir"); + try testResolveWindows(&[_][]const u8{ "C:\\foo\\tmp.3\\", "..\\tmp.3\\cycles\\root.js" }, "C:\\foo\\tmp.3\\cycles\\root.js"); } test "resolvePosix" { - testing.expect(mem.eql(u8, testResolvePosix(&[_][]const u8{ "/a/b", "c" }), "/a/b/c")); - testing.expect(mem.eql(u8, testResolvePosix(&[_][]const u8{ "/a/b", "c", "//d", "e///" }), "/d/e")); - testing.expect(mem.eql(u8, testResolvePosix(&[_][]const u8{ "/a/b/c", "..", "../" }), "/a")); - testing.expect(mem.eql(u8, testResolvePosix(&[_][]const u8{ "/", "..", ".." }), "/")); - testing.expect(mem.eql(u8, testResolvePosix(&[_][]const u8{"/a/b/c/"}), "/a/b/c")); - - testing.expect(mem.eql(u8, testResolvePosix(&[_][]const u8{ "/var/lib", "../", "file/" }), "/var/file")); - testing.expect(mem.eql(u8, testResolvePosix(&[_][]const u8{ "/var/lib", "/../", "file/" }), "/file")); - testing.expect(mem.eql(u8, testResolvePosix(&[_][]const u8{ "/some/dir", ".", "/absolute/" }), "/absolute")); - testing.expect(mem.eql(u8, testResolvePosix(&[_][]const u8{ "/foo/tmp.3/", "../tmp.3/cycles/root.js" }), "/foo/tmp.3/cycles/root.js")); + try testResolvePosix(&[_][]const u8{ "/a/b", "c" }, "/a/b/c"); + try testResolvePosix(&[_][]const u8{ "/a/b", "c", "//d", "e///" }, "/d/e"); + try testResolvePosix(&[_][]const u8{ "/a/b/c", "..", "../" }, "/a"); + try testResolvePosix(&[_][]const u8{ "/", "..", ".." }, "/"); + try testResolvePosix(&[_][]const u8{"/a/b/c/"}, "/a/b/c"); + + try testResolvePosix(&[_][]const u8{ "/var/lib", "../", "file/" }, "/var/file"); + try testResolvePosix(&[_][]const u8{ "/var/lib", "/../", "file/" }, "/file"); + try testResolvePosix(&[_][]const u8{ "/some/dir", ".", "/absolute/" }, "/absolute"); + try testResolvePosix(&[_][]const u8{ "/foo/tmp.3/", "../tmp.3/cycles/root.js" }, "/foo/tmp.3/cycles/root.js"); } -fn testResolveWindows(paths: []const []const u8) []u8 { - return resolveWindows(testing.allocator, paths) catch unreachable; +fn testResolveWindows(paths: []const []const u8, expected: []const u8) !void { + const actual = try resolveWindows(testing.leak_count_allocator, paths); + defer testing.leak_count_allocator.free(actual); + return testing.expect(mem.eql(u8, actual, expected)); } -fn testResolvePosix(paths: []const []const u8) []u8 { - return resolvePosix(testing.allocator, paths) catch unreachable; +fn testResolvePosix(paths: []const []const u8, expected: []const u8) !void { + const actual = try resolvePosix(testing.leak_count_allocator, paths); + defer testing.leak_count_allocator.free(actual); + return testing.expect(mem.eql(u8, actual, expected)); } /// If the path is a file in the current directory (no directory component) @@ -1126,51 +1132,53 @@ test "relative" { // TODO https://github.com/ziglang/zig/issues/3288 return error.SkipZigTest; } - testRelativeWindows("c:/blah\\blah", "d:/games", "D:\\games"); - testRelativeWindows("c:/aaaa/bbbb", "c:/aaaa", ".."); - testRelativeWindows("c:/aaaa/bbbb", "c:/cccc", "..\\..\\cccc"); - testRelativeWindows("c:/aaaa/bbbb", "c:/aaaa/bbbb", ""); - testRelativeWindows("c:/aaaa/bbbb", "c:/aaaa/cccc", "..\\cccc"); - testRelativeWindows("c:/aaaa/", "c:/aaaa/cccc", "cccc"); - testRelativeWindows("c:/", "c:\\aaaa\\bbbb", "aaaa\\bbbb"); - testRelativeWindows("c:/aaaa/bbbb", "d:\\", "D:\\"); - testRelativeWindows("c:/AaAa/bbbb", "c:/aaaa/bbbb", ""); - testRelativeWindows("c:/aaaaa/", "c:/aaaa/cccc", "..\\aaaa\\cccc"); - testRelativeWindows("C:\\foo\\bar\\baz\\quux", "C:\\", "..\\..\\..\\.."); - testRelativeWindows("C:\\foo\\test", "C:\\foo\\test\\bar\\package.json", "bar\\package.json"); - testRelativeWindows("C:\\foo\\bar\\baz-quux", "C:\\foo\\bar\\baz", "..\\baz"); - testRelativeWindows("C:\\foo\\bar\\baz", "C:\\foo\\bar\\baz-quux", "..\\baz-quux"); - testRelativeWindows("\\\\foo\\bar", "\\\\foo\\bar\\baz", "baz"); - testRelativeWindows("\\\\foo\\bar\\baz", "\\\\foo\\bar", ".."); - testRelativeWindows("\\\\foo\\bar\\baz-quux", "\\\\foo\\bar\\baz", "..\\baz"); - testRelativeWindows("\\\\foo\\bar\\baz", "\\\\foo\\bar\\baz-quux", "..\\baz-quux"); - testRelativeWindows("C:\\baz-quux", "C:\\baz", "..\\baz"); - testRelativeWindows("C:\\baz", "C:\\baz-quux", "..\\baz-quux"); - testRelativeWindows("\\\\foo\\baz-quux", "\\\\foo\\baz", "..\\baz"); - testRelativeWindows("\\\\foo\\baz", "\\\\foo\\baz-quux", "..\\baz-quux"); - testRelativeWindows("C:\\baz", "\\\\foo\\bar\\baz", "\\\\foo\\bar\\baz"); - testRelativeWindows("\\\\foo\\bar\\baz", "C:\\baz", "C:\\baz"); - - testRelativePosix("/var/lib", "/var", ".."); - testRelativePosix("/var/lib", "/bin", "../../bin"); - testRelativePosix("/var/lib", "/var/lib", ""); - testRelativePosix("/var/lib", "/var/apache", "../apache"); - testRelativePosix("/var/", "/var/lib", "lib"); - testRelativePosix("/", "/var/lib", "var/lib"); - testRelativePosix("/foo/test", "/foo/test/bar/package.json", "bar/package.json"); - testRelativePosix("/Users/a/web/b/test/mails", "/Users/a/web/b", "../.."); - testRelativePosix("/foo/bar/baz-quux", "/foo/bar/baz", "../baz"); - testRelativePosix("/foo/bar/baz", "/foo/bar/baz-quux", "../baz-quux"); - testRelativePosix("/baz-quux", "/baz", "../baz"); - testRelativePosix("/baz", "/baz-quux", "../baz-quux"); + try testRelativeWindows("c:/blah\\blah", "d:/games", "D:\\games"); + try testRelativeWindows("c:/aaaa/bbbb", "c:/aaaa", ".."); + try testRelativeWindows("c:/aaaa/bbbb", "c:/cccc", "..\\..\\cccc"); + try testRelativeWindows("c:/aaaa/bbbb", "c:/aaaa/bbbb", ""); + try testRelativeWindows("c:/aaaa/bbbb", "c:/aaaa/cccc", "..\\cccc"); + try testRelativeWindows("c:/aaaa/", "c:/aaaa/cccc", "cccc"); + try testRelativeWindows("c:/", "c:\\aaaa\\bbbb", "aaaa\\bbbb"); + try testRelativeWindows("c:/aaaa/bbbb", "d:\\", "D:\\"); + try testRelativeWindows("c:/AaAa/bbbb", "c:/aaaa/bbbb", ""); + try testRelativeWindows("c:/aaaaa/", "c:/aaaa/cccc", "..\\aaaa\\cccc"); + try testRelativeWindows("C:\\foo\\bar\\baz\\quux", "C:\\", "..\\..\\..\\.."); + try testRelativeWindows("C:\\foo\\test", "C:\\foo\\test\\bar\\package.json", "bar\\package.json"); + try testRelativeWindows("C:\\foo\\bar\\baz-quux", "C:\\foo\\bar\\baz", "..\\baz"); + try testRelativeWindows("C:\\foo\\bar\\baz", "C:\\foo\\bar\\baz-quux", "..\\baz-quux"); + try testRelativeWindows("\\\\foo\\bar", "\\\\foo\\bar\\baz", "baz"); + try testRelativeWindows("\\\\foo\\bar\\baz", "\\\\foo\\bar", ".."); + try testRelativeWindows("\\\\foo\\bar\\baz-quux", "\\\\foo\\bar\\baz", "..\\baz"); + try testRelativeWindows("\\\\foo\\bar\\baz", "\\\\foo\\bar\\baz-quux", "..\\baz-quux"); + try testRelativeWindows("C:\\baz-quux", "C:\\baz", "..\\baz"); + try testRelativeWindows("C:\\baz", "C:\\baz-quux", "..\\baz-quux"); + try testRelativeWindows("\\\\foo\\baz-quux", "\\\\foo\\baz", "..\\baz"); + try testRelativeWindows("\\\\foo\\baz", "\\\\foo\\baz-quux", "..\\baz-quux"); + try testRelativeWindows("C:\\baz", "\\\\foo\\bar\\baz", "\\\\foo\\bar\\baz"); + try testRelativeWindows("\\\\foo\\bar\\baz", "C:\\baz", "C:\\baz"); + + try testRelativePosix("/var/lib", "/var", ".."); + try testRelativePosix("/var/lib", "/bin", "../../bin"); + try testRelativePosix("/var/lib", "/var/lib", ""); + try testRelativePosix("/var/lib", "/var/apache", "../apache"); + try testRelativePosix("/var/", "/var/lib", "lib"); + try testRelativePosix("/", "/var/lib", "var/lib"); + try testRelativePosix("/foo/test", "/foo/test/bar/package.json", "bar/package.json"); + try testRelativePosix("/Users/a/web/b/test/mails", "/Users/a/web/b", "../.."); + try testRelativePosix("/foo/bar/baz-quux", "/foo/bar/baz", "../baz"); + try testRelativePosix("/foo/bar/baz", "/foo/bar/baz-quux", "../baz-quux"); + try testRelativePosix("/baz-quux", "/baz", "../baz"); + try testRelativePosix("/baz", "/baz-quux", "../baz-quux"); } -fn testRelativePosix(from: []const u8, to: []const u8, expected_output: []const u8) void { - const result = relativePosix(testing.allocator, from, to) catch unreachable; +fn testRelativePosix(from: []const u8, to: []const u8, expected_output: []const u8) !void { + const result = try relativePosix(testing.leak_count_allocator, from, to); + defer testing.leak_count_allocator.free(result); testing.expectEqualSlices(u8, expected_output, result); } -fn testRelativeWindows(from: []const u8, to: []const u8, expected_output: []const u8) void { - const result = relativeWindows(testing.allocator, from, to) catch unreachable; +fn testRelativeWindows(from: []const u8, to: []const u8, expected_output: []const u8) !void { + const result = try relativeWindows(testing.leak_count_allocator, from, to); + defer testing.leak_count_allocator.free(result); testing.expectEqualSlices(u8, expected_output, result); } diff --git a/lib/std/linked_list.zig b/lib/std/linked_list.zig index a21c9a83eb..d1652a8047 100644 --- a/lib/std/linked_list.zig +++ b/lib/std/linked_list.zig @@ -143,7 +143,7 @@ pub fn SinglyLinkedList(comptime T: type) type { } test "basic SinglyLinkedList test" { - const allocator = testing.allocator; + const allocator = testing.leak_count_allocator; var list = SinglyLinkedList(u32).init(); var one = try list.createNode(1, allocator); @@ -404,7 +404,7 @@ pub fn TailQueue(comptime T: type) type { } test "basic TailQueue test" { - const allocator = testing.allocator; + const allocator = testing.leak_count_allocator; var list = TailQueue(u32).init(); var one = try list.createNode(1, allocator); @@ -456,7 +456,7 @@ test "basic TailQueue test" { } test "TailQueue concatenation" { - const allocator = testing.allocator; + const allocator = testing.leak_count_allocator; var list1 = TailQueue(u32).init(); var list2 = TailQueue(u32).init(); diff --git a/lib/std/os/test.zig b/lib/std/os/test.zig index 0d3be9e7e4..2e60fe500e 100644 --- a/lib/std/os/test.zig +++ b/lib/std/os/test.zig @@ -9,7 +9,7 @@ const elf = std.elf; const File = std.fs.File; const Thread = std.Thread; -const a = std.testing.allocator; +const a = std.testing.leak_count_allocator; const builtin = @import("builtin"); const AtomicRmwOp = builtin.AtomicRmwOp; diff --git a/lib/std/priority_queue.zig b/lib/std/priority_queue.zig index e726a07a88..9c07d20798 100644 --- a/lib/std/priority_queue.zig +++ b/lib/std/priority_queue.zig @@ -239,7 +239,7 @@ fn greaterThan(a: u32, b: u32) bool { const PQ = PriorityQueue(u32); test "std.PriorityQueue: add and remove min heap" { - var queue = PQ.init(testing.allocator, lessThan); + var queue = PQ.init(testing.leak_count_allocator, lessThan); defer queue.deinit(); try queue.add(54); @@ -257,7 +257,7 @@ test "std.PriorityQueue: add and remove min heap" { } test "std.PriorityQueue: add and remove same min heap" { - var queue = PQ.init(testing.allocator, lessThan); + var queue = PQ.init(testing.leak_count_allocator, lessThan); defer queue.deinit(); try queue.add(1); @@ -275,14 +275,14 @@ test "std.PriorityQueue: add and remove same min heap" { } test "std.PriorityQueue: removeOrNull on empty" { - var queue = PQ.init(testing.allocator, lessThan); + var queue = PQ.init(testing.leak_count_allocator, lessThan); defer queue.deinit(); expect(queue.removeOrNull() == null); } test "std.PriorityQueue: edge case 3 elements" { - var queue = PQ.init(testing.allocator, lessThan); + var queue = PQ.init(testing.leak_count_allocator, lessThan); defer queue.deinit(); try queue.add(9); @@ -294,7 +294,7 @@ test "std.PriorityQueue: edge case 3 elements" { } test "std.PriorityQueue: peek" { - var queue = PQ.init(testing.allocator, lessThan); + var queue = PQ.init(testing.leak_count_allocator, lessThan); defer queue.deinit(); expect(queue.peek() == null); @@ -306,7 +306,7 @@ test "std.PriorityQueue: peek" { } test "std.PriorityQueue: sift up with odd indices" { - var queue = PQ.init(testing.allocator, lessThan); + var queue = PQ.init(testing.leak_count_allocator, lessThan); defer queue.deinit(); const items = [_]u32{ 15, 7, 21, 14, 13, 22, 12, 6, 7, 25, 5, 24, 11, 16, 15, 24, 2, 1 }; for (items) |e| { @@ -320,7 +320,7 @@ test "std.PriorityQueue: sift up with odd indices" { } test "std.PriorityQueue: addSlice" { - var queue = PQ.init(testing.allocator, lessThan); + var queue = PQ.init(testing.leak_count_allocator, lessThan); defer queue.deinit(); const items = [_]u32{ 15, 7, 21, 14, 13, 22, 12, 6, 7, 25, 5, 24, 11, 16, 15, 24, 2, 1 }; try queue.addSlice(items[0..]); @@ -333,8 +333,8 @@ test "std.PriorityQueue: addSlice" { test "std.PriorityQueue: fromOwnedSlice" { const items = [_]u32{ 15, 7, 21, 14, 13, 22, 12, 6, 7, 25, 5, 24, 11, 16, 15, 24, 2, 1 }; - const heap_items = try std.mem.dupe(testing.allocator, u32, items[0..]); - var queue = PQ.fromOwnedSlice(testing.allocator, lessThan, heap_items[0..]); + const heap_items = try std.mem.dupe(testing.leak_count_allocator, u32, items[0..]); + var queue = PQ.fromOwnedSlice(testing.leak_count_allocator, lessThan, heap_items[0..]); defer queue.deinit(); const sorted_items = [_]u32{ 1, 2, 5, 6, 7, 7, 11, 12, 13, 14, 15, 15, 16, 21, 22, 24, 24, 25 }; @@ -344,7 +344,7 @@ test "std.PriorityQueue: fromOwnedSlice" { } test "std.PriorityQueue: add and remove max heap" { - var queue = PQ.init(testing.allocator, greaterThan); + var queue = PQ.init(testing.leak_count_allocator, greaterThan); defer queue.deinit(); try queue.add(54); @@ -362,7 +362,7 @@ test "std.PriorityQueue: add and remove max heap" { } test "std.PriorityQueue: add and remove same max heap" { - var queue = PQ.init(testing.allocator, greaterThan); + var queue = PQ.init(testing.leak_count_allocator, greaterThan); defer queue.deinit(); try queue.add(1); @@ -380,8 +380,8 @@ test "std.PriorityQueue: add and remove same max heap" { } test "std.PriorityQueue: iterator" { - var queue = PQ.init(testing.allocator, lessThan); - var map = std.AutoHashMap(u32, void).init(testing.allocator); + var queue = PQ.init(testing.leak_count_allocator, lessThan); + var map = std.AutoHashMap(u32, void).init(testing.leak_count_allocator); defer { queue.deinit(); map.deinit(); @@ -402,7 +402,7 @@ test "std.PriorityQueue: iterator" { } test "std.PriorityQueue: remove at index" { - var queue = PQ.init(testing.allocator, lessThan); + var queue = PQ.init(testing.leak_count_allocator, lessThan); defer queue.deinit(); try queue.add(3); diff --git a/lib/std/process.zig b/lib/std/process.zig index 2758e25ac0..19f0eac235 100644 --- a/lib/std/process.zig +++ b/lib/std/process.zig @@ -114,7 +114,7 @@ pub fn getEnvMap(allocator: *Allocator) !BufMap { } test "os.getEnvMap" { - var env = try getEnvMap(std.testing.allocator); + var env = try getEnvMap(std.testing.leak_count_allocator); defer env.deinit(); } @@ -165,7 +165,7 @@ pub fn getEnvVarOwned(allocator: *mem.Allocator, key: []const u8) GetEnvVarOwned } test "os.getEnvVarOwned" { - var ga = std.testing.allocator; + var ga = std.testing.leak_count_allocator; testing.expectError(error.EnvironmentVariableNotFound, getEnvVarOwned(ga, "BADENV")); } @@ -492,10 +492,11 @@ test "windows arg parsing" { fn testWindowsCmdLine(input_cmd_line: [*]const u8, expected_args: []const []const u8) void { var it = ArgIteratorWindows.initWithCmdLine(input_cmd_line); for (expected_args) |expected_arg| { - const arg = it.next(std.testing.allocator).? catch unreachable; + const arg = it.next(std.testing.leak_count_allocator).? catch unreachable; + defer std.testing.leak_count_allocator.free(arg); testing.expectEqualSlices(u8, expected_arg, arg); } - testing.expect(it.next(std.testing.allocator) == null); + testing.expect(it.next(std.testing.leak_count_allocator) == null); } pub const UserInfo = struct { diff --git a/lib/std/special/test_runner.zig b/lib/std/special/test_runner.zig index 286dfbed1b..e519f7f766 100644 --- a/lib/std/special/test_runner.zig +++ b/lib/std/special/test_runner.zig @@ -14,6 +14,7 @@ pub fn main() anyerror!void { for (test_fn_list) |test_fn, i| { std.testing.allocator_instance.reset(); + var test_node = root_node.start(test_fn.name, null); test_node.activate(); progress.refresh(); @@ -36,6 +37,8 @@ pub fn main() anyerror!void { return err; }, } + + try std.testing.leak_count_allocator_instance.validate(); } root_node.end(); if (ok_count == test_fn_list.len) { diff --git a/lib/std/testing.zig b/lib/std/testing.zig index 02d7cdb393..58298708c3 100644 --- a/lib/std/testing.zig +++ b/lib/std/testing.zig @@ -7,6 +7,48 @@ pub const allocator = &allocator_instance.allocator; pub var allocator_instance = std.heap.ThreadSafeFixedBufferAllocator.init(allocator_mem[0..]); var allocator_mem: [100 * 1024]u8 = undefined; +pub const leak_count_allocator = &leak_count_allocator_instance.allocator; +pub var leak_count_allocator_instance = LeakCountAllocator.init(allocator); +const LeakCountAllocator = struct { + count: usize, + allocator: std.mem.Allocator, + internal_allocator: *std.mem.Allocator, + + fn init(allo: *std.mem.Allocator) LeakCountAllocator { + return .{ + .count = 0, + .allocator = .{ + .reallocFn = realloc, + .shrinkFn = shrink, + }, + .internal_allocator = allo, + }; + } + + fn realloc(allo: *std.mem.Allocator, old_mem: []u8, old_align: u29, new_size: usize, new_align: u29) ![]u8 { + const self = @fieldParentPtr(LeakCountAllocator, "allocator", allo); + if (old_mem.len == 0) { + self.count += 1; + } + return self.internal_allocator.reallocFn(self.internal_allocator, old_mem, old_align, new_size, new_align); + } + + fn shrink(allo: *std.mem.Allocator, old_mem: []u8, old_align: u29, new_size: usize, new_align: u29) []u8 { + const self = @fieldParentPtr(LeakCountAllocator, "allocator", allo); + if (new_size == 0) { + self.count -= 1; + } + return self.internal_allocator.shrinkFn(self.internal_allocator, old_mem, old_align, new_size, new_align); + } + + fn validate(self: LeakCountAllocator) !void { + if (self.count > 0) { + std.debug.warn("Detected leaked allocations without matching free: {}\n", .{self.count}); + return error.Leak; + } + } +}; + /// This function is intended to be used only in tests. It prints diagnostics to stderr /// and then aborts when actual_error_union is not expected_error. pub fn expectError(expected_error: anyerror, actual_error_union: var) void { diff --git a/lib/std/unicode.zig b/lib/std/unicode.zig index 638b5f5e2f..1884796835 100644 --- a/lib/std/unicode.zig +++ b/lib/std/unicode.zig @@ -501,14 +501,16 @@ test "utf16leToUtf8" { { mem.writeIntSliceLittle(u16, utf16le_as_bytes[0..], 'A'); mem.writeIntSliceLittle(u16, utf16le_as_bytes[2..], 'a'); - const utf8 = try utf16leToUtf8Alloc(std.testing.allocator, &utf16le); + const utf8 = try utf16leToUtf8Alloc(std.testing.leak_count_allocator, &utf16le); + defer std.testing.leak_count_allocator.free(utf8); testing.expect(mem.eql(u8, utf8, "Aa")); } { mem.writeIntSliceLittle(u16, utf16le_as_bytes[0..], 0x80); mem.writeIntSliceLittle(u16, utf16le_as_bytes[2..], 0xffff); - const utf8 = try utf16leToUtf8Alloc(std.testing.allocator, &utf16le); + const utf8 = try utf16leToUtf8Alloc(std.testing.leak_count_allocator, &utf16le); + defer std.testing.leak_count_allocator.free(utf8); testing.expect(mem.eql(u8, utf8, "\xc2\x80" ++ "\xef\xbf\xbf")); } @@ -516,7 +518,8 @@ test "utf16leToUtf8" { // the values just outside the surrogate half range mem.writeIntSliceLittle(u16, utf16le_as_bytes[0..], 0xd7ff); mem.writeIntSliceLittle(u16, utf16le_as_bytes[2..], 0xe000); - const utf8 = try utf16leToUtf8Alloc(std.testing.allocator, &utf16le); + const utf8 = try utf16leToUtf8Alloc(std.testing.leak_count_allocator, &utf16le); + defer std.testing.leak_count_allocator.free(utf8); testing.expect(mem.eql(u8, utf8, "\xed\x9f\xbf" ++ "\xee\x80\x80")); } @@ -524,7 +527,8 @@ test "utf16leToUtf8" { // smallest surrogate pair mem.writeIntSliceLittle(u16, utf16le_as_bytes[0..], 0xd800); mem.writeIntSliceLittle(u16, utf16le_as_bytes[2..], 0xdc00); - const utf8 = try utf16leToUtf8Alloc(std.testing.allocator, &utf16le); + const utf8 = try utf16leToUtf8Alloc(std.testing.leak_count_allocator, &utf16le); + defer std.testing.leak_count_allocator.free(utf8); testing.expect(mem.eql(u8, utf8, "\xf0\x90\x80\x80")); } @@ -532,14 +536,16 @@ test "utf16leToUtf8" { // largest surrogate pair mem.writeIntSliceLittle(u16, utf16le_as_bytes[0..], 0xdbff); mem.writeIntSliceLittle(u16, utf16le_as_bytes[2..], 0xdfff); - const utf8 = try utf16leToUtf8Alloc(std.testing.allocator, &utf16le); + const utf8 = try utf16leToUtf8Alloc(std.testing.leak_count_allocator, &utf16le); + defer std.testing.leak_count_allocator.free(utf8); testing.expect(mem.eql(u8, utf8, "\xf4\x8f\xbf\xbf")); } { mem.writeIntSliceLittle(u16, utf16le_as_bytes[0..], 0xdbff); mem.writeIntSliceLittle(u16, utf16le_as_bytes[2..], 0xdc00); - const utf8 = try utf16leToUtf8Alloc(std.testing.allocator, &utf16le); + const utf8 = try utf16leToUtf8Alloc(std.testing.leak_count_allocator, &utf16le); + defer std.testing.leak_count_allocator.free(utf8); testing.expect(mem.eql(u8, utf8, "\xf4\x8f\xb0\x80")); } } diff --git a/lib/std/zig/ast.zig b/lib/std/zig/ast.zig index e339343823..c967c78789 100644 --- a/lib/std/zig/ast.zig +++ b/lib/std/zig/ast.zig @@ -2287,7 +2287,7 @@ pub const Node = struct { test "iterate" { var root = Node.Root{ .base = Node{ .id = Node.Id.Root }, - .decls = Node.Root.DeclList.init(std.testing.allocator), + .decls = Node.Root.DeclList.init(std.testing.leak_count_allocator), .eof_token = 0, }; var base = &root.base; diff --git a/test/compare_output.zig b/test/compare_output.zig index 7a41d46f54..d743e0784a 100644 --- a/test/compare_output.zig +++ b/test/compare_output.zig @@ -445,7 +445,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void { \\const std = @import("std"); \\const io = std.io; \\const os = std.os; - \\const allocator = std.testing.allocator; + \\const allocator = std.testing.leak_count_allocator; \\ \\pub fn main() !void { \\ var args_it = std.process.args(); @@ -486,7 +486,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void { \\const std = @import("std"); \\const io = std.io; \\const os = std.os; - \\const allocator = std.testing.allocator; + \\const allocator = std.testing.leak_count_allocator; \\ \\pub fn main() !void { \\ var args_it = std.process.args(); diff --git a/test/compile_errors.zig b/test/compile_errors.zig index 341062e161..2f3f0a9f1f 100644 --- a/test/compile_errors.zig +++ b/test/compile_errors.zig @@ -5765,7 +5765,7 @@ pub fn addCases(cases: *tests.CompileErrorContext) void { \\ \\export fn entry() void { \\ const a = MdNode.Header { - \\ .text = MdText.init(&std.testing.allocator), + \\ .text = MdText.init(&std.testing.leak_count_allocator), \\ .weight = HeaderWeight.H1, \\ }; \\} diff --git a/test/stage1/behavior/const_slice_child.zig b/test/stage1/behavior/const_slice_child.zig index cf650ae88e..848a4780e5 100644 --- a/test/stage1/behavior/const_slice_child.zig +++ b/test/stage1/behavior/const_slice_child.zig @@ -22,7 +22,7 @@ fn foo(args: [][]const u8) void { } fn bar(argc: usize) void { - const args = testing.allocator.alloc([]const u8, argc) catch unreachable; + const args = testing.leak_count_allocator.alloc([]const u8, argc) catch unreachable; for (args) |_, i| { const ptr = argv[i]; args[i] = ptr[0..strlen(ptr)]; diff --git a/test/standalone/brace_expansion/main.zig b/test/standalone/brace_expansion/main.zig index c6bfd02e79..33fe826d18 100644 --- a/test/standalone/brace_expansion/main.zig +++ b/test/standalone/brace_expansion/main.zig @@ -201,7 +201,7 @@ pub fn main() !void { } test "invalid inputs" { - global_allocator = std.testing.allocator; + global_allocator = std.testing.leak_count_allocator; expectError("}ABC", error.InvalidInput); expectError("{ABC", error.InvalidInput); @@ -222,7 +222,7 @@ fn expectError(test_input: []const u8, expected_err: anyerror) void { } test "valid inputs" { - global_allocator = std.testing.allocator; + global_allocator = std.testing.leak_count_allocator; expectExpansion("{x,y,z}", "x y z"); expectExpansion("{A,B}{x,y}", "Ax Ay Bx By"); diff --git a/test/standalone/cat/main.zig b/test/standalone/cat/main.zig index 34439f9c24..10ec00d6e8 100644 --- a/test/standalone/cat/main.zig +++ b/test/standalone/cat/main.zig @@ -4,7 +4,7 @@ const process = std.process; const fs = std.fs; const mem = std.mem; const warn = std.debug.warn; -const allocator = std.testing.allocator; +const allocator = std.testing.leak_count_allocator; pub fn main() !void { var args_it = process.args(); diff --git a/test/standalone/empty_env/main.zig b/test/standalone/empty_env/main.zig index f4ebf56136..dc2ac73738 100644 --- a/test/standalone/empty_env/main.zig +++ b/test/standalone/empty_env/main.zig @@ -1,6 +1,6 @@ const std = @import("std"); pub fn main() void { - const env_map = std.process.getEnvMap(std.testing.allocator) catch @panic("unable to get env map"); + const env_map = std.process.getEnvMap(std.testing.leak_count_allocator) catch @panic("unable to get env map"); std.testing.expect(env_map.count() == 0); } diff --git a/test/standalone/load_dynamic_library/main.zig b/test/standalone/load_dynamic_library/main.zig index 70fc4986ac..5a2e55e937 100644 --- a/test/standalone/load_dynamic_library/main.zig +++ b/test/standalone/load_dynamic_library/main.zig @@ -1,8 +1,8 @@ const std = @import("std"); pub fn main() !void { - const args = try std.process.argsAlloc(std.testing.allocator); - defer std.process.argsFree(std.testing.allocator, args); + const args = try std.process.argsAlloc(std.testing.leak_count_allocator); + defer std.process.argsFree(std.testing.leak_count_allocator, args); const dynlib_name = args[1]; -- cgit v1.2.3 From b077f3ab7d55374d2770336db236ecd7b18238a8 Mon Sep 17 00:00:00 2001 From: Benjamin Feng Date: Wed, 29 Jan 2020 21:22:01 -0600 Subject: Promoted "leak_count_allocator" to the main testing.allocator --- doc/docgen.zig | 4 ++-- lib/std/array_list.zig | 14 ++++++------ lib/std/buffer.zig | 6 ++--- lib/std/debug.zig | 2 +- lib/std/fifo.zig | 4 ++-- lib/std/fmt.zig | 10 ++++----- lib/std/fs/path.zig | 32 +++++++++++++-------------- lib/std/linked_list.zig | 6 ++--- lib/std/os/test.zig | 2 +- lib/std/priority_queue.zig | 28 +++++++++++------------ lib/std/process.zig | 10 ++++----- lib/std/special/test_runner.zig | 7 +++--- lib/std/testing.zig | 14 ++++++------ lib/std/testing/leak_count_allocator.zig | 2 +- lib/std/unicode.zig | 24 ++++++++++---------- lib/std/zig/ast.zig | 2 +- test/compare_output.zig | 4 ++-- test/compile_errors.zig | 2 +- test/stage1/behavior/const_slice_child.zig | 4 ++-- test/standalone/brace_expansion/main.zig | 4 ++-- test/standalone/cat/main.zig | 2 +- test/standalone/empty_env/main.zig | 2 +- test/standalone/load_dynamic_library/main.zig | 4 ++-- 23 files changed, 95 insertions(+), 94 deletions(-) (limited to 'lib/std/buffer.zig') diff --git a/doc/docgen.zig b/doc/docgen.zig index cc4993d65f..e94f3500e7 100644 --- a/doc/docgen.zig +++ b/doc/docgen.zig @@ -672,8 +672,8 @@ const TermState = enum { test "term color" { const input_bytes = "A\x1b[32;1mgreen\x1b[0mB"; - const result = try termColor(std.testing.leak_count_allocator, input_bytes); - defer std.testing.leak_count_allocator.free(result); + const result = try termColor(std.testing.allocator, input_bytes); + defer std.testing.allocator.free(result); testing.expectEqualSlices(u8, "AgreenB", result); } diff --git a/lib/std/array_list.zig b/lib/std/array_list.zig index 57c0d706a2..b028390465 100644 --- a/lib/std/array_list.zig +++ b/lib/std/array_list.zig @@ -320,7 +320,7 @@ test "std.ArrayList.basic" { } test "std.ArrayList.orderedRemove" { - var list = ArrayList(i32).init(testing.leak_count_allocator); + var list = ArrayList(i32).init(testing.allocator); defer list.deinit(); try list.append(1); @@ -347,7 +347,7 @@ test "std.ArrayList.orderedRemove" { } test "std.ArrayList.swapRemove" { - var list = ArrayList(i32).init(testing.leak_count_allocator); + var list = ArrayList(i32).init(testing.allocator); defer list.deinit(); try list.append(1); @@ -374,7 +374,7 @@ test "std.ArrayList.swapRemove" { } test "std.ArrayList.swapRemoveOrError" { - var list = ArrayList(i32).init(testing.leak_count_allocator); + var list = ArrayList(i32).init(testing.allocator); defer list.deinit(); // Test just after initialization @@ -402,7 +402,7 @@ test "std.ArrayList.swapRemoveOrError" { } test "std.ArrayList.insert" { - var list = ArrayList(i32).init(testing.leak_count_allocator); + var list = ArrayList(i32).init(testing.allocator); defer list.deinit(); try list.append(1); @@ -416,7 +416,7 @@ test "std.ArrayList.insert" { } test "std.ArrayList.insertSlice" { - var list = ArrayList(i32).init(testing.leak_count_allocator); + var list = ArrayList(i32).init(testing.allocator); defer list.deinit(); try list.append(1); @@ -443,8 +443,8 @@ const Item = struct { }; test "std.ArrayList: ArrayList(T) of struct T" { - var root = Item{ .integer = 1, .sub_items = ArrayList(Item).init(testing.leak_count_allocator) }; + var root = Item{ .integer = 1, .sub_items = ArrayList(Item).init(testing.allocator) }; defer root.sub_items.deinit(); - try root.sub_items.append(Item{ .integer = 42, .sub_items = ArrayList(Item).init(testing.leak_count_allocator) }); + try root.sub_items.append(Item{ .integer = 42, .sub_items = ArrayList(Item).init(testing.allocator) }); testing.expect(root.sub_items.items[0].integer == 42); } diff --git a/lib/std/buffer.zig b/lib/std/buffer.zig index cc1166e0e7..077b2b615f 100644 --- a/lib/std/buffer.zig +++ b/lib/std/buffer.zig @@ -150,7 +150,7 @@ pub const Buffer = struct { }; test "simple Buffer" { - var buf = try Buffer.init(testing.leak_count_allocator, ""); + var buf = try Buffer.init(testing.allocator, ""); defer buf.deinit(); testing.expect(buf.len() == 0); @@ -172,7 +172,7 @@ test "simple Buffer" { } test "Buffer.initSize" { - var buf = try Buffer.initSize(testing.leak_count_allocator, 3); + var buf = try Buffer.initSize(testing.allocator, 3); defer buf.deinit(); testing.expect(buf.len() == 3); try buf.append("hello"); @@ -180,7 +180,7 @@ test "Buffer.initSize" { } test "Buffer.initCapacity" { - var buf = try Buffer.initCapacity(testing.leak_count_allocator, 10); + var buf = try Buffer.initCapacity(testing.allocator, 10); defer buf.deinit(); testing.expect(buf.len() == 0); testing.expect(buf.capacity() >= 10); diff --git a/lib/std/debug.zig b/lib/std/debug.zig index 32aba0d9b4..8468c4eaaf 100644 --- a/lib/std/debug.zig +++ b/lib/std/debug.zig @@ -19,7 +19,7 @@ const windows = std.os.windows; pub const leb = @import("debug/leb128.zig"); -pub const global_allocator = @compileError("Please switch to std.testing.leak_count_allocator."); +pub const global_allocator = @compileError("Please switch to std.testing.allocator."); pub const failing_allocator = @compileError("Please switch to std.testing.failing_allocator."); pub const runtime_safety = switch (builtin.mode) { diff --git a/lib/std/fifo.zig b/lib/std/fifo.zig index dd429289d1..ac8589f2ce 100644 --- a/lib/std/fifo.zig +++ b/lib/std/fifo.zig @@ -347,7 +347,7 @@ pub fn LinearFifo( } test "LinearFifo(u8, .Dynamic)" { - var fifo = LinearFifo(u8, .Dynamic).init(testing.leak_count_allocator); + var fifo = LinearFifo(u8, .Dynamic).init(testing.allocator); defer fifo.deinit(); try fifo.write("HELLO"); @@ -422,7 +422,7 @@ test "LinearFifo" { var fifo = switch (bt) { .Static => FifoType.init(), .Slice => FifoType.init(buf[0..]), - .Dynamic => FifoType.init(testing.leak_count_allocator), + .Dynamic => FifoType.init(testing.allocator), }; defer fifo.deinit(); diff --git a/lib/std/fmt.zig b/lib/std/fmt.zig index 529131065c..627d8bc7ab 100644 --- a/lib/std/fmt.zig +++ b/lib/std/fmt.zig @@ -1598,7 +1598,7 @@ test "hexToBytes" { test "formatIntValue with comptime_int" { const value: comptime_int = 123456789123456789; - var buf = try std.Buffer.init(std.testing.leak_count_allocator, ""); + var buf = try std.Buffer.init(std.testing.allocator, ""); defer buf.deinit(); try formatIntValue(value, "", FormatOptions{}, &buf, @TypeOf(std.Buffer.append).ReturnType.ErrorSet, std.Buffer.append); std.testing.expect(mem.eql(u8, buf.toSlice(), "123456789123456789")); @@ -1653,22 +1653,22 @@ test "formatType max_depth" { inst.a = &inst; inst.tu.ptr = &inst.tu; - var buf0 = try std.Buffer.init(std.testing.leak_count_allocator, ""); + var buf0 = try std.Buffer.init(std.testing.allocator, ""); defer buf0.deinit(); try formatType(inst, "", FormatOptions{}, &buf0, @TypeOf(std.Buffer.append).ReturnType.ErrorSet, std.Buffer.append, 0); std.testing.expect(mem.eql(u8, buf0.toSlice(), "S{ ... }")); - var buf1 = try std.Buffer.init(std.testing.leak_count_allocator, ""); + var buf1 = try std.Buffer.init(std.testing.allocator, ""); defer buf1.deinit(); try formatType(inst, "", FormatOptions{}, &buf1, @TypeOf(std.Buffer.append).ReturnType.ErrorSet, std.Buffer.append, 1); std.testing.expect(mem.eql(u8, buf1.toSlice(), "S{ .a = S{ ... }, .tu = TU{ ... }, .e = E.Two, .vec = (10.200,2.220) }")); - var buf2 = try std.Buffer.init(std.testing.leak_count_allocator, ""); + var buf2 = try std.Buffer.init(std.testing.allocator, ""); defer buf2.deinit(); try formatType(inst, "", FormatOptions{}, &buf2, @TypeOf(std.Buffer.append).ReturnType.ErrorSet, std.Buffer.append, 2); std.testing.expect(mem.eql(u8, buf2.toSlice(), "S{ .a = S{ .a = S{ ... }, .tu = TU{ ... }, .e = E.Two, .vec = (10.200,2.220) }, .tu = TU{ .ptr = TU{ ... } }, .e = E.Two, .vec = (10.200,2.220) }")); - var buf3 = try std.Buffer.init(std.testing.leak_count_allocator, ""); + var buf3 = try std.Buffer.init(std.testing.allocator, ""); defer buf3.deinit(); try formatType(inst, "", FormatOptions{}, &buf3, @TypeOf(std.Buffer.append).ReturnType.ErrorSet, std.Buffer.append, 3); std.testing.expect(mem.eql(u8, buf3.toSlice(), "S{ .a = S{ .a = S{ .a = S{ ... }, .tu = TU{ ... }, .e = E.Two, .vec = (10.200,2.220) }, .tu = TU{ .ptr = TU{ ... } }, .e = E.Two, .vec = (10.200,2.220) }, .tu = TU{ .ptr = TU{ .ptr = TU{ ... } } }, .e = E.Two, .vec = (10.200,2.220) }")); diff --git a/lib/std/fs/path.zig b/lib/std/fs/path.zig index 424e9f5759..66e24a4805 100644 --- a/lib/std/fs/path.zig +++ b/lib/std/fs/path.zig @@ -665,8 +665,8 @@ pub fn resolvePosix(allocator: *Allocator, paths: []const []const u8) ![]u8 { } test "resolve" { - const cwd = try process.getCwdAlloc(testing.leak_count_allocator); - defer testing.leak_count_allocator.free(cwd); + const cwd = try process.getCwdAlloc(testing.allocator); + defer testing.allocator.free(cwd); if (builtin.os == .windows) { if (windowsParsePath(cwd).kind == WindowsPath.Kind.Drive) { cwd[0] = asciiUpper(cwd[0]); @@ -684,26 +684,26 @@ test "resolveWindows" { return error.SkipZigTest; } if (builtin.os == .windows) { - const cwd = try process.getCwdAlloc(testing.leak_count_allocator); - defer testing.leak_count_allocator.free(cwd); + const cwd = try process.getCwdAlloc(testing.allocator); + defer testing.allocator.free(cwd); const parsed_cwd = windowsParsePath(cwd); { - const expected = try join(testing.leak_count_allocator, &[_][]const u8{ + const expected = try join(testing.allocator, &[_][]const u8{ parsed_cwd.disk_designator, "usr\\local\\lib\\zig\\std\\array_list.zig", }); - defer testing.leak_count_allocator.free(expected); + defer testing.allocator.free(expected); if (parsed_cwd.kind == WindowsPath.Kind.Drive) { expected[0] = asciiUpper(parsed_cwd.disk_designator[0]); } try testResolveWindows(&[_][]const u8{ "/usr/local", "lib\\zig\\std\\array_list.zig" }, expected); } { - const expected = try join(testing.leak_count_allocator, &[_][]const u8{ + const expected = try join(testing.allocator, &[_][]const u8{ cwd, "usr\\local\\lib\\zig", }); - defer testing.leak_count_allocator.free(expected); + defer testing.allocator.free(expected); if (parsed_cwd.kind == WindowsPath.Kind.Drive) { expected[0] = asciiUpper(parsed_cwd.disk_designator[0]); } @@ -740,14 +740,14 @@ test "resolvePosix" { } fn testResolveWindows(paths: []const []const u8, expected: []const u8) !void { - const actual = try resolveWindows(testing.leak_count_allocator, paths); - defer testing.leak_count_allocator.free(actual); + const actual = try resolveWindows(testing.allocator, paths); + defer testing.allocator.free(actual); return testing.expect(mem.eql(u8, actual, expected)); } fn testResolvePosix(paths: []const []const u8, expected: []const u8) !void { - const actual = try resolvePosix(testing.leak_count_allocator, paths); - defer testing.leak_count_allocator.free(actual); + const actual = try resolvePosix(testing.allocator, paths); + defer testing.allocator.free(actual); return testing.expect(mem.eql(u8, actual, expected)); } @@ -1172,13 +1172,13 @@ test "relative" { } fn testRelativePosix(from: []const u8, to: []const u8, expected_output: []const u8) !void { - const result = try relativePosix(testing.leak_count_allocator, from, to); - defer testing.leak_count_allocator.free(result); + const result = try relativePosix(testing.allocator, from, to); + defer testing.allocator.free(result); testing.expectEqualSlices(u8, expected_output, result); } fn testRelativeWindows(from: []const u8, to: []const u8, expected_output: []const u8) !void { - const result = try relativeWindows(testing.leak_count_allocator, from, to); - defer testing.leak_count_allocator.free(result); + const result = try relativeWindows(testing.allocator, from, to); + defer testing.allocator.free(result); testing.expectEqualSlices(u8, expected_output, result); } diff --git a/lib/std/linked_list.zig b/lib/std/linked_list.zig index d1652a8047..a21c9a83eb 100644 --- a/lib/std/linked_list.zig +++ b/lib/std/linked_list.zig @@ -143,7 +143,7 @@ pub fn SinglyLinkedList(comptime T: type) type { } test "basic SinglyLinkedList test" { - const allocator = testing.leak_count_allocator; + const allocator = testing.allocator; var list = SinglyLinkedList(u32).init(); var one = try list.createNode(1, allocator); @@ -404,7 +404,7 @@ pub fn TailQueue(comptime T: type) type { } test "basic TailQueue test" { - const allocator = testing.leak_count_allocator; + const allocator = testing.allocator; var list = TailQueue(u32).init(); var one = try list.createNode(1, allocator); @@ -456,7 +456,7 @@ test "basic TailQueue test" { } test "TailQueue concatenation" { - const allocator = testing.leak_count_allocator; + const allocator = testing.allocator; var list1 = TailQueue(u32).init(); var list2 = TailQueue(u32).init(); diff --git a/lib/std/os/test.zig b/lib/std/os/test.zig index 2e60fe500e..0d3be9e7e4 100644 --- a/lib/std/os/test.zig +++ b/lib/std/os/test.zig @@ -9,7 +9,7 @@ const elf = std.elf; const File = std.fs.File; const Thread = std.Thread; -const a = std.testing.leak_count_allocator; +const a = std.testing.allocator; const builtin = @import("builtin"); const AtomicRmwOp = builtin.AtomicRmwOp; diff --git a/lib/std/priority_queue.zig b/lib/std/priority_queue.zig index 9c07d20798..e726a07a88 100644 --- a/lib/std/priority_queue.zig +++ b/lib/std/priority_queue.zig @@ -239,7 +239,7 @@ fn greaterThan(a: u32, b: u32) bool { const PQ = PriorityQueue(u32); test "std.PriorityQueue: add and remove min heap" { - var queue = PQ.init(testing.leak_count_allocator, lessThan); + var queue = PQ.init(testing.allocator, lessThan); defer queue.deinit(); try queue.add(54); @@ -257,7 +257,7 @@ test "std.PriorityQueue: add and remove min heap" { } test "std.PriorityQueue: add and remove same min heap" { - var queue = PQ.init(testing.leak_count_allocator, lessThan); + var queue = PQ.init(testing.allocator, lessThan); defer queue.deinit(); try queue.add(1); @@ -275,14 +275,14 @@ test "std.PriorityQueue: add and remove same min heap" { } test "std.PriorityQueue: removeOrNull on empty" { - var queue = PQ.init(testing.leak_count_allocator, lessThan); + var queue = PQ.init(testing.allocator, lessThan); defer queue.deinit(); expect(queue.removeOrNull() == null); } test "std.PriorityQueue: edge case 3 elements" { - var queue = PQ.init(testing.leak_count_allocator, lessThan); + var queue = PQ.init(testing.allocator, lessThan); defer queue.deinit(); try queue.add(9); @@ -294,7 +294,7 @@ test "std.PriorityQueue: edge case 3 elements" { } test "std.PriorityQueue: peek" { - var queue = PQ.init(testing.leak_count_allocator, lessThan); + var queue = PQ.init(testing.allocator, lessThan); defer queue.deinit(); expect(queue.peek() == null); @@ -306,7 +306,7 @@ test "std.PriorityQueue: peek" { } test "std.PriorityQueue: sift up with odd indices" { - var queue = PQ.init(testing.leak_count_allocator, lessThan); + var queue = PQ.init(testing.allocator, lessThan); defer queue.deinit(); const items = [_]u32{ 15, 7, 21, 14, 13, 22, 12, 6, 7, 25, 5, 24, 11, 16, 15, 24, 2, 1 }; for (items) |e| { @@ -320,7 +320,7 @@ test "std.PriorityQueue: sift up with odd indices" { } test "std.PriorityQueue: addSlice" { - var queue = PQ.init(testing.leak_count_allocator, lessThan); + var queue = PQ.init(testing.allocator, lessThan); defer queue.deinit(); const items = [_]u32{ 15, 7, 21, 14, 13, 22, 12, 6, 7, 25, 5, 24, 11, 16, 15, 24, 2, 1 }; try queue.addSlice(items[0..]); @@ -333,8 +333,8 @@ test "std.PriorityQueue: addSlice" { test "std.PriorityQueue: fromOwnedSlice" { const items = [_]u32{ 15, 7, 21, 14, 13, 22, 12, 6, 7, 25, 5, 24, 11, 16, 15, 24, 2, 1 }; - const heap_items = try std.mem.dupe(testing.leak_count_allocator, u32, items[0..]); - var queue = PQ.fromOwnedSlice(testing.leak_count_allocator, lessThan, heap_items[0..]); + const heap_items = try std.mem.dupe(testing.allocator, u32, items[0..]); + var queue = PQ.fromOwnedSlice(testing.allocator, lessThan, heap_items[0..]); defer queue.deinit(); const sorted_items = [_]u32{ 1, 2, 5, 6, 7, 7, 11, 12, 13, 14, 15, 15, 16, 21, 22, 24, 24, 25 }; @@ -344,7 +344,7 @@ test "std.PriorityQueue: fromOwnedSlice" { } test "std.PriorityQueue: add and remove max heap" { - var queue = PQ.init(testing.leak_count_allocator, greaterThan); + var queue = PQ.init(testing.allocator, greaterThan); defer queue.deinit(); try queue.add(54); @@ -362,7 +362,7 @@ test "std.PriorityQueue: add and remove max heap" { } test "std.PriorityQueue: add and remove same max heap" { - var queue = PQ.init(testing.leak_count_allocator, greaterThan); + var queue = PQ.init(testing.allocator, greaterThan); defer queue.deinit(); try queue.add(1); @@ -380,8 +380,8 @@ test "std.PriorityQueue: add and remove same max heap" { } test "std.PriorityQueue: iterator" { - var queue = PQ.init(testing.leak_count_allocator, lessThan); - var map = std.AutoHashMap(u32, void).init(testing.leak_count_allocator); + var queue = PQ.init(testing.allocator, lessThan); + var map = std.AutoHashMap(u32, void).init(testing.allocator); defer { queue.deinit(); map.deinit(); @@ -402,7 +402,7 @@ test "std.PriorityQueue: iterator" { } test "std.PriorityQueue: remove at index" { - var queue = PQ.init(testing.leak_count_allocator, lessThan); + var queue = PQ.init(testing.allocator, lessThan); defer queue.deinit(); try queue.add(3); diff --git a/lib/std/process.zig b/lib/std/process.zig index 19f0eac235..dd5e124654 100644 --- a/lib/std/process.zig +++ b/lib/std/process.zig @@ -114,7 +114,7 @@ pub fn getEnvMap(allocator: *Allocator) !BufMap { } test "os.getEnvMap" { - var env = try getEnvMap(std.testing.leak_count_allocator); + var env = try getEnvMap(std.testing.allocator); defer env.deinit(); } @@ -165,7 +165,7 @@ pub fn getEnvVarOwned(allocator: *mem.Allocator, key: []const u8) GetEnvVarOwned } test "os.getEnvVarOwned" { - var ga = std.testing.leak_count_allocator; + var ga = std.testing.allocator; testing.expectError(error.EnvironmentVariableNotFound, getEnvVarOwned(ga, "BADENV")); } @@ -492,11 +492,11 @@ test "windows arg parsing" { fn testWindowsCmdLine(input_cmd_line: [*]const u8, expected_args: []const []const u8) void { var it = ArgIteratorWindows.initWithCmdLine(input_cmd_line); for (expected_args) |expected_arg| { - const arg = it.next(std.testing.leak_count_allocator).? catch unreachable; - defer std.testing.leak_count_allocator.free(arg); + const arg = it.next(std.testing.allocator).? catch unreachable; + defer std.testing.allocator.free(arg); testing.expectEqualSlices(u8, expected_arg, arg); } - testing.expect(it.next(std.testing.leak_count_allocator) == null); + testing.expect(it.next(std.testing.allocator) == null); } pub const UserInfo = struct { diff --git a/lib/std/special/test_runner.zig b/lib/std/special/test_runner.zig index a5bbfff6fb..9a2d68a73d 100644 --- a/lib/std/special/test_runner.zig +++ b/lib/std/special/test_runner.zig @@ -13,10 +13,11 @@ pub fn main() anyerror!void { }; for (test_fn_list) |test_fn, i| { - std.testing.allocator_instance.reset(); + std.testing.base_allocator_instance.reset(); defer { - std.testing.leak_count_allocator_instance.validate() catch |err| { - @panic(@errorName(err)); + std.testing.allocator_instance.validate() catch |err| switch (err) { + error.Leak => std.debug.panic("", .{}), + else => std.debug.panic("error.{}", .{@errorName(err)}), }; } diff --git a/lib/std/testing.zig b/lib/std/testing.zig index 07479a3852..4850f2e9b9 100644 --- a/lib/std/testing.zig +++ b/lib/std/testing.zig @@ -2,17 +2,17 @@ const builtin = @import("builtin"); const TypeId = builtin.TypeId; const std = @import("std.zig"); +pub const LeakCountAllocator = @import("testing/leak_count_allocator.zig").LeakCountAllocator; +pub const FailingAllocator = @import("testing/failing_allocator.zig").FailingAllocator; + /// This should only be used in temporary test programs. pub const allocator = &allocator_instance.allocator; -pub var allocator_instance = std.heap.ThreadSafeFixedBufferAllocator.init(allocator_mem[0..]); -var allocator_mem: [100 * 1024]u8 = undefined; +pub var allocator_instance = LeakCountAllocator.init(&base_allocator_instance.allocator); -pub const FailingAllocator = @import("testing/failing_allocator.zig").FailingAllocator; -pub const failing_allocator = &FailingAllocator.init(allocator, 0).allocator; +pub const failing_allocator = &FailingAllocator.init(&base_allocator_instance.allocator, 0).allocator; -pub const LeakCountAllocator = @import("testing/leak_count_allocator.zig").LeakCountAllocator; -pub var leak_count_allocator_instance = LeakCountAllocator.init(allocator); -pub const leak_count_allocator = &leak_count_allocator_instance.allocator; +pub var base_allocator_instance = std.heap.ThreadSafeFixedBufferAllocator.init(allocator_mem[0..]); +var allocator_mem: [100 * 1024]u8 = undefined; /// This function is intended to be used only in tests. It prints diagnostics to stderr /// and then aborts when actual_error_union is not expected_error. diff --git a/lib/std/testing/leak_count_allocator.zig b/lib/std/testing/leak_count_allocator.zig index 84c3248178..6cdcfa2678 100644 --- a/lib/std/testing/leak_count_allocator.zig +++ b/lib/std/testing/leak_count_allocator.zig @@ -39,7 +39,7 @@ pub const LeakCountAllocator = struct { pub fn validate(self: LeakCountAllocator) !void { if (self.count > 0) { - std.debug.warn("Detected leaked allocations without matching free: {}\n", .{self.count}); + std.debug.warn("error - detected leaked allocations without matching free: {}\n", .{self.count}); return error.Leak; } } diff --git a/lib/std/unicode.zig b/lib/std/unicode.zig index 1884796835..77783c3edd 100644 --- a/lib/std/unicode.zig +++ b/lib/std/unicode.zig @@ -501,16 +501,16 @@ test "utf16leToUtf8" { { mem.writeIntSliceLittle(u16, utf16le_as_bytes[0..], 'A'); mem.writeIntSliceLittle(u16, utf16le_as_bytes[2..], 'a'); - const utf8 = try utf16leToUtf8Alloc(std.testing.leak_count_allocator, &utf16le); - defer std.testing.leak_count_allocator.free(utf8); + const utf8 = try utf16leToUtf8Alloc(std.testing.allocator, &utf16le); + defer std.testing.allocator.free(utf8); testing.expect(mem.eql(u8, utf8, "Aa")); } { mem.writeIntSliceLittle(u16, utf16le_as_bytes[0..], 0x80); mem.writeIntSliceLittle(u16, utf16le_as_bytes[2..], 0xffff); - const utf8 = try utf16leToUtf8Alloc(std.testing.leak_count_allocator, &utf16le); - defer std.testing.leak_count_allocator.free(utf8); + const utf8 = try utf16leToUtf8Alloc(std.testing.allocator, &utf16le); + defer std.testing.allocator.free(utf8); testing.expect(mem.eql(u8, utf8, "\xc2\x80" ++ "\xef\xbf\xbf")); } @@ -518,8 +518,8 @@ test "utf16leToUtf8" { // the values just outside the surrogate half range mem.writeIntSliceLittle(u16, utf16le_as_bytes[0..], 0xd7ff); mem.writeIntSliceLittle(u16, utf16le_as_bytes[2..], 0xe000); - const utf8 = try utf16leToUtf8Alloc(std.testing.leak_count_allocator, &utf16le); - defer std.testing.leak_count_allocator.free(utf8); + const utf8 = try utf16leToUtf8Alloc(std.testing.allocator, &utf16le); + defer std.testing.allocator.free(utf8); testing.expect(mem.eql(u8, utf8, "\xed\x9f\xbf" ++ "\xee\x80\x80")); } @@ -527,8 +527,8 @@ test "utf16leToUtf8" { // smallest surrogate pair mem.writeIntSliceLittle(u16, utf16le_as_bytes[0..], 0xd800); mem.writeIntSliceLittle(u16, utf16le_as_bytes[2..], 0xdc00); - const utf8 = try utf16leToUtf8Alloc(std.testing.leak_count_allocator, &utf16le); - defer std.testing.leak_count_allocator.free(utf8); + const utf8 = try utf16leToUtf8Alloc(std.testing.allocator, &utf16le); + defer std.testing.allocator.free(utf8); testing.expect(mem.eql(u8, utf8, "\xf0\x90\x80\x80")); } @@ -536,16 +536,16 @@ test "utf16leToUtf8" { // largest surrogate pair mem.writeIntSliceLittle(u16, utf16le_as_bytes[0..], 0xdbff); mem.writeIntSliceLittle(u16, utf16le_as_bytes[2..], 0xdfff); - const utf8 = try utf16leToUtf8Alloc(std.testing.leak_count_allocator, &utf16le); - defer std.testing.leak_count_allocator.free(utf8); + const utf8 = try utf16leToUtf8Alloc(std.testing.allocator, &utf16le); + defer std.testing.allocator.free(utf8); testing.expect(mem.eql(u8, utf8, "\xf4\x8f\xbf\xbf")); } { mem.writeIntSliceLittle(u16, utf16le_as_bytes[0..], 0xdbff); mem.writeIntSliceLittle(u16, utf16le_as_bytes[2..], 0xdc00); - const utf8 = try utf16leToUtf8Alloc(std.testing.leak_count_allocator, &utf16le); - defer std.testing.leak_count_allocator.free(utf8); + const utf8 = try utf16leToUtf8Alloc(std.testing.allocator, &utf16le); + defer std.testing.allocator.free(utf8); testing.expect(mem.eql(u8, utf8, "\xf4\x8f\xb0\x80")); } } diff --git a/lib/std/zig/ast.zig b/lib/std/zig/ast.zig index c967c78789..e339343823 100644 --- a/lib/std/zig/ast.zig +++ b/lib/std/zig/ast.zig @@ -2287,7 +2287,7 @@ pub const Node = struct { test "iterate" { var root = Node.Root{ .base = Node{ .id = Node.Id.Root }, - .decls = Node.Root.DeclList.init(std.testing.leak_count_allocator), + .decls = Node.Root.DeclList.init(std.testing.allocator), .eof_token = 0, }; var base = &root.base; diff --git a/test/compare_output.zig b/test/compare_output.zig index d743e0784a..7a41d46f54 100644 --- a/test/compare_output.zig +++ b/test/compare_output.zig @@ -445,7 +445,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void { \\const std = @import("std"); \\const io = std.io; \\const os = std.os; - \\const allocator = std.testing.leak_count_allocator; + \\const allocator = std.testing.allocator; \\ \\pub fn main() !void { \\ var args_it = std.process.args(); @@ -486,7 +486,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void { \\const std = @import("std"); \\const io = std.io; \\const os = std.os; - \\const allocator = std.testing.leak_count_allocator; + \\const allocator = std.testing.allocator; \\ \\pub fn main() !void { \\ var args_it = std.process.args(); diff --git a/test/compile_errors.zig b/test/compile_errors.zig index 2f3f0a9f1f..341062e161 100644 --- a/test/compile_errors.zig +++ b/test/compile_errors.zig @@ -5765,7 +5765,7 @@ pub fn addCases(cases: *tests.CompileErrorContext) void { \\ \\export fn entry() void { \\ const a = MdNode.Header { - \\ .text = MdText.init(&std.testing.leak_count_allocator), + \\ .text = MdText.init(&std.testing.allocator), \\ .weight = HeaderWeight.H1, \\ }; \\} diff --git a/test/stage1/behavior/const_slice_child.zig b/test/stage1/behavior/const_slice_child.zig index 7d969ae468..92e5121026 100644 --- a/test/stage1/behavior/const_slice_child.zig +++ b/test/stage1/behavior/const_slice_child.zig @@ -23,8 +23,8 @@ fn foo(args: [][]const u8) void { } fn bar(argc: usize) void { - const args = testing.leak_count_allocator.alloc([]const u8, argc) catch unreachable; - defer testing.leak_count_allocator.free(args); + const args = testing.allocator.alloc([]const u8, argc) catch unreachable; + defer testing.allocator.free(args); for (args) |_, i| { const ptr = argv[i]; args[i] = ptr[0..strlen(ptr)]; diff --git a/test/standalone/brace_expansion/main.zig b/test/standalone/brace_expansion/main.zig index 33fe826d18..c6bfd02e79 100644 --- a/test/standalone/brace_expansion/main.zig +++ b/test/standalone/brace_expansion/main.zig @@ -201,7 +201,7 @@ pub fn main() !void { } test "invalid inputs" { - global_allocator = std.testing.leak_count_allocator; + global_allocator = std.testing.allocator; expectError("}ABC", error.InvalidInput); expectError("{ABC", error.InvalidInput); @@ -222,7 +222,7 @@ fn expectError(test_input: []const u8, expected_err: anyerror) void { } test "valid inputs" { - global_allocator = std.testing.leak_count_allocator; + global_allocator = std.testing.allocator; expectExpansion("{x,y,z}", "x y z"); expectExpansion("{A,B}{x,y}", "Ax Ay Bx By"); diff --git a/test/standalone/cat/main.zig b/test/standalone/cat/main.zig index 10ec00d6e8..34439f9c24 100644 --- a/test/standalone/cat/main.zig +++ b/test/standalone/cat/main.zig @@ -4,7 +4,7 @@ const process = std.process; const fs = std.fs; const mem = std.mem; const warn = std.debug.warn; -const allocator = std.testing.leak_count_allocator; +const allocator = std.testing.allocator; pub fn main() !void { var args_it = process.args(); diff --git a/test/standalone/empty_env/main.zig b/test/standalone/empty_env/main.zig index dc2ac73738..f4ebf56136 100644 --- a/test/standalone/empty_env/main.zig +++ b/test/standalone/empty_env/main.zig @@ -1,6 +1,6 @@ const std = @import("std"); pub fn main() void { - const env_map = std.process.getEnvMap(std.testing.leak_count_allocator) catch @panic("unable to get env map"); + const env_map = std.process.getEnvMap(std.testing.allocator) catch @panic("unable to get env map"); std.testing.expect(env_map.count() == 0); } diff --git a/test/standalone/load_dynamic_library/main.zig b/test/standalone/load_dynamic_library/main.zig index 5a2e55e937..70fc4986ac 100644 --- a/test/standalone/load_dynamic_library/main.zig +++ b/test/standalone/load_dynamic_library/main.zig @@ -1,8 +1,8 @@ const std = @import("std"); pub fn main() !void { - const args = try std.process.argsAlloc(std.testing.leak_count_allocator); - defer std.process.argsFree(std.testing.leak_count_allocator, args); + const args = try std.process.argsAlloc(std.testing.allocator); + defer std.process.argsFree(std.testing.allocator, args); const dynlib_name = args[1]; -- cgit v1.2.3