commit 04b721d53530c1de825f7d1df93f2e23916e092d (tree)
parent 1a913f6bf2ac33426f889900b75afa471cc4cee5
Author: MovingtoMars <liam@bumblebee.net.nz>
Date: Thu, 28 Jan 2016 13:18:29 +1300
malloc fails on proper errors
Diffstat:
1 file changed, 21 insertions(+), 5 deletions(-)
diff --git a/std/mem.zig b/std/mem.zig
@@ -1,5 +1,6 @@
import "syscall.zig";
import "std.zig";
+import "errno.zig";
pub fn malloc(bytes: isize) -> ?&u8 {
if (bytes > 4096) {
@@ -7,13 +8,28 @@ pub fn malloc(bytes: isize) -> ?&u8 {
return null;
}
- const result = mmap(0, 4096, MMAP_PROT_READ|MMAP_PROT_WRITE, MMAP_MAP_ANON|MMAP_MAP_SHARED, -1, 0);
+ const result = mmap(isize(0), 4096, MMAP_PROT_READ|MMAP_PROT_WRITE, MMAP_MAP_ANON|MMAP_MAP_SHARED, -1, 0);
- if (result == -1) {
- return null;
- }
+ const failed: bool = switch (-result) {
+ 0 => true,
+ EINVAL => true,
+ EACCES => true,
+ EAGAIN => true,
+ EBADF => true,
+ EMFILE => true,
+ ENODEV => true,
+ ENOMEM => true,
+ EOPNOTSUPP => true,
+ ENXIO => true,
+ EOVERFLOW => true,
+ else => false,
+ };
- (&u8)(result)
+ if (failed) {
+ null
+ } else {
+ (&u8)(result)
+ }
}
pub fn free(ptr: &u8) {