8
8
// option. This file may not be copied, modified, or distributed
9
9
// except according to those terms.
10
10
11
- //#[cfg(not(stage0))] use cast::transmute;
12
11
use container:: MutableSet ;
13
12
use hashmap:: HashSet ;
14
- use option:: { Some , None } ;
13
+ use option:: { Some , None , Option } ;
15
14
use vec:: ImmutableVector ;
16
15
17
16
/// Imports for old crate map versions
@@ -61,22 +60,23 @@ pub struct ModEntry<'self> {
61
60
pub struct CrateMap < ' self > {
62
61
version : i32 ,
63
62
entries : & ' self [ ModEntry < ' self > ] ,
64
- /// a dynamically sized struct, where all pointers to children are listed adjacent
65
- /// to the struct, terminated with NULL
66
63
children : & ' self [ & ' self CrateMap < ' self > ]
67
64
}
68
65
69
-
70
-
71
66
#[ cfg( not( windows) ) ]
72
- pub fn get_crate_map( ) -> & ' static CrateMap < ' static > {
73
- & ' static CRATE_MAP
67
+ pub fn get_crate_map( ) -> Option < & ' static CrateMap < ' static > > {
68
+ let ptr: ( * CrateMap ) = & ' static CRATE_MAP ;
69
+ if ptr. is_null ( ) {
70
+ return None ;
71
+ } else {
72
+ return Some ( & ' static CRATE_MAP ) ;
73
+ }
74
74
}
75
75
76
76
#[ cfg( windows) ]
77
77
#[ fixed_stack_segment]
78
78
#[ inline( never) ]
79
- pub fn get_crate_map ( ) -> & ' static CrateMap < ' static > {
79
+ pub fn get_crate_map ( ) -> Option < & ' static CrateMap <' static > > {
80
80
use c_str: : ToCStr ;
81
81
use unstable:: dynamic_lib:: dl;
82
82
@@ -88,7 +88,14 @@ pub fn get_crate_map() -> &'static CrateMap<'static> {
88
88
dl:: close ( module) ;
89
89
sym
90
90
} ;
91
- sym
91
+ let ptr: ( * CrateMap ) = sym as * CrateMap ;
92
+ if ptr. is_null ( ) {
93
+ return None ;
94
+ } else {
95
+ unsafe {
96
+ return Some ( transmute ( sym) ) ;
97
+ }
98
+ }
92
99
}
93
100
94
101
fn version ( crate_map : & CrateMap ) -> i32 {
@@ -106,9 +113,9 @@ fn iter_module_map(mod_entries: &[ModEntry], f: &fn(&ModEntry)) {
106
113
}
107
114
108
115
unsafe fn iter_module_map_v0 ( entries : * ModEntryV0 , f : & fn ( & ModEntry ) ) {
109
- let mut curr = entries;
116
+ let mut curr = entries;
110
117
while !( * curr) . name . is_null ( ) {
111
- let mod_entry = ModEntry { name : from_c_str ( ( * curr) . name ) , log_level : ( * curr) . log_level } ;
118
+ let mod_entry = ModEntry { name : from_c_str ( ( * curr) . name ) , log_level : ( * curr) . log_level } ;
112
119
f ( & mod_entry) ;
113
120
curr = curr. offset ( 1 ) ;
114
121
}
@@ -125,7 +132,7 @@ fn do_iter_crate_map<'a>(crate_map: &'a CrateMap<'a>, f: &fn(&ModEntry),
125
132
do_iter_crate_map ( * child, |x| f ( x) , visited) ;
126
133
}
127
134
} ,
128
- /// code for old crate map versions
135
+ // code for old crate map versions
129
136
1 => unsafe {
130
137
let v1: * CrateMapV1 = transmute ( crate_map) ;
131
138
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),
142
149
do_iter_crate_map ( transmute ( child) , |x| f ( x) , visited) ;
143
150
}
144
151
} ,
145
- _ => fail2 ! ( "invalid crate map version" )
152
+ _ => fail2 ! ( "invalid crate map version" )
146
153
}
147
154
}
148
155
}
@@ -260,7 +267,9 @@ mod tests {
260
267
261
268
let root_crate = CrateMapT3 {
262
269
version : 1 ,
263
- entries : vec:: raw:: to_ptr ( [ ModEntryV0 { name : ptr:: null ( ) , log_level : ptr:: mut_null ( ) } ] ) ,
270
+ entries : vec:: raw:: to_ptr ( [
271
+ ModEntryV0 { name : ptr:: null ( ) , log_level : ptr:: mut_null ( ) }
272
+ ] ) ,
264
273
children : [ & child_crate as * CrateMapV1 , & child_crate as * CrateMapV1 , ptr:: null ( ) ]
265
274
} ;
266
275
0 commit comments