@@ -153,14 +153,25 @@ impl LocalExpnId {
153
153
}
154
154
155
155
pub fn fresh_empty ( ) -> LocalExpnId {
156
- HygieneData :: with ( |data| data. fresh_expn ( None ) )
156
+ HygieneData :: with ( |data| {
157
+ let expn_id = data. local_expn_data . push ( None ) ;
158
+ let _eid = data. local_expn_hashes . push ( ExpnHash ( Fingerprint :: ZERO ) ) ;
159
+ debug_assert_eq ! ( expn_id, _eid) ;
160
+ expn_id
161
+ } )
157
162
}
158
163
159
- pub fn fresh ( expn_data : ExpnData , ctx : impl HashStableContext ) -> LocalExpnId {
164
+ pub fn fresh ( mut expn_data : ExpnData , ctx : impl HashStableContext ) -> LocalExpnId {
160
165
debug_assert_eq ! ( expn_data. parent. krate, LOCAL_CRATE ) ;
161
- let expn_id = HygieneData :: with ( |data| data. fresh_expn ( Some ( expn_data) ) ) ;
162
- update_disambiguator ( expn_id, ctx) ;
163
- expn_id
166
+ let expn_hash = update_disambiguator ( & mut expn_data, ctx) ;
167
+ HygieneData :: with ( |data| {
168
+ let expn_id = data. local_expn_data . push ( Some ( expn_data) ) ;
169
+ let _eid = data. local_expn_hashes . push ( expn_hash) ;
170
+ debug_assert_eq ! ( expn_id, _eid) ;
171
+ let _old_id = data. expn_hash_to_expn_id . insert ( expn_hash, expn_id. to_expn_id ( ) ) ;
172
+ debug_assert ! ( _old_id. is_none( ) ) ;
173
+ expn_id
174
+ } )
164
175
}
165
176
166
177
#[ inline]
@@ -179,14 +190,18 @@ impl LocalExpnId {
179
190
}
180
191
181
192
#[ inline]
182
- pub fn set_expn_data ( self , expn_data : ExpnData , ctx : impl HashStableContext ) {
193
+ pub fn set_expn_data ( self , mut expn_data : ExpnData , ctx : impl HashStableContext ) {
183
194
debug_assert_eq ! ( expn_data. parent. krate, LOCAL_CRATE ) ;
195
+ let expn_hash = update_disambiguator ( & mut expn_data, ctx) ;
184
196
HygieneData :: with ( |data| {
185
197
let old_expn_data = & mut data. local_expn_data [ self ] ;
186
198
assert ! ( old_expn_data. is_none( ) , "expansion data is reset for an expansion ID" ) ;
187
199
* old_expn_data = Some ( expn_data) ;
200
+ debug_assert_eq ! ( data. local_expn_hashes[ self ] . 0 , Fingerprint :: ZERO ) ;
201
+ data. local_expn_hashes [ self ] = expn_hash;
202
+ let _old_id = data. expn_hash_to_expn_id . insert ( expn_hash, self . to_expn_id ( ) ) ;
203
+ debug_assert ! ( _old_id. is_none( ) ) ;
188
204
} ) ;
189
- update_disambiguator ( self , ctx)
190
205
}
191
206
192
207
#[ inline]
@@ -335,13 +350,6 @@ impl HygieneData {
335
350
with_session_globals ( |session_globals| f ( & mut * session_globals. hygiene_data . borrow_mut ( ) ) )
336
351
}
337
352
338
- fn fresh_expn ( & mut self , expn_data : Option < ExpnData > ) -> LocalExpnId {
339
- let expn_id = self . local_expn_data . push ( expn_data) ;
340
- let _eid = self . local_expn_hashes . push ( ExpnHash ( Fingerprint :: ZERO ) ) ;
341
- debug_assert_eq ! ( expn_id, _eid) ;
342
- expn_id
343
- }
344
-
345
353
#[ inline]
346
354
fn local_expn_hash ( & self , expn_id : LocalExpnId ) -> ExpnHash {
347
355
self . local_expn_hashes [ expn_id]
@@ -1413,8 +1421,7 @@ impl<D: Decoder> Decodable<D> for SyntaxContext {
1413
1421
/// `set_expn_data`). It is *not* called for foreign `ExpnId`s deserialized
1414
1422
/// from another crate's metadata - since `ExpnHash` includes the stable crate id,
1415
1423
/// collisions are only possible between `ExpnId`s within the same crate.
1416
- fn update_disambiguator ( expn_id : LocalExpnId , mut ctx : impl HashStableContext ) {
1417
- let mut expn_data = expn_id. expn_data ( ) ;
1424
+ fn update_disambiguator ( expn_data : & mut ExpnData , mut ctx : impl HashStableContext ) -> ExpnHash {
1418
1425
// This disambiguator should not have been set yet.
1419
1426
assert_eq ! (
1420
1427
expn_data. disambiguator, 0 ,
@@ -1433,8 +1440,7 @@ fn update_disambiguator(expn_id: LocalExpnId, mut ctx: impl HashStableContext) {
1433
1440
} ) ;
1434
1441
1435
1442
if disambiguator != 0 {
1436
- debug ! ( "Set disambiguator for {:?} (hash {:?})" , expn_id, expn_hash) ;
1437
- debug ! ( "expn_data = {:?}" , expn_data) ;
1443
+ debug ! ( "Set disambiguator for expn_data={:?} expn_hash={:?}" , expn_data, expn_hash) ;
1438
1444
1439
1445
expn_data. disambiguator = disambiguator;
1440
1446
expn_hash = expn_data. hash_expn ( & mut ctx) ;
@@ -1450,15 +1456,7 @@ fn update_disambiguator(expn_id: LocalExpnId, mut ctx: impl HashStableContext) {
1450
1456
} ) ;
1451
1457
}
1452
1458
1453
- let expn_hash =
1454
- ExpnHash :: new ( ctx. def_path_hash ( LOCAL_CRATE . as_def_id ( ) ) . stable_crate_id ( ) , expn_hash) ;
1455
- HygieneData :: with ( |data| {
1456
- data. local_expn_data [ expn_id] . as_mut ( ) . unwrap ( ) . disambiguator = disambiguator;
1457
- debug_assert_eq ! ( data. local_expn_hashes[ expn_id] . 0 , Fingerprint :: ZERO ) ;
1458
- data. local_expn_hashes [ expn_id] = expn_hash;
1459
- let _old_id = data. expn_hash_to_expn_id . insert ( expn_hash, expn_id. to_expn_id ( ) ) ;
1460
- debug_assert ! ( _old_id. is_none( ) ) ;
1461
- } ) ;
1459
+ ExpnHash :: new ( ctx. def_path_hash ( LOCAL_CRATE . as_def_id ( ) ) . stable_crate_id ( ) , expn_hash)
1462
1460
}
1463
1461
1464
1462
impl < CTX : HashStableContext > HashStable < CTX > for SyntaxContext {
0 commit comments