]> git.lizzy.rs Git - rust.git/commitdiff
Reorganize shims::env::EnvVars
authorChristian Poveda <christianpoveda@protonmail.com>
Tue, 13 Aug 2019 21:17:41 +0000 (16:17 -0500)
committerChristian Poveda <christianpoveda@protonmail.com>
Tue, 13 Aug 2019 21:17:41 +0000 (16:17 -0500)
src/eval.rs
src/lib.rs
src/machine.rs
src/shims/env.rs

index 5e6c8129fb3108a8a08c322802ae2385a1237602..936ae5b8953273d1d34fdea884af2c34f3ed88b6 100644 (file)
@@ -12,8 +12,8 @@
     InterpResult, InterpError, InterpCx, StackPopCleanup, struct_error,
     Scalar, Tag, Pointer, FnVal,
     MemoryExtra, MiriMemoryKind, Evaluator, TlsEvalContextExt, HelpersEvalContextExt,
+    ShimsEnvVars,
 };
-use crate::shims::env::EnvVars;
 
 /// Configuration needed to spawn a Miri instance.
 #[derive(Clone)]
@@ -40,6 +40,8 @@ pub fn create_ecx<'mir, 'tcx: 'mir>(
         MemoryExtra::new(StdRng::seed_from_u64(config.seed.unwrap_or(0)), config.validate),
     );
 
+    ShimsEnvVars::init(config.communicate, &mut ecx, &tcx);
+
     let main_instance = ty::Instance::mono(ecx.tcx.tcx, main_id);
     let main_mir = ecx.load_mir(main_instance.def)?;
 
@@ -164,10 +166,6 @@ pub fn create_ecx<'mir, 'tcx: 'mir>(
 
     assert!(args.next().is_none(), "start lang item has more arguments than expected");
 
-    if config.communicate {
-        EnvVars::init(&mut ecx, &tcx);
-    }
-
     Ok(ecx)
 }
 
index 58f572bf70112732bf7fdd4a8070a06f3e7d6077..216e41d4f83860d7a6faf08bb5bea0b5798543ab 100644 (file)
@@ -33,6 +33,7 @@
 pub use crate::shims::intrinsics::EvalContextExt as IntrinsicsEvalContextExt;
 pub use crate::shims::tls::{EvalContextExt as TlsEvalContextExt, TlsData};
 pub use crate::shims::dlsym::{Dlsym, EvalContextExt as DlsymEvalContextExt};
+pub use crate::shims::env::{EnvVars as ShimsEnvVars};
 pub use crate::operator::EvalContextExt as OperatorEvalContextExt;
 pub use crate::range_map::RangeMap;
 pub use crate::helpers::{EvalContextExt as HelpersEvalContextExt};
index cc0c85d6603da301e97d3eb646d012eaefc3b6a2..635b46bcdb0484629f46c16db9f14f125f9784a7 100644 (file)
@@ -14,7 +14,6 @@
 use rustc::mir;
 
 use crate::*;
-use crate::shims::env::EnvVars;
 
 // Some global facts about the emulated machine.
 pub const PAGE_SIZE: u64 = 4*1024; // FIXME: adjust to target architecture
@@ -79,7 +78,7 @@ pub fn new(rng: StdRng, validate: bool) -> Self {
 pub struct Evaluator<'tcx> {
     /// Environment variables set by `setenv`.
     /// Miri does not expose env vars from the host to the emulated program.
-    pub(crate) env_vars: EnvVars,
+    pub(crate) env_vars: ShimsEnvVars,
 
     /// Program arguments (`Option` because we can only initialize them after creating the ecx).
     /// These are *pointers* to argc/argv because macOS.
@@ -101,7 +100,9 @@ pub struct Evaluator<'tcx> {
 impl<'tcx> Evaluator<'tcx> {
     pub(crate) fn new(communicate: bool) -> Self {
         Evaluator {
-            env_vars: EnvVars::default(),
+            // `env_vars` could be initialized properly here if `Memory` were available before
+            // calling this method.
+            env_vars: ShimsEnvVars::default(),
             argc: None,
             argv: None,
             cmd_line: None,
index 09d87d27ebc2129d74fb78274916a006febfe0f2..4a15eb4cfb48aa575125108ce771fff83177a17c 100644 (file)
@@ -12,12 +12,15 @@ pub struct EnvVars {
 
 impl EnvVars {
     pub(crate) fn init<'mir, 'tcx>(
+        communicate: bool,
         ecx: &mut InterpCx<'mir, 'tcx, Evaluator<'tcx>>,
         tcx: &TyCtxt<'tcx>,
     ) {
-        for (name, value) in std::env::vars() {
-            let value = alloc_env_value(value.as_bytes(), ecx.memory_mut(), tcx);
-            ecx.machine.env_vars.map.insert(name.into_bytes(), value);
+        if communicate {
+            for (name, value) in std::env::vars() {
+                let value = alloc_env_value(value.as_bytes(), ecx.memory_mut(), tcx);
+                ecx.machine.env_vars.map.insert(name.into_bytes(), value);
+            }
         }
     }