@@ -1136,14 +1136,12 @@ pub fn decode_expn_id_incrcomp<D: Decoder>(
1136
1136
Ok ( expn_id)
1137
1137
}
1138
1138
1139
- pub fn decode_expn_id < ' a , D : Decoder > (
1139
+ pub fn decode_expn_id < D : Decoder > (
1140
1140
d : & mut D ,
1141
- get_context : impl FnOnce ( CrateNum ) -> & ' a HygieneDecodeContext ,
1142
- decode_data : impl FnOnce ( & mut D , u32 ) -> Result < ( ExpnData , ExpnHash ) , D :: Error > ,
1141
+ decode_data : impl FnOnce ( CrateNum , u32 ) -> ( ExpnData , ExpnHash ) ,
1143
1142
) -> Result < ExpnId , D :: Error > {
1144
1143
let index = u32:: decode ( d) ?;
1145
1144
let krate = CrateNum :: decode ( d) ?;
1146
- let context = get_context ( krate) ;
1147
1145
1148
1146
// Do this after decoding, so that we decode a `CrateNum`
1149
1147
// if necessary
@@ -1152,49 +1150,29 @@ pub fn decode_expn_id<'a, D: Decoder>(
1152
1150
return Ok ( ExpnId :: root ( ) ) ;
1153
1151
}
1154
1152
1155
- let outer_expns = & context. remapped_expns ;
1156
-
1157
- // Ensure that the lock() temporary is dropped early
1158
- {
1159
- if let Some ( expn_id) = outer_expns. lock ( ) . get ( index as usize ) . copied ( ) . flatten ( ) {
1160
- return Ok ( expn_id) ;
1161
- }
1162
- }
1153
+ // This function is used to decode metadata, so it cannot decode information about LOCAL_CRATE.
1154
+ debug_assert_ne ! ( krate, LOCAL_CRATE ) ;
1163
1155
1164
1156
// Don't decode the data inside `HygieneData::with`, since we need to recursively decode
1165
1157
// other ExpnIds
1166
- let ( mut expn_data, hash) = decode_data ( d, index) ?;
1158
+ let ( expn_data, hash) = decode_data ( krate, index) ;
1159
+ debug_assert_eq ! ( krate, expn_data. krate) ;
1160
+ debug_assert_eq ! ( expn_data. orig_id, Some ( index) ) ;
1167
1161
1168
1162
let expn_id = HygieneData :: with ( |hygiene_data| {
1169
1163
if let Some ( & expn_id) = hygiene_data. expn_hash_to_expn_id . get ( & hash) {
1170
1164
return expn_id;
1171
1165
}
1172
1166
1173
1167
let expn_id = ExpnId ( hygiene_data. expn_data . len ( ) as u32 ) ;
1174
-
1175
- // If we just deserialized an `ExpnData` owned by
1176
- // the local crate, its `orig_id` will be stale,
1177
- // so we need to update it to its own value.
1178
- // This only happens when we deserialize the incremental cache,
1179
- // since a crate will never decode its own metadata.
1180
- if expn_data. krate == LOCAL_CRATE {
1181
- expn_data. orig_id = Some ( expn_id. 0 ) ;
1182
- }
1183
-
1184
1168
hygiene_data. expn_data . push ( Some ( expn_data) ) ;
1185
1169
hygiene_data. expn_hashes . push ( hash) ;
1186
1170
let _old_id = hygiene_data. expn_hash_to_expn_id . insert ( hash, expn_id) ;
1187
1171
debug_assert ! ( _old_id. is_none( ) ) ;
1188
1172
1189
- let mut expns = outer_expns. lock ( ) ;
1190
- let new_len = index as usize + 1 ;
1191
- if expns. len ( ) < new_len {
1192
- expns. resize ( new_len, None ) ;
1193
- }
1194
- expns[ index as usize ] = Some ( expn_id) ;
1195
- drop ( expns) ;
1196
1173
expn_id
1197
1174
} ) ;
1175
+
1198
1176
Ok ( expn_id)
1199
1177
}
1200
1178
0 commit comments