]> git.lizzy.rs Git - rust.git/commitdiff
add helper function for target platform checks
authorChristian Poveda <git@christianpoveda.xyz>
Sat, 8 Feb 2020 18:29:26 +0000 (13:29 -0500)
committerChristian Poveda <git@christianpoveda.xyz>
Wed, 19 Feb 2020 22:47:34 +0000 (17:47 -0500)
src/helpers.rs
src/shims/fs.rs

index a765d58bbcf35c200e3f600c851a21f5e178789a..c92aa6dfaa7cb4a1570c847c66a52b723448d807 100644 (file)
@@ -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<Tag>) -> InterpResult<'tcx> {
index 2ae215e7204f2219d758625761eeeceadb7d9bdd..42a860780ff8b05fbb07bcaf5bd151f797f9ea7e 100644 (file)
@@ -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()?;