about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustc/middle/trans/base.rs30
-rw-r--r--src/libstd/rt/crate_map.rs114
-rw-r--r--src/libstd/rt/logging.rs112
3 files changed, 116 insertions, 140 deletions
diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs
index 98de8293b60..c7ae68ec446 100644
--- a/src/librustc/middle/trans/base.rs
+++ b/src/librustc/middle/trans/base.rs
@@ -54,7 +54,7 @@ use middle::trans::glue;
 use middle::trans::inline;
 use middle::trans::llrepr::LlvmRepr;
 use middle::trans::machine;
-use middle::trans::machine::{llalign_of_min, llsize_of};
+use middle::trans::machine::{llalign_of_min, llsize_of, llsize_of_alloc};
 use middle::trans::meth;
 use middle::trans::monomorphize;
 use middle::trans::tvec;
@@ -2911,8 +2911,9 @@ pub fn decl_gc_metadata(ccx: &mut CrateContext, llmod_id: &str) {
     }
 }
 
-pub fn create_module_map(ccx: &mut CrateContext) -> (ValueRef, uint) {
-    let elttype = Type::struct_([ccx.int_type, ccx.int_type], false);
+pub fn create_module_map(ccx: &mut CrateContext) -> (ValueRef, uint, uint) {
+    let str_slice_type = Type::struct_([Type::i8p(), ccx.int_type], false);
+    let elttype = Type::struct_([str_slice_type, ccx.int_type], false);
     let maptype = Type::array(&elttype, ccx.module_data.len() as u64);
     let map = do "_rust_mod_map".with_c_str |buf| {
         unsafe {
@@ -2931,17 +2932,18 @@ pub fn create_module_map(ccx: &mut CrateContext) -> (ValueRef, uint) {
     }
 
     for key in keys.iter() {
-        let val = *ccx.module_data.find_equiv(key).unwrap();
-        let s_const = C_cstr(ccx, *key);
-        let s_ptr = p2i(ccx, s_const);
-        let v_ptr = p2i(ccx, val);
-        let elt = C_struct([s_ptr, v_ptr]);
-        elts.push(elt);
+            let val = *ccx.module_data.find_equiv(key).unwrap();
+            let v_ptr = p2i(ccx, val);
+            let elt = C_struct([
+                C_estr_slice(ccx, *key),
+                v_ptr
+            ]);
+            elts.push(elt);
     }
     unsafe {
         llvm::LLVMSetInitializer(map, C_array(elttype, elts));
     }
-    return (map, keys.len());
+    return (map, keys.len(), llsize_of_alloc(ccx, elttype));
 }
 
 
@@ -3003,17 +3005,19 @@ pub fn fill_crate_map(ccx: &mut CrateContext, map: ValueRef) {
         lib::llvm::SetLinkage(vec_elements, lib::llvm::InternalLinkage);
 
         llvm::LLVMSetInitializer(vec_elements, C_array(ccx.int_type, subcrates));
-        let (mod_map, mod_count) = create_module_map(ccx);
+        let (mod_map, mod_count, mod_struct_size) = create_module_map(ccx);
 
         llvm::LLVMSetInitializer(map, C_struct(
             [C_i32(1),
              C_struct([
                 p2i(ccx, mod_map),
-                C_int(ccx, (mod_count * 16) as int)
+                // byte size of the module map array, an entry consists of two integers
+                C_int(ccx, ((mod_count * mod_struct_size) as int))
              ]),
              C_struct([
                 p2i(ccx, vec_elements),
-                C_int(ccx, (subcrates.len() * 8) as int)
+                // byte size of the subcrates array, an entry consists of an integer
+                C_int(ccx, (subcrates.len() * llsize_of_alloc(ccx, ccx.int_type)) as int)
              ])
         ]));
     }
diff --git a/src/libstd/rt/crate_map.rs b/src/libstd/rt/crate_map.rs
index 499516bb4fd..3120d69d5df 100644
--- a/src/libstd/rt/crate_map.rs
+++ b/src/libstd/rt/crate_map.rs
@@ -11,7 +11,6 @@
 #[cfg(not(stage0))] use cast::transmute;
 use container::MutableSet;
 use hashmap::HashSet;
-use libc::c_char;
 use option::{Some, None};
 use vec::ImmutableVector;
 
@@ -29,19 +28,19 @@ extern {
     static CRATE_MAP: CrateMap<'static>;
 }
 
-pub struct ModEntry {
-    name: *c_char,
+pub struct ModEntry<'self> {
+    name: &'self str,
     log_level: *mut u32
 }
 
 pub struct CrateMapV0<'self> {
-    entries: &'self [ModEntry],
+    entries: &'self [ModEntry<'self>],
     children: &'self [&'self CrateMap<'self>]
 }
 
 pub struct CrateMap<'self> {
     version: i32,
-    entries: &'self [ModEntry],
+    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>]
@@ -79,7 +78,7 @@ fn version(crate_map: &CrateMap) -> i32 {
 
 #[cfg(not(stage0))]
 fn get_entries_and_children<'a>(crate_map: &'a CrateMap<'a>) ->
-                    (&'a [ModEntry], &'a [&'a CrateMap<'a>]) {
+                    (&'a [ModEntry<'a>], &'a [&'a CrateMap<'a>]) {
     match version(crate_map) {
         0 => {
             unsafe {
@@ -127,34 +126,31 @@ pub fn iter_crate_map<'a>(crate_map: &'a CrateMap<'a>, f: &fn(&ModEntry)) {
 
 #[cfg(test)]
 mod tests {
-    use c_str::ToCStr;
-    use cast::transmute;
     use rt::crate_map::{CrateMap, ModEntry, iter_crate_map};
 
     #[test]
     fn iter_crate_map_duplicates() {
+        let mut level3: u32 = 3;
+
+        let entries = [
+            ModEntry { name: "c::m1", log_level: &mut level3},
+        ];
+
+        let child_crate = CrateMap {
+            version: 1,
+            entries: entries,
+            children: []
+        };
+
+        let root_crate = CrateMap {
+            version: 1,
+            entries: [],
+            children: [&child_crate, &child_crate]
+        };
+
+        let mut cnt = 0;
         unsafe {
-            let mod_name1 = "c::m1".to_c_str();
-            let mut level3: u32 = 3;
-
-            let entries = [
-                ModEntry { name: mod_name1.with_ref(|buf| buf), log_level: &mut level3},
-            ];
-
-            let child_crate = CrateMap {
-                version: 1,
-                entries: entries,
-                children: []
-            };
-
-            let root_crate = CrateMap {
-                version: 1,
-                entries: [],
-                children: [&child_crate, &child_crate]
-            };
-
-            let mut cnt = 0;
-            do iter_crate_map(transmute(&root_crate)) |entry| {
+            do iter_crate_map(&root_crate) |entry| {
                 assert!(*entry.log_level == 3);
                 cnt += 1;
             }
@@ -164,38 +160,36 @@ mod tests {
 
     #[test]
     fn iter_crate_map_follow_children() {
+        let mut level2: u32 = 2;
+        let mut level3: u32 = 3;
+        let child_crate2 = CrateMap {
+            version: 1,
+            entries: [
+                ModEntry { name: "c::m1", log_level: &mut level2},
+                ModEntry { name: "c::m2", log_level: &mut level3},
+            ],
+            children: []
+        };
+
+        let child_crate1 = CrateMap {
+            version: 1,
+            entries: [
+                ModEntry { name: "t::f1", log_level: &mut 1},
+            ],
+            children: [&child_crate2]
+        };
+
+        let root_crate = CrateMap {
+            version: 1,
+            entries: [
+                ModEntry { name: "t::f2", log_level: &mut 0},
+            ],
+            children: [&child_crate1]
+        };
+
+        let mut cnt = 0;
         unsafe {
-            let mod_name1 = "c::m1".to_c_str();
-            let mod_name2 = "c::m2".to_c_str();
-            let mut level2: u32 = 2;
-            let mut level3: u32 = 3;
-            let child_crate2 = CrateMap {
-                version: 1,
-                entries: [
-                    ModEntry { name: mod_name1.with_ref(|buf| buf), log_level: &mut level2},
-                    ModEntry { name: mod_name2.with_ref(|buf| buf), log_level: &mut level3},
-                ],
-                children: []
-            };
-
-            let child_crate1 = CrateMap {
-                version: 1,
-                entries: [
-                    ModEntry { name: "t::f1".to_c_str().with_ref(|buf| buf), log_level: &mut 1},
-                ],
-                children: [&child_crate2]
-            };
-
-            let root_crate = CrateMap {
-                version: 1,
-                entries: [
-                    ModEntry { name: "t::f1".to_c_str().with_ref(|buf| buf), log_level: &mut 0},
-                ],
-                children: [&child_crate1]
-            };
-
-            let mut cnt = 0;
-            do iter_crate_map(transmute(&root_crate)) |entry| {
+            do iter_crate_map(&root_crate) |entry| {
                 assert!(*entry.log_level == cnt);
                 cnt += 1;
             }
diff --git a/src/libstd/rt/logging.rs b/src/libstd/rt/logging.rs
index 8d85f72056e..cf917d1c412 100644
--- a/src/libstd/rt/logging.rs
+++ b/src/libstd/rt/logging.rs
@@ -16,7 +16,6 @@ use rt;
 use rt::util::dumb_println;
 use rt::crate_map::{ModEntry, CrateMap, iter_crate_map, get_crate_map};
 use str::StrSlice;
-use str::raw::from_c_str;
 use u32;
 use vec::ImmutableVector;
 #[cfg(test)] use cast::transmute;
@@ -112,28 +111,26 @@ fn parse_logging_spec(spec: ~str) -> ~[LogDirective]{
 fn update_entry(dirs: &[LogDirective], entry: &ModEntry) -> u32 {
     let mut new_lvl: u32 = DEFAULT_LOG_LEVEL;
     let mut longest_match = -1i;
-    unsafe {
-        for dir in dirs.iter() {
-            match dir.name {
-                None => {
-                    if longest_match == -1 {
-                        longest_match = 0;
-                        new_lvl = dir.level;
-                    }
+    for dir in dirs.iter() {
+        match dir.name {
+            None => {
+                if longest_match == -1 {
+                    longest_match = 0;
+                    new_lvl = dir.level;
                 }
-                Some(ref dir_name) => {
-                    let name = from_c_str(entry.name);
-                    let len = dir_name.len() as int;
-                    if name.starts_with(*dir_name) &&
-                        len >= longest_match {
-                        longest_match = len;
-                        new_lvl = dir.level;
-                    }
+            }
+            Some(ref dir_name) => {
+                let name = entry.name;
+                let len = dir_name.len() as int;
+                if name.starts_with(*dir_name) &&
+                    len >= longest_match {
+                    longest_match = len;
+                    new_lvl = dir.level;
                 }
-            };
-        }
-        *entry.log_level = new_lvl;
+            }
+        };
     }
+    unsafe { *entry.log_level = new_lvl; }
     if longest_match >= 0 { return 1; } else { return 0; }
 }
 
@@ -144,13 +141,11 @@ fn update_log_settings(crate_map: &CrateMap, settings: ~str) {
     let mut dirs = ~[];
     if settings.len() > 0 {
         if settings == ~"::help" || settings == ~"?" {
-            dumb_println("\nCrate log map:\n");
-            unsafe {
-                do iter_crate_map(crate_map) |entry| {
-                    dumb_println(" "+from_c_str(entry.name));
-                }
-                exit(1);
+        dumb_println("\nCrate log map:\n");
+            do iter_crate_map(crate_map) |entry| {
+                dumb_println(" "+entry.name);
             }
+            unsafe { exit(1); }
         }
         dirs = parse_logging_spec(settings);
     }
@@ -288,88 +283,71 @@ fn parse_logging_spec_global() {
 // Tests for update_entry
 #[test]
 fn update_entry_match_full_path() {
-    use c_str::ToCStr;
     let dirs = ~[LogDirective {name: Some(~"crate1::mod1"), level: 2 },
                  LogDirective {name: Some(~"crate2"), level: 3}];
     let level = &mut 0;
     unsafe {
-        do "crate1::mod1".with_c_str |ptr| {
-            let entry= &ModEntry {name: ptr, log_level: level};
-            let m = update_entry(dirs, transmute(entry));
-            assert!(*entry.log_level == 2);
-            assert!(m == 1);
-        }
+        let entry= &ModEntry {name:"crate1::mod1", log_level: level};
+        let m = update_entry(dirs, transmute(entry));
+        assert!(*entry.log_level == 2);
+        assert!(m == 1);
     }
 }
 
 #[test]
 fn update_entry_no_match() {
-    use c_str::ToCStr;
     let dirs = ~[LogDirective {name: Some(~"crate1::mod1"), level: 2 },
                  LogDirective {name: Some(~"crate2"), level: 3}];
     let level = &mut 0;
     unsafe {
-        do "crate3::mod1".with_c_str |ptr| {
-            let entry= &ModEntry {name: ptr, log_level: level};
-            let m = update_entry(dirs, transmute(entry));
-            assert!(*entry.log_level == DEFAULT_LOG_LEVEL);
-            assert!(m == 0);
-        }
+        let entry= &ModEntry {name: "crate3::mod1", log_level: level};
+        let m = update_entry(dirs, transmute(entry));
+        assert!(*entry.log_level == DEFAULT_LOG_LEVEL);
+        assert!(m == 0);
     }
 }
 
 #[test]
 fn update_entry_match_beginning() {
-    use c_str::ToCStr;
     let dirs = ~[LogDirective {name: Some(~"crate1::mod1"), level: 2 },
                  LogDirective {name: Some(~"crate2"), level: 3}];
     let level = &mut 0;
     unsafe {
-        do "crate2::mod1".with_c_str |ptr| {
-            let entry= &ModEntry {name: ptr, log_level: level};
-            let m = update_entry(dirs, transmute(entry));
-            assert!(*entry.log_level == 3);
-            assert!(m == 1);
-        }
+        let entry= &ModEntry {name: "crate2::mod1", log_level: level};
+        let m = update_entry(dirs, transmute(entry));
+        assert!(*entry.log_level == 3);
+        assert!(m == 1);
     }
 }
 
 #[test]
 fn update_entry_match_beginning_longest_match() {
-    use c_str::ToCStr;
     let dirs = ~[LogDirective {name: Some(~"crate1::mod1"), level: 2 },
                  LogDirective {name: Some(~"crate2"), level: 3},
                  LogDirective {name: Some(~"crate2::mod"), level: 4}];
     let level = &mut 0;
     unsafe {
-        do "crate2::mod1".with_c_str |ptr| {
-            let entry = &ModEntry {name: ptr, log_level: level};
-            let m = update_entry(dirs, transmute(entry));
-            assert!(*entry.log_level == 4);
-            assert!(m == 1);
-        }
+        let entry = &ModEntry {name: "crate2::mod1", log_level: level};
+        let m = update_entry(dirs, transmute(entry));
+        assert!(*entry.log_level == 4);
+        assert!(m == 1);
     }
 }
 
 #[test]
 fn update_entry_match_default() {
-    use c_str::ToCStr;
     let dirs = ~[LogDirective {name: Some(~"crate1::mod1"), level: 2 },
                  LogDirective {name: None, level: 3}
                 ];
     let level = &mut 0;
     unsafe {
-        do "crate1::mod1".with_c_str |ptr| {
-            let entry= &ModEntry {name: ptr, log_level: level};
-            let m = update_entry(dirs, transmute(entry));
-            assert!(*entry.log_level == 2);
-            assert!(m == 1);
-        }
-        do "crate2::mod2".with_c_str |ptr| {
-            let entry= &ModEntry {name: ptr, log_level: level};
-            let m = update_entry(dirs, transmute(entry));
-            assert!(*entry.log_level == 3);
-            assert!(m == 1);
-        }
+        let entry= &ModEntry {name: "crate1::mod1", log_level: level};
+        let m = update_entry(dirs, transmute(entry));
+        assert!(*entry.log_level == 2);
+        assert!(m == 1);
+        let entry= &ModEntry {name: "crate2::mod2", log_level: level};
+        let m = update_entry(dirs, transmute(entry));
+        assert!(*entry.log_level == 3);
+        assert!(m == 1);
     }
 }