Skip to content

Commit 6bf1547

Browse files
committedNov 10, 2017
Merge branch 'darwin-stat'
closes #606
2 parents 336d818 + 029d37d commit 6bf1547

15 files changed

+122
-51
lines changed
 

‎src/codegen.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -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
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ pub fn ArrayList(comptime T: type) -> type{
101101
}
102102

103103
test "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
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ pub const Buffer = struct {
135135
test "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
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,28 @@ pub const _errno = __error;
66

77
/// Renamed to Stat to not conflict with the stat function.
88
pub 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

3133
pub const timespec = extern struct {

‎std/c/index.zig

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ pub extern "c" fn exit(code: c_int) -> noreturn;
1414
pub extern "c" fn isatty(fd: c_int) -> c_int;
1515
pub extern "c" fn close(fd: c_int) -> c_int;
1616
pub extern "c" fn fstat(fd: c_int, buf: &Stat) -> c_int;
17+
pub extern "c" fn @"fstat$INODE64"(fd: c_int, buf: &Stat) -> c_int;
1718
pub extern "c" fn lseek(fd: c_int, offset: isize, whence: c_int) -> isize;
1819
pub extern "c" fn open(path: &const u8, oflag: c_int, ...) -> c_int;
1920
pub extern "c" fn raise(sig: c_int) -> c_int;

‎std/debug.zig

+4-3
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ fn getStderrStream() -> %&io.OutStream {
3838
/// Tries to print a stack trace to stderr, unbuffered, and ignores any error returned.
3939
pub 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

970-
pub var global_allocator = mem.Allocator {
970+
pub const global_allocator = &global_allocator_state;
971+
var global_allocator_state = mem.Allocator {
971972
.allocFn = globalAlloc,
972973
.reallocFn = globalRealloc,
973974
.freeFn = globalFree,

‎std/hash_map.zig

+1-1
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ pub fn HashMap(comptime K: type, comptime V: type,
232232
}
233233

234234
test "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
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ const fmt = std.fmt;
2020
const is_posix = builtin.os != builtin.Os.windows;
2121
const is_windows = builtin.os == builtin.Os.windows;
2222

23+
test "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.
2531
error 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

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
const std = @import("index.zig");
2+
const io = std.io;
3+
const allocator = std.debug.global_allocator;
4+
const Rand = std.rand.Rand;
5+
const assert = std.debug.assert;
6+
const mem = std.mem;
7+
const os = std.os;
8+
9+
test "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
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ pub fn LinkedList(comptime T: type) -> type {
195195
}
196196

197197
test "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
Original file line numberDiff line numberDiff line change
@@ -331,8 +331,8 @@ pub fn join(allocator: &Allocator, sep: u8, strings: ...) -> %[]u8 {
331331
}
332332

333333
test "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

338338
test "testStringEquality" {

‎std/os/darwin.zig

+1-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ pub fn isatty(fd: i32) -> bool {
129129
}
130130

131131
pub fn fstat(fd: i32, buf: &c.Stat) -> usize {
132-
errnoWrap(c.fstat(fd, buf))
132+
errnoWrap(c.@"fstat$INODE64"(fd, buf))
133133
}
134134

135135
pub fn lseek(fd: i32, offset: isize, whence: c_int) -> usize {

‎std/os/index.zig

+3-4
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,7 @@ pub fn getCwd(allocator: &Allocator) -> %[]u8 {
562562

563563
test "os.getCwd" {
564564
// at least call it so it gets compiled
565-
_ = getCwd(&debug.global_allocator);
565+
_ = getCwd(debug.global_allocator);
566566
}
567567

568568
pub fn symLink(allocator: &Allocator, existing_path: []const u8, new_path: []const u8) -> %void {
@@ -1432,10 +1432,10 @@ test "windows arg parsing" {
14321432
fn 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

14411441
test "std.os" {
@@ -1500,4 +1500,3 @@ pub fn isTty(handle: FileHandle) -> bool {
15001500
}
15011501
}
15021502
}
1503-

‎std/os/path.zig

+16-16
Original file line numberDiff line numberDiff line change
@@ -41,23 +41,23 @@ pub fn joinPosix(allocator: &Allocator, paths: ...) -> %[]u8 {
4141
}
4242

4343
test "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

455455
test "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

494494
fn testResolveWindows(paths: []const []const u8) -> []u8 {
495-
return %%resolveWindows(&debug.global_allocator, paths);
495+
return %%resolveWindows(debug.global_allocator, paths);
496496
}
497497

498498
fn testResolvePosix(paths: []const []const u8) -> []u8 {
499-
return %%resolvePosix(&debug.global_allocator, paths);
499+
return %%resolvePosix(debug.global_allocator, paths);
500500
}
501501

502502
pub fn dirname(path: []const u8) -> []const u8 {
@@ -899,12 +899,12 @@ test "os.path.relative" {
899899
}
900900

901901
fn 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

906906
fn 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

10231023
test "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
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ pub extern "kernel32" stdcallcc fn GetEnvironmentVariableA(lpName: LPCSTR, lpBuf
4646

4747
pub extern "kernel32" stdcallcc fn GetExitCodeProcess(hProcess: HANDLE, lpExitCode: &DWORD) -> BOOL;
4848

49+
pub extern "kernel32" stdcallcc fn GetFileSizeEx(hFile: HANDLE, lpFileSize: &LARGE_INTEGER) -> BOOL;
50+
4951
pub extern "kernel32" stdcallcc fn GetLastError() -> DWORD;
5052

5153
pub extern "kernel32" stdcallcc fn GetFileInformationByHandleEx(in_hFile: HANDLE,
@@ -115,6 +117,7 @@ pub const ULONG_PTR = usize;
115117
pub const UNICODE = false;
116118
pub const WCHAR = u16;
117119
pub const WORD = u16;
120+
pub const LARGE_INTEGER = i64;
118121

119122
pub const TRUE = 1;
120123
pub const FALSE = 0;

0 commit comments

Comments
 (0)
Please sign in to comment.