From 8fe7543191e10145ba56f676f529e9db4664dee0 Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Sat, 8 Feb 2020 13:29:26 -0500 Subject: [PATCH] add helper function for target platform checks --- src/helpers.rs | 13 +++++++++++++ src/shims/fs.rs | 16 ++++------------ 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/helpers.rs b/src/helpers.rs index a765d58bbcf..c92aa6dfaa7 100644 --- a/src/helpers.rs +++ b/src/helpers.rs @@ -368,6 +368,19 @@ fn check_no_isolation(&mut self, name: &str) -> InterpResult<'tcx> { } Ok(()) } + /// Helper function used inside the shims of foreign functions to check that the target + /// platform is `platform`. It returns an error using the `name` of the foreign function if + /// this is not the case. + fn check_platform(&mut self, platform: &str, name: &str) -> InterpResult<'tcx> { + if self.eval_context_mut().tcx.sess.target.target.target_os.to_lowercase() != platform { + throw_unsup_format!( + "`{}` is only available in the `{}` platform", + name, + platform, + ) + } + Ok(()) + } /// Sets the last error variable. fn set_last_error(&mut self, scalar: Scalar) -> InterpResult<'tcx> { diff --git a/src/shims/fs.rs b/src/shims/fs.rs index 2ae215e7204..42a860780ff 100644 --- a/src/shims/fs.rs +++ b/src/shims/fs.rs @@ -347,6 +347,7 @@ fn stat( ) -> InterpResult<'tcx, i32> { let this = self.eval_context_mut(); this.check_no_isolation("stat")?; + this.check_platform("macos", "stat")?; // `stat` always follows symlinks. this.stat_or_lstat(true, path_op, buf_op) } @@ -359,6 +360,7 @@ fn lstat( ) -> InterpResult<'tcx, i32> { let this = self.eval_context_mut(); this.check_no_isolation("lstat")?; + this.check_platform("macos", "lstat")?; this.stat_or_lstat(false, path_op, buf_op) } @@ -370,10 +372,7 @@ fn fstat( let this = self.eval_context_mut(); this.check_no_isolation("fstat")?; - - if this.tcx.sess.target.target.target_os.to_lowercase() != "macos" { - throw_unsup_format!("The `fstat` shim is only available for `macos` targets.") - } + this.check_platform("macos", "fstat")?; let fd = this.read_scalar(fd_op)?.to_i32()?; @@ -392,10 +391,6 @@ fn stat_or_lstat( ) -> InterpResult<'tcx, i32> { let this = self.eval_context_mut(); - if this.tcx.sess.target.target.target_os.to_lowercase() != "macos" { - throw_unsup_format!("The `stat` and `lstat` shims are only available for `macos` targets.") - } - let path_scalar = this.read_scalar(path_op)?.not_undef()?; let path: PathBuf = this.read_os_str_from_c_str(path_scalar)?.into(); @@ -417,10 +412,7 @@ fn statx( let this = self.eval_context_mut(); this.check_no_isolation("statx")?; - - if this.tcx.sess.target.target.target_os.to_lowercase() != "linux" { - throw_unsup_format!("The `statx` shim is only available for `linux` targets.") - } + this.check_platform("linux", "statx")?; let statxbuf_scalar = this.read_scalar(statxbuf_op)?.not_undef()?; let pathname_scalar = this.read_scalar(pathname_op)?.not_undef()?; -- 2.44.0