about summary refs log tree commit diff
path: root/src/libstd/rt
diff options
context:
space:
mode:
authorFlorian Hahn <flo@fhahn.com>2013-10-03 10:13:13 +0200
committerFlorian Hahn <flo@fhahn.com>2013-10-06 11:40:26 +0200
commit23176fc567086715aab062a24e2b68e1f54ce5ba (patch)
tree7a2b1029b0366bfac257650be6b92facbf402208 /src/libstd/rt
parentb7b4f7a5e2982c8412fe71a9534f6f62435f9bc3 (diff)
downloadrust-23176fc567086715aab062a24e2b68e1f54ce5ba.tar.gz
rust-23176fc567086715aab062a24e2b68e1f54ce5ba.zip
get_crate_map returns an Option
Diffstat (limited to 'src/libstd/rt')
-rw-r--r--src/libstd/rt/crate_map.rs39
-rw-r--r--src/libstd/rt/logging.rs26
2 files changed, 42 insertions, 23 deletions
diff --git a/src/libstd/rt/crate_map.rs b/src/libstd/rt/crate_map.rs
index ef1bfb1e5e9..061c2e53c7c 100644
--- a/src/libstd/rt/crate_map.rs
+++ b/src/libstd/rt/crate_map.rs
@@ -8,10 +8,9 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-//#[cfg(not(stage0))] use cast::transmute;
 use container::MutableSet;
 use hashmap::HashSet;
-use option::{Some, None};
+use option::{Some, None, Option};
 use vec::ImmutableVector;
 
 /// Imports for old crate map versions
@@ -61,22 +60,23 @@ pub struct ModEntry<'self> {
 pub struct CrateMap<'self> {
     version: i32,
     entries: &'self [ModEntry<'self>],
-    /// a dynamically sized struct, where all pointers to children are listed adjacent
-    /// to the struct, terminated with NULL
     children: &'self [&'self CrateMap<'self>]
 }
 
-
-
 #[cfg(not(windows))]
-pub fn get_crate_map() -> &'static CrateMap<'static> {
-    &'static CRATE_MAP
+pub fn get_crate_map() -> Option<&'static CrateMap<'static>> {
+    let ptr: (*CrateMap) = &'static CRATE_MAP;
+    if ptr.is_null() {
+        return None;
+    } else {
+        return Some(&'static CRATE_MAP);
+    }
 }
 
 #[cfg(windows)]
 #[fixed_stack_segment]
 #[inline(never)]
-pub fn get_crate_map() -> &'static CrateMap<'static> {
+pub fn get_crate_map() -> Option<&'static CrateMap<'static>> {
     use c_str::ToCStr;
     use unstable::dynamic_lib::dl;
 
@@ -88,7 +88,14 @@ pub fn get_crate_map() -> &'static CrateMap<'static> {
         dl::close(module);
         sym
     };
-    sym
+    let ptr: (*CrateMap) = sym as *CrateMap;
+    if ptr.is_null() {
+        return None;
+    } else {
+        unsafe {
+            return Some(transmute(sym));
+        }
+    }
 }
 
 fn version(crate_map: &CrateMap) -> i32 {
@@ -106,9 +113,9 @@ fn iter_module_map(mod_entries: &[ModEntry], f: &fn(&ModEntry)) {
 }
 
 unsafe fn iter_module_map_v0(entries: *ModEntryV0, f: &fn(&ModEntry)) {
-    let mut curr = entries; 
+    let mut curr = entries;
     while !(*curr).name.is_null() {
-        let mod_entry = ModEntry { name: from_c_str((*curr).name), log_level: (*curr).log_level }; 
+        let mod_entry = ModEntry { name: from_c_str((*curr).name), log_level: (*curr).log_level };
         f(&mod_entry);
         curr = curr.offset(1);
     }
@@ -125,7 +132,7 @@ fn do_iter_crate_map<'a>(crate_map: &'a CrateMap<'a>, f: &fn(&ModEntry),
                     do_iter_crate_map(*child, |x| f(x), visited);
                 }
             },
-            /// code for old crate map versions
+            // code for old crate map versions
             1 => unsafe {
                 let v1: *CrateMapV1 = transmute(crate_map);
                 iter_module_map_v0((*v1).entries, |x| f(x));
@@ -142,7 +149,7 @@ fn do_iter_crate_map<'a>(crate_map: &'a CrateMap<'a>, f: &fn(&ModEntry),
                     do_iter_crate_map(transmute(child), |x| f(x), visited);
                 }
             },
-            _ => fail2!("invalid crate map version")  
+            _ => fail2!("invalid crate map version")
         }
     }
 }
@@ -260,7 +267,9 @@ mod tests {
 
             let root_crate = CrateMapT3 {
                 version: 1,
-                entries: vec::raw::to_ptr([ModEntryV0 { name: ptr::null(), log_level: ptr::mut_null()}]),
+                entries: vec::raw::to_ptr([
+                    ModEntryV0 { name: ptr::null(), log_level: ptr::mut_null()}
+                ]),
                 children: [&child_crate as *CrateMapV1, &child_crate as *CrateMapV1, ptr::null()]
             };
 
diff --git a/src/libstd/rt/logging.rs b/src/libstd/rt/logging.rs
index cf917d1c412..8b8e2762381 100644
--- a/src/libstd/rt/logging.rs
+++ b/src/libstd/rt/logging.rs
@@ -199,15 +199,25 @@ impl rt::io::Writer for StdErrLogger {
 pub fn init() {
     use os;
 
-    let crate_map = get_crate_map();
-
     let log_spec = os::getenv("RUST_LOG");
-    match log_spec {
-        Some(spec) => {
-            update_log_settings(crate_map, spec);
-        }
-        None => {
-            update_log_settings(crate_map, ~"");
+    match get_crate_map() {
+        Some(crate_map) => {
+            match log_spec {
+                Some(spec) => {
+                    update_log_settings(crate_map, spec);
+                }
+                None => {
+                    update_log_settings(crate_map, ~"");
+                }
+            }
+        },
+        _ => {
+            match log_spec {
+                Some(_) => {
+                    dumb_println("warning: RUST_LOG set, but no crate map found.");
+                },
+                None => {}
+            }
         }
     }
 }