authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-11-10 15:01:09-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-11-10 15:01:09-05:00
log6bf1547148caf0c63605a42c8cdea608cf3d4eca
tree518cb47a9dab91cfb7e7d9491cfe97ed59895d87
parent336d81894da2c34a77cffd1bf903ad9e4dcaa7aa
parent029d37d6a7dc96f71dded5d5a9c8e7477aaa4146

Merge branch 'darwin-stat'

closes #606

15 files changed, 122 insertions(+), 51 deletions(-)

src/codegen.cpp+1
......@@ -408,6 +408,7 @@ static LLVMValueRef fn_llvm_value(CodeGen *g, FnTableEntry *fn_table_entry) {
408408 LLVMValueRef existing_llvm_fn = LLVMGetNamedFunction(g->module, buf_ptr(symbol_name));
409409 if (existing_llvm_fn) {
410410 fn_table_entry->llvm_value = LLVMConstBitCast(existing_llvm_fn, LLVMPointerType(fn_llvm_type, 0));
411 return fn_table_entry->llvm_value;
411412 } else {
412413 fn_table_entry->llvm_value = LLVMAddFunction(g->module, buf_ptr(symbol_name), fn_llvm_type);
413414 }
std/array_list.zig+1-1
......@@ -101,7 +101,7 @@ pub fn ArrayList(comptime T: type) -> type{
101101}
102102
103103test "basic ArrayList test" {
104 var list = ArrayList(i32).init(&debug.global_allocator);
104 var list = ArrayList(i32).init(debug.global_allocator);
105105 defer list.deinit();
106106
107107 {var i: usize = 0; while (i < 10) : (i += 1) {
std/buffer.zig+1-1
......@@ -135,7 +135,7 @@ pub const Buffer = struct {
135135test "simple Buffer" {
136136 const cstr = @import("cstr.zig");
137137
138 var buf = %%Buffer.init(&debug.global_allocator, "");
138 var buf = %%Buffer.init(debug.global_allocator, "");
139139 assert(buf.len() == 0);
140140 %%buf.append("hello");
141141 %%buf.appendByte(' ');
std/c/darwin.zig+14-12
......@@ -6,26 +6,28 @@ pub const _errno = __error;
66
77/// Renamed to Stat to not conflict with the stat function.
88pub const Stat = extern struct {
9 dev: u32,
9 dev: i32,
1010 mode: u16,
1111 nlink: u16,
1212 ino: u64,
1313 uid: u32,
1414 gid: u32,
15 rdev: u64,
16
17 atim: timespec,
18 mtim: timespec,
19 ctim: timespec,
20
21 size: u64,
22 blocks: u64,
23 blksize: u32,
15 rdev: i32,
16 atime: usize,
17 atimensec: usize,
18 mtime: usize,
19 mtimensec: usize,
20 ctime: usize,
21 ctimensec: usize,
22 birthtime: usize,
23 birthtimensec: usize,
24 size: i64,
25 blocks: i64,
26 blksize: i32,
2427 flags: u32,
2528 gen: u32,
2629 lspare: i32,
27 qspare: [2]u64,
28
30 qspare: [2]i64,
2931};
3032
3133pub const timespec = extern struct {
std/c/index.zig+1
......@@ -14,6 +14,7 @@ pub extern "c" fn exit(code: c_int) -> noreturn;
1414pub extern "c" fn isatty(fd: c_int) -> c_int;
1515pub extern "c" fn close(fd: c_int) -> c_int;
1616pub extern "c" fn fstat(fd: c_int, buf: &Stat) -> c_int;
17pub extern "c" fn @"fstat$INODE64"(fd: c_int, buf: &Stat) -> c_int;
1718pub extern "c" fn lseek(fd: c_int, offset: isize, whence: c_int) -> isize;
1819pub extern "c" fn open(path: &const u8, oflag: c_int, ...) -> c_int;
1920pub extern "c" fn raise(sig: c_int) -> c_int;
std/debug.zig+4-3
......@@ -38,7 +38,7 @@ fn getStderrStream() -> %&io.OutStream {
3838/// Tries to print a stack trace to stderr, unbuffered, and ignores any error returned.
3939pub fn dumpStackTrace() {
4040 const stderr = getStderrStream() %% return;
41 writeStackTrace(stderr, &global_allocator, stderr_file.isTty(), 1) %% return;
41 writeStackTrace(stderr, global_allocator, stderr_file.isTty(), 1) %% return;
4242}
4343
4444/// This function invokes undefined behavior when `ok` is `false`.
......@@ -86,7 +86,7 @@ pub fn panic(comptime format: []const u8, args: ...) -> noreturn {
8686
8787 const stderr = getStderrStream() %% os.abort();
8888 stderr.print(format ++ "\n", args) %% os.abort();
89 writeStackTrace(stderr, &global_allocator, stderr_file.isTty(), 1) %% os.abort();
89 writeStackTrace(stderr, global_allocator, stderr_file.isTty(), 1) %% os.abort();
9090
9191 os.abort();
9292}
......@@ -967,7 +967,8 @@ fn readILeb128(in_stream: &io.InStream) -> %i64 {
967967 }
968968}
969969
970pub var global_allocator = mem.Allocator {
970pub const global_allocator = &global_allocator_state;
971var global_allocator_state = mem.Allocator {
971972 .allocFn = globalAlloc,
972973 .reallocFn = globalRealloc,
973974 .freeFn = globalFree,
std/hash_map.zig+1-1
......@@ -232,7 +232,7 @@ pub fn HashMap(comptime K: type, comptime V: type,
232232}
233233
234234test "basicHashMapTest" {
235 var map = HashMap(i32, i32, hash_i32, eql_i32).init(&debug.global_allocator);
235 var map = HashMap(i32, i32, hash_i32, eql_i32).init(debug.global_allocator);
236236 defer map.deinit();
237237
238238 assert(%%map.put(1, 11) == null);
std/io.zig+28-9
......@@ -20,6 +20,12 @@ const fmt = std.fmt;
2020const is_posix = builtin.os != builtin.Os.windows;
2121const is_windows = builtin.os == builtin.Os.windows;
2222
23test "import io tests" {
24 comptime {
25 _ = @import("io_test.zig");
26 }
27}
28
2329/// The function received invalid input at runtime. An Invalid error means a
2430/// bug in the program that called the function.
2531error Invalid;
......@@ -247,17 +253,30 @@ pub const File = struct {
247253 }
248254
249255 pub fn getEndPos(self: &File) -> %usize {
250 var stat: system.Stat = undefined;
251 const err = system.getErrno(system.fstat(self.handle, &stat));
252 if (err > 0) {
253 return switch (err) {
254 system.EBADF => error.BadFd,
255 system.ENOMEM => error.OutOfMemory,
256 else => os.unexpectedErrorPosix(err),
256 if (is_posix) {
257 var stat: system.Stat = undefined;
258 const err = system.getErrno(system.fstat(self.handle, &stat));
259 if (err > 0) {
260 return switch (err) {
261 system.EBADF => error.BadFd,
262 system.ENOMEM => error.OutOfMemory,
263 else => os.unexpectedErrorPosix(err),
264 }
257265 }
258 }
259266
260 return usize(stat.size);
267 return usize(stat.size);
268 } else if (is_windows) {
269 var file_size: system.LARGE_INTEGER = undefined;
270 if (system.GetFileSizeEx(self.handle, &file_size) == 0) {
271 const err = system.GetLastError();
272 return switch (err) {
273 else => os.unexpectedErrorWindows(err),
274 };
275 }
276 return @bitCast(usize, file_size);
277 } else {
278 unreachable;
279 }
261280 }
262281
263282 pub fn read(self: &File, buffer: []u8) -> %usize {
std/io_test.zig created+45
......@@ -0,0 +1,45 @@
1const std = @import("index.zig");
2const io = std.io;
3const allocator = std.debug.global_allocator;
4const Rand = std.rand.Rand;
5const assert = std.debug.assert;
6const mem = std.mem;
7const os = std.os;
8
9test "write a file, read it, then delete it" {
10 var data: [1024]u8 = undefined;
11 var rng = Rand.init(1234);
12 rng.fillBytes(data[0..]);
13 const tmp_file_name = "temp_test_file.txt";
14 {
15 var file = %%io.File.openWrite(tmp_file_name, allocator);
16 defer file.close();
17
18 var file_out_stream = io.FileOutStream.init(&file);
19 var buf_stream = io.BufferedOutStream.init(&file_out_stream.stream);
20 const st = &buf_stream.stream;
21 %%st.print("begin");
22 %%st.write(data[0..]);
23 %%st.print("end");
24 %%buf_stream.flush();
25 }
26 {
27 var file = %%io.File.openRead(tmp_file_name, allocator);
28 defer file.close();
29
30 const file_size = %%file.getEndPos();
31 const expected_file_size = "begin".len + data.len + "end".len;
32 assert(file_size == expected_file_size);
33
34 var file_in_stream = io.FileInStream.init(&file);
35 var buf_stream = io.BufferedInStream.init(&file_in_stream.stream);
36 const st = &buf_stream.stream;
37 const contents = %%st.readAllAlloc(allocator, 2 * 1024);
38 defer allocator.free(contents);
39
40 assert(mem.eql(u8, contents[0.."begin".len], "begin"));
41 assert(mem.eql(u8, contents["begin".len..contents.len - "end".len], data));
42 assert(mem.eql(u8, contents[contents.len - "end".len ..], "end"));
43 }
44 %%os.deleteFile(allocator, tmp_file_name);
45}
std/linked_list.zig+1-1
......@@ -195,7 +195,7 @@ pub fn LinkedList(comptime T: type) -> type {
195195}
196196
197197test "basic linked list test" {
198 const allocator = &debug.global_allocator;
198 const allocator = debug.global_allocator;
199199 var list = LinkedList(u32).init();
200200
201201 var one = %%list.createNode(1, allocator);
std/mem.zig+2-2
......@@ -331,8 +331,8 @@ pub fn join(allocator: &Allocator, sep: u8, strings: ...) -> %[]u8 {
331331}
332332
333333test "mem.join" {
334 assert(eql(u8, %%join(&debug.global_allocator, ',', "a", "b", "c"), "a,b,c"));
335 assert(eql(u8, %%join(&debug.global_allocator, ',', "a"), "a"));
334 assert(eql(u8, %%join(debug.global_allocator, ',', "a", "b", "c"), "a,b,c"));
335 assert(eql(u8, %%join(debug.global_allocator, ',', "a"), "a"));
336336}
337337
338338test "testStringEquality" {
std/os/darwin.zig+1-1
......@@ -129,7 +129,7 @@ pub fn isatty(fd: i32) -> bool {
129129}
130130
131131pub fn fstat(fd: i32, buf: &c.Stat) -> usize {
132 errnoWrap(c.fstat(fd, buf))
132 errnoWrap(c.@"fstat$INODE64"(fd, buf))
133133}
134134
135135pub fn lseek(fd: i32, offset: isize, whence: c_int) -> usize {
std/os/index.zig+3-4
......@@ -562,7 +562,7 @@ pub fn getCwd(allocator: &Allocator) -> %[]u8 {
562562
563563test "os.getCwd" {
564564 // at least call it so it gets compiled
565 _ = getCwd(&debug.global_allocator);
565 _ = getCwd(debug.global_allocator);
566566}
567567
568568pub fn symLink(allocator: &Allocator, existing_path: []const u8, new_path: []const u8) -> %void {
......@@ -1432,10 +1432,10 @@ test "windows arg parsing" {
14321432fn testWindowsCmdLine(input_cmd_line: &const u8, expected_args: []const []const u8) {
14331433 var it = ArgIteratorWindows.initWithCmdLine(input_cmd_line);
14341434 for (expected_args) |expected_arg| {
1435 const arg = %%??it.next(&debug.global_allocator);
1435 const arg = %%??it.next(debug.global_allocator);
14361436 assert(mem.eql(u8, arg, expected_arg));
14371437 }
1438 assert(it.next(&debug.global_allocator) == null);
1438 assert(it.next(debug.global_allocator) == null);
14391439}
14401440
14411441test "std.os" {
......@@ -1500,4 +1500,3 @@ pub fn isTty(handle: FileHandle) -> bool {
15001500 }
15011501 }
15021502}
1503
std/os/path.zig+16-16
......@@ -41,23 +41,23 @@ pub fn joinPosix(allocator: &Allocator, paths: ...) -> %[]u8 {
4141}
4242
4343test "os.path.join" {
44 assert(mem.eql(u8, %%joinWindows(&debug.global_allocator, "c:\\a\\b", "c"), "c:\\a\\b\\c"));
45 assert(mem.eql(u8, %%joinWindows(&debug.global_allocator, "c:\\a\\b\\", "c"), "c:\\a\\b\\c"));
44 assert(mem.eql(u8, %%joinWindows(debug.global_allocator, "c:\\a\\b", "c"), "c:\\a\\b\\c"));
45 assert(mem.eql(u8, %%joinWindows(debug.global_allocator, "c:\\a\\b\\", "c"), "c:\\a\\b\\c"));
4646
47 assert(mem.eql(u8, %%joinWindows(&debug.global_allocator, "c:\\", "a", "b\\", "c"), "c:\\a\\b\\c"));
48 assert(mem.eql(u8, %%joinWindows(&debug.global_allocator, "c:\\a\\", "b\\", "c"), "c:\\a\\b\\c"));
47 assert(mem.eql(u8, %%joinWindows(debug.global_allocator, "c:\\", "a", "b\\", "c"), "c:\\a\\b\\c"));
48 assert(mem.eql(u8, %%joinWindows(debug.global_allocator, "c:\\a\\", "b\\", "c"), "c:\\a\\b\\c"));
4949
50 assert(mem.eql(u8, %%joinWindows(&debug.global_allocator,
50 assert(mem.eql(u8, %%joinWindows(debug.global_allocator,
5151 "c:\\home\\andy\\dev\\zig\\build\\lib\\zig\\std", "io.zig"),
5252 "c:\\home\\andy\\dev\\zig\\build\\lib\\zig\\std\\io.zig"));
5353
54 assert(mem.eql(u8, %%joinPosix(&debug.global_allocator, "/a/b", "c"), "/a/b/c"));
55 assert(mem.eql(u8, %%joinPosix(&debug.global_allocator, "/a/b/", "c"), "/a/b/c"));
54 assert(mem.eql(u8, %%joinPosix(debug.global_allocator, "/a/b", "c"), "/a/b/c"));
55 assert(mem.eql(u8, %%joinPosix(debug.global_allocator, "/a/b/", "c"), "/a/b/c"));
5656
57 assert(mem.eql(u8, %%joinPosix(&debug.global_allocator, "/", "a", "b/", "c"), "/a/b/c"));
58 assert(mem.eql(u8, %%joinPosix(&debug.global_allocator, "/a/", "b/", "c"), "/a/b/c"));
57 assert(mem.eql(u8, %%joinPosix(debug.global_allocator, "/", "a", "b/", "c"), "/a/b/c"));
58 assert(mem.eql(u8, %%joinPosix(debug.global_allocator, "/a/", "b/", "c"), "/a/b/c"));
5959
60 assert(mem.eql(u8, %%joinPosix(&debug.global_allocator, "/home/andy/dev/zig/build/lib/zig/std", "io.zig"),
60 assert(mem.eql(u8, %%joinPosix(debug.global_allocator, "/home/andy/dev/zig/build/lib/zig/std", "io.zig"),
6161 "/home/andy/dev/zig/build/lib/zig/std/io.zig"));
6262}
6363
......@@ -453,7 +453,7 @@ pub fn resolvePosix(allocator: &Allocator, paths: []const []const u8) -> %[]u8 {
453453}
454454
455455test "os.path.resolve" {
456 const cwd = %%os.getCwd(&debug.global_allocator);
456 const cwd = %%os.getCwd(debug.global_allocator);
457457 if (is_windows) {
458458 assert(mem.eql(u8, testResolveWindows([][]const u8{"."}), cwd));
459459 } else {
......@@ -492,11 +492,11 @@ test "os.path.resolvePosix" {
492492}
493493
494494fn testResolveWindows(paths: []const []const u8) -> []u8 {
495 return %%resolveWindows(&debug.global_allocator, paths);
495 return %%resolveWindows(debug.global_allocator, paths);
496496}
497497
498498fn testResolvePosix(paths: []const []const u8) -> []u8 {
499 return %%resolvePosix(&debug.global_allocator, paths);
499 return %%resolvePosix(debug.global_allocator, paths);
500500}
501501
502502pub fn dirname(path: []const u8) -> []const u8 {
......@@ -899,12 +899,12 @@ test "os.path.relative" {
899899}
900900
901901fn testRelativePosix(from: []const u8, to: []const u8, expected_output: []const u8) {
902 const result = %%relativePosix(&debug.global_allocator, from, to);
902 const result = %%relativePosix(debug.global_allocator, from, to);
903903 assert(mem.eql(u8, result, expected_output));
904904}
905905
906906fn testRelativeWindows(from: []const u8, to: []const u8, expected_output: []const u8) {
907 const result = %%relativeWindows(&debug.global_allocator, from, to);
907 const result = %%relativeWindows(debug.global_allocator, from, to);
908908 assert(mem.eql(u8, result, expected_output));
909909}
910910
......@@ -1022,5 +1022,5 @@ pub fn real(allocator: &Allocator, pathname: []const u8) -> %[]u8 {
10221022
10231023test "os.path.real" {
10241024 // at least call it so it gets compiled
1025 _ = real(&debug.global_allocator, "some_path");
1025 _ = real(debug.global_allocator, "some_path");
10261026}
std/os/windows/index.zig+3
......@@ -46,6 +46,8 @@ pub extern "kernel32" stdcallcc fn GetEnvironmentVariableA(lpName: LPCSTR, lpBuf
4646
4747pub extern "kernel32" stdcallcc fn GetExitCodeProcess(hProcess: HANDLE, lpExitCode: &DWORD) -> BOOL;
4848
49pub extern "kernel32" stdcallcc fn GetFileSizeEx(hFile: HANDLE, lpFileSize: &LARGE_INTEGER) -> BOOL;
50
4951pub extern "kernel32" stdcallcc fn GetLastError() -> DWORD;
5052
5153pub extern "kernel32" stdcallcc fn GetFileInformationByHandleEx(in_hFile: HANDLE,
......@@ -115,6 +117,7 @@ pub const ULONG_PTR = usize;
115117pub const UNICODE = false;
116118pub const WCHAR = u16;
117119pub const WORD = u16;
120pub const LARGE_INTEGER = i64;
118121
119122pub const TRUE = 1;
120123pub const FALSE = 0;