diff options
author | Yuki Okushi <huyuumi.dev@gmail.com> | 2020-08-21 04:23:12 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-21 04:23:12 +0900 |
commit | ace7ba86e550d5aff89c507830553286b35a9f15 (patch) | |
tree | db99c84ffdabb2c8cc6f9b101791ed4f9ce8c331 | |
parent | eea46bf093452c143036ffc3f68a3cafa22d2275 (diff) | |
parent | 5a1df22a783ee0348a4c862e36480a50829a95f5 (diff) | |
download | rust-libc-ace7ba86e550d5aff89c507830553286b35a9f15.tar.gz |
Merge pull request #1870 from joshtriplett/safe-functions
-rw-r--r-- | src/macros.rs | 30 | ||||
-rw-r--r-- | src/unix/linux_like/mod.rs | 32 |
2 files changed, 47 insertions, 15 deletions
diff --git a/src/macros.rs b/src/macros.rs index 378da7ccfb..b314f60ff2 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -196,6 +196,21 @@ cfg_if! { } #[allow(unused_macros)] + macro_rules! safe_f { + ($(pub $({$constness:ident})* fn $i:ident( + $($arg:ident: $argty:ty),* + ) -> $ret:ty { + $($body:stmt);* + })*) => ($( + #[inline] + pub $($constness)* extern fn $i($($arg: $argty),* + ) -> $ret { + $($body);* + } + )*) + } + + #[allow(unused_macros)] macro_rules! const_fn { ($($({$constness:ident})* fn $i:ident( $($arg:ident: $argty:ty),* @@ -227,6 +242,21 @@ cfg_if! { } #[allow(unused_macros)] + macro_rules! safe_f { + ($(pub $({$constness:ident})* fn $i:ident( + $($arg:ident: $argty:ty),* + ) -> $ret:ty { + $($body:stmt);* + })*) => ($( + #[inline] + pub extern fn $i($($arg: $argty),* + ) -> $ret { + $($body);* + } + )*) + } + + #[allow(unused_macros)] macro_rules! const_fn { ($($({$constness:ident})* fn $i:ident( $($arg:ident: $argty:ty),* diff --git a/src/unix/linux_like/mod.rs b/src/unix/linux_like/mod.rs index a48c3aaaad..feb3f0fc84 100644 --- a/src/unix/linux_like/mod.rs +++ b/src/unix/linux_like/mod.rs @@ -1233,64 +1233,66 @@ f! { *slot = 0; } } +} - pub fn WIFSTOPPED(status: ::c_int) -> bool { +safe_f! { + pub {const} fn WIFSTOPPED(status: ::c_int) -> bool { (status & 0xff) == 0x7f } - pub fn WSTOPSIG(status: ::c_int) -> ::c_int { + pub {const} fn WSTOPSIG(status: ::c_int) -> ::c_int { (status >> 8) & 0xff } - pub fn WIFCONTINUED(status: ::c_int) -> bool { + pub {const} fn WIFCONTINUED(status: ::c_int) -> bool { status == 0xffff } - pub fn WIFSIGNALED(status: ::c_int) -> bool { + pub {const} fn WIFSIGNALED(status: ::c_int) -> bool { ((status & 0x7f) + 1) as i8 >= 2 } - pub fn WTERMSIG(status: ::c_int) -> ::c_int { + pub {const} fn WTERMSIG(status: ::c_int) -> ::c_int { status & 0x7f } - pub fn WIFEXITED(status: ::c_int) -> bool { + pub {const} fn WIFEXITED(status: ::c_int) -> bool { (status & 0x7f) == 0 } - pub fn WEXITSTATUS(status: ::c_int) -> ::c_int { + pub {const} fn WEXITSTATUS(status: ::c_int) -> ::c_int { (status >> 8) & 0xff } - pub fn WCOREDUMP(status: ::c_int) -> bool { + pub {const} fn WCOREDUMP(status: ::c_int) -> bool { (status & 0x80) != 0 } - pub fn W_EXITCODE(ret: ::c_int, sig: ::c_int) -> ::c_int { + pub {const} fn W_EXITCODE(ret: ::c_int, sig: ::c_int) -> ::c_int { (ret << 8) | sig } - pub fn W_STOPCODE(sig: ::c_int) -> ::c_int { + pub {const} fn W_STOPCODE(sig: ::c_int) -> ::c_int { (sig << 8) | 0x7f } - pub fn QCMD(cmd: ::c_int, type_: ::c_int) -> ::c_int { + pub {const} fn QCMD(cmd: ::c_int, type_: ::c_int) -> ::c_int { (cmd << 8) | (type_ & 0x00ff) } - pub fn IPOPT_COPIED(o: u8) -> u8 { + pub {const} fn IPOPT_COPIED(o: u8) -> u8 { o & IPOPT_COPY } - pub fn IPOPT_CLASS(o: u8) -> u8 { + pub {const} fn IPOPT_CLASS(o: u8) -> u8 { o & IPOPT_CLASS_MASK } - pub fn IPOPT_NUMBER(o: u8) -> u8 { + pub {const} fn IPOPT_NUMBER(o: u8) -> u8 { o & IPOPT_NUMBER_MASK } - pub fn IPTOS_ECN(x: u8) -> u8 { + pub {const} fn IPTOS_ECN(x: u8) -> u8 { x & ::IPTOS_ECN_MASK } } |