浏览代码

Merge branch 'assertions' of https://github.com/NilSet/ralloc

ticki 8 年之前
父节点
当前提交
1645a13385
共有 2 个文件被更改,包括 63 次插入0 次删除
  1. 60 0
      src/assertions.rs
  2. 3 0
      src/lib.rs

+ 60 - 0
src/assertions.rs

@@ -0,0 +1,60 @@
+use core::fmt::{Write, Result};
+
+pub struct LibcWriter {
+    pub fd: i32,
+}
+
+extern "C" {
+    fn write(fd: i32, buff: *const u8, size: usize) -> isize;
+}
+
+impl Write for LibcWriter {
+    fn write_str(&mut self, s: &str) -> Result {
+        unsafe { write(self.fd, s.as_ptr(), s.len()) };
+        Ok(()) //TODO write until done and return Error on error code
+    }
+}
+
+macro_rules! assert {
+    ($e:expr) => {{
+        if !$e {
+            use core::intrinsics;
+            use assertions;
+            use core::fmt::Write;
+
+            let _ = writeln!(assertions::LibcWriter{fd: 2}, "assertion failed at {}:{}: {}", file!(), line!(),stringify!($e));
+            #[allow(unused_unsafe)]
+            unsafe{ intrinsics::abort()}
+        }
+    }};
+    ($e:expr, $( $arg:tt )+) => {{
+        if !$e {
+            use core::intrinsics;
+            use assertions;
+            use core::fmt::Write;
+
+            let _ = writeln!(assertions::LibcWriter{fd: 2}, "assertion failed at {}:{}: {}", file!(), line!(), stringify!($e));
+            let _ = writeln!(assertions::LibcWriter{fd: 2}, $($arg)+);
+            #[allow(unused_unsafe)]
+            unsafe{ intrinsics::abort()}
+        }
+    }}
+}
+
+macro_rules! debug_assert {
+    ($($arg:tt)*) => (if cfg!(debug_assertions) { assert!($($arg)*); })
+}
+
+macro_rules! assert_eq {
+    ($left:expr , $right:expr) => ({
+        match (&$left, &$right) {
+            (left_val, right_val) => {
+                assert!(*left_val == *right_val, "(left: `{:?}`, right: `{:?}`)", left_val, right_val)
+            }
+        }
+    })
+}
+
+macro_rules! debug_assert {
+    ($($arg:tt)*) => (if cfg!(debug_assertions) { assert!($($arg)*); })
+}

+ 3 - 0
src/lib.rs

@@ -13,6 +13,9 @@
            nonzero, optin_builtin_traits, type_ascription)]
 #![warn(missing_docs)]
 
+#[macro_use]
+mod assertions;
+
 mod block;
 mod bookkeeper;
 mod leak;