@@ -97,32 +97,34 @@ pub struct CStore {
97
97
impl CStore {
98
98
pub fn new ( metadata_loader : Box < MetadataLoader + Sync > ) -> CStore {
99
99
CStore {
100
- metas : RwLock :: new ( IndexVec :: new ( ) ) ,
100
+ // We add an empty entry for LOCAL_CRATE (which maps to zero) in
101
+ // order to make array indices in `metas` match with the
102
+ // corresponding `CrateNum`. This first entry will always remain
103
+ // `None`.
104
+ metas : RwLock :: new ( IndexVec :: from_elem_n ( None , 1 ) ) ,
101
105
extern_mod_crate_map : Lock :: new ( FxHashMap ( ) ) ,
102
106
metadata_loader,
103
107
}
104
108
}
105
109
106
- /// You cannot use this function to allocate a CrateNum in a thread-safe manner.
107
- /// It is currently only used in CrateLoader which is single-threaded code.
108
- pub fn next_crate_num ( & self ) -> CrateNum {
109
- CrateNum :: new ( self . metas . borrow ( ) . len ( ) + 1 )
110
+ pub ( super ) fn alloc_new_crate_num ( & self ) -> CrateNum {
111
+ let mut metas = self . metas . borrow_mut ( ) ;
112
+ let cnum = CrateNum :: new ( metas. len ( ) ) ;
113
+ metas. push ( None ) ;
114
+ cnum
110
115
}
111
116
112
- pub fn get_crate_data ( & self , cnum : CrateNum ) -> Lrc < CrateMetadata > {
117
+ pub ( super ) fn get_crate_data ( & self , cnum : CrateNum ) -> Lrc < CrateMetadata > {
113
118
self . metas . borrow ( ) [ cnum] . clone ( ) . unwrap ( )
114
119
}
115
120
116
- pub fn set_crate_data ( & self , cnum : CrateNum , data : Lrc < CrateMetadata > ) {
117
- use rustc_data_structures:: indexed_vec:: Idx ;
118
- let mut met = self . metas . borrow_mut ( ) ;
119
- while met. len ( ) <= cnum. index ( ) {
120
- met. push ( None ) ;
121
- }
122
- met[ cnum] = Some ( data) ;
121
+ pub ( super ) fn set_crate_data ( & self , cnum : CrateNum , data : Lrc < CrateMetadata > ) {
122
+ let mut metas = self . metas . borrow_mut ( ) ;
123
+ assert ! ( metas[ cnum] . is_none( ) , "Overwriting crate metadata entry" ) ;
124
+ metas[ cnum] = Some ( data) ;
123
125
}
124
126
125
- pub fn iter_crate_data < I > ( & self , mut i : I )
127
+ pub ( super ) fn iter_crate_data < I > ( & self , mut i : I )
126
128
where I : FnMut ( CrateNum , & Lrc < CrateMetadata > )
127
129
{
128
130
for ( k, v) in self . metas . borrow ( ) . iter_enumerated ( ) {
@@ -132,14 +134,16 @@ impl CStore {
132
134
}
133
135
}
134
136
135
- pub fn crate_dependencies_in_rpo ( & self , krate : CrateNum ) -> Vec < CrateNum > {
137
+ pub ( super ) fn crate_dependencies_in_rpo ( & self , krate : CrateNum ) -> Vec < CrateNum > {
136
138
let mut ordering = Vec :: new ( ) ;
137
139
self . push_dependencies_in_postorder ( & mut ordering, krate) ;
138
140
ordering. reverse ( ) ;
139
141
ordering
140
142
}
141
143
142
- pub fn push_dependencies_in_postorder ( & self , ordering : & mut Vec < CrateNum > , krate : CrateNum ) {
144
+ pub ( super ) fn push_dependencies_in_postorder ( & self ,
145
+ ordering : & mut Vec < CrateNum > ,
146
+ krate : CrateNum ) {
143
147
if ordering. contains ( & krate) {
144
148
return ;
145
149
}
@@ -154,7 +158,7 @@ impl CStore {
154
158
ordering. push ( krate) ;
155
159
}
156
160
157
- pub fn do_postorder_cnums_untracked ( & self ) -> Vec < CrateNum > {
161
+ pub ( super ) fn do_postorder_cnums_untracked ( & self ) -> Vec < CrateNum > {
158
162
let mut ordering = Vec :: new ( ) ;
159
163
for ( num, v) in self . metas . borrow ( ) . iter_enumerated ( ) {
160
164
if let & Some ( _) = v {
@@ -164,11 +168,11 @@ impl CStore {
164
168
return ordering
165
169
}
166
170
167
- pub fn add_extern_mod_stmt_cnum ( & self , emod_id : ast:: NodeId , cnum : CrateNum ) {
171
+ pub ( super ) fn add_extern_mod_stmt_cnum ( & self , emod_id : ast:: NodeId , cnum : CrateNum ) {
168
172
self . extern_mod_crate_map . borrow_mut ( ) . insert ( emod_id, cnum) ;
169
173
}
170
174
171
- pub fn do_extern_mod_stmt_cnum ( & self , emod_id : ast:: NodeId ) -> Option < CrateNum > {
175
+ pub ( super ) fn do_extern_mod_stmt_cnum ( & self , emod_id : ast:: NodeId ) -> Option < CrateNum > {
172
176
self . extern_mod_crate_map . borrow ( ) . get ( & emod_id) . cloned ( )
173
177
}
174
178
}
0 commit comments