summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuki Okushi <huyuumi.dev@gmail.com>2020-08-21 04:23:12 +0900
committerGitHub <noreply@github.com>2020-08-21 04:23:12 +0900
commitace7ba86e550d5aff89c507830553286b35a9f15 (patch)
treedb99c84ffdabb2c8cc6f9b101791ed4f9ce8c331
parenteea46bf093452c143036ffc3f68a3cafa22d2275 (diff)
parent5a1df22a783ee0348a4c862e36480a50829a95f5 (diff)
downloadrust-libc-ace7ba86e550d5aff89c507830553286b35a9f15.tar.gz
Merge pull request #1870 from joshtriplett/safe-functions
-rw-r--r--src/macros.rs30
-rw-r--r--src/unix/linux_like/mod.rs32
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
}
}