@@ -80,8 +80,6 @@ mod item;
8080mod pat;
8181mod path;
8282
83- const HIR_ID_COUNTER_LOCKED : u32 = 0xFFFFFFFF ;
84-
8583rustc_hir:: arena_types!( rustc_arena:: declare_arena, ' tcx) ;
8684
8785struct LoweringContext < ' a , ' hir : ' a > {
@@ -151,7 +149,7 @@ struct LoweringContext<'a, 'hir: 'a> {
151149 in_scope_lifetimes : Vec < ParamName > ,
152150
153151 current_hir_id_owner : ( LocalDefId , u32 ) ,
154- item_local_id_counters : NodeMap < u32 > ,
152+ item_local_id_counters : IndexVec < LocalDefId , u32 > ,
155153 node_id_to_hir_id : IndexVec < NodeId , Option < hir:: HirId > > ,
156154
157155 allow_try_trait : Option < Lrc < [ Symbol ] > > ,
@@ -488,52 +486,41 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
488486 id
489487 }
490488
491- fn allocate_hir_id_counter ( & mut self , owner : NodeId ) -> LocalDefId {
492- // Set up the counter if needed.
493- self . item_local_id_counters . entry ( owner) . or_insert ( 0 ) ;
494- // Always allocate the first `HirId` for the owner itself.
495- let lowered = self . lower_node_id_with_owner ( owner, owner) ;
496- debug_assert_eq ! ( lowered. local_id. as_u32( ) , 0 ) ;
497- lowered. owner
498- }
499-
500489 fn create_stable_hashing_context ( & self ) -> LoweringHasher < ' _ > {
501490 LoweringHasher {
502491 source_map : CachingSourceMapView :: new ( self . sess . source_map ( ) ) ,
503492 resolver : self . resolver ,
504493 }
505494 }
506495
507- fn lower_node_id_generic (
508- & mut self ,
509- ast_node_id : NodeId ,
510- alloc_hir_id : impl FnOnce ( & mut Self ) -> hir:: HirId ,
511- ) -> hir:: HirId {
512- assert_ne ! ( ast_node_id, DUMMY_NODE_ID ) ;
513-
514- let min_size = ast_node_id. as_usize ( ) + 1 ;
515-
516- if min_size > self . node_id_to_hir_id . len ( ) {
517- self . node_id_to_hir_id . resize ( min_size, None ) ;
518- }
496+ fn allocate_hir_id_counter ( & mut self , owner : NodeId ) -> LocalDefId {
497+ // Set up the counter if needed.
498+ let def_id = self . resolver . local_def_id ( owner) ;
519499
520- if let Some ( existing_hir_id) = self . node_id_to_hir_id [ ast_node_id] {
521- existing_hir_id
500+ // Always allocate the first `HirId` for the owner itself.
501+ self . node_id_to_hir_id . ensure_contains_elem ( owner, || None ) ;
502+ if let Some ( _lowered) = self . node_id_to_hir_id [ owner] {
503+ debug_assert_eq ! ( _lowered. owner, def_id) ;
504+ debug_assert_eq ! ( _lowered. local_id. as_u32( ) , 0 ) ;
522505 } else {
523- // Generate a new `HirId`.
524- let hir_id = alloc_hir_id ( self ) ;
525- self . node_id_to_hir_id [ ast_node_id ] = Some ( hir_id ) ;
506+ self . item_local_id_counters . ensure_contains_elem ( def_id , || 0 ) ;
507+ let local_id_counter = & mut self . item_local_id_counters [ def_id ] ;
508+ let local_id = * local_id_counter ;
526509
527- hir_id
510+ // We want to be sure not to modify the counter in the map while it
511+ // is also on the stack. Otherwise we'll get lost updates when writing
512+ // back from the stack to the map.
513+ debug_assert_eq ! ( local_id, 0 ) ;
514+
515+ * local_id_counter += 1 ;
516+ self . node_id_to_hir_id [ owner] = Some ( hir:: HirId :: make_owner ( def_id) ) ;
528517 }
518+ def_id
529519 }
530520
531521 fn with_hir_id_owner < T > ( & mut self , owner : NodeId , f : impl FnOnce ( & mut Self ) -> T ) -> T {
532- let counter = self
533- . item_local_id_counters
534- . insert ( owner, HIR_ID_COUNTER_LOCKED )
535- . unwrap_or_else ( || panic ! ( "no `item_local_id_counters` entry for {:?}" , owner) ) ;
536522 let def_id = self . resolver . local_def_id ( owner) ;
523+ let counter = self . item_local_id_counters [ def_id] ;
537524 let old_owner = std:: mem:: replace ( & mut self . current_hir_id_owner , ( def_id, counter) ) ;
538525 let ret = f ( self ) ;
539526 let ( new_def_id, new_counter) =
@@ -542,8 +529,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
542529 debug_assert ! ( def_id == new_def_id) ;
543530 debug_assert ! ( new_counter >= counter) ;
544531
545- let prev = self . item_local_id_counters . insert ( owner, new_counter) . unwrap ( ) ;
546- debug_assert ! ( prev == HIR_ID_COUNTER_LOCKED ) ;
532+ self . item_local_id_counters [ def_id] = new_counter;
547533 ret
548534 }
549535
@@ -554,35 +540,20 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
554540 /// `HirIdValidator` later on, which makes sure that all `NodeId`s got mapped
555541 /// properly. Calling the method twice with the same `NodeId` is fine though.
556542 fn lower_node_id ( & mut self , ast_node_id : NodeId ) -> hir:: HirId {
557- self . lower_node_id_generic ( ast_node_id, |this| {
558- let & mut ( owner, ref mut local_id_counter) = & mut this. current_hir_id_owner ;
559- let local_id = * local_id_counter;
560- * local_id_counter += 1 ;
561- hir:: HirId { owner, local_id : hir:: ItemLocalId :: from_u32 ( local_id) }
562- } )
563- }
543+ assert_ne ! ( ast_node_id, DUMMY_NODE_ID ) ;
564544
565- fn lower_node_id_with_owner ( & mut self , ast_node_id : NodeId , owner : NodeId ) -> hir :: HirId {
566- self . lower_node_id_generic ( ast_node_id, |this| {
567- let local_id_counter = this
568- . item_local_id_counters
569- . get_mut ( & owner )
570- . expect ( "called `lower_node_id_with_owner` before `allocate_hir_id_counter`" ) ;
545+ self . node_id_to_hir_id . ensure_contains_elem ( ast_node_id , || None ) ;
546+ if let Some ( existing_hir_id ) = self . node_id_to_hir_id [ ast_node_id] {
547+ existing_hir_id
548+ } else {
549+ // Generate a new `HirId`.
550+ let & mut ( owner , ref mut local_id_counter ) = & mut self . current_hir_id_owner ;
571551 let local_id = * local_id_counter;
572-
573- // We want to be sure not to modify the counter in the map while it
574- // is also on the stack. Otherwise we'll get lost updates when writing
575- // back from the stack to the map.
576- debug_assert ! ( local_id != HIR_ID_COUNTER_LOCKED ) ;
577-
578552 * local_id_counter += 1 ;
579- let owner = this. resolver . opt_local_def_id ( owner) . expect (
580- "you forgot to call `create_def` or are lowering node-IDs \
581- that do not belong to the current owner",
582- ) ;
583-
584- hir:: HirId { owner, local_id : hir:: ItemLocalId :: from_u32 ( local_id) }
585- } )
553+ let hir_id = hir:: HirId { owner, local_id : hir:: ItemLocalId :: from_u32 ( local_id) } ;
554+ self . node_id_to_hir_id [ ast_node_id] = Some ( hir_id) ;
555+ hir_id
556+ }
586557 }
587558
588559 fn next_id ( & mut self ) -> hir:: HirId {
@@ -592,7 +563,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
592563
593564 fn lower_res ( & mut self , res : Res < NodeId > ) -> Res {
594565 res. map_id ( |id| {
595- self . lower_node_id_generic ( id, |_ | {
566+ self . node_id_to_hir_id . get ( id) . copied ( ) . flatten ( ) . unwrap_or_else ( | | {
596567 panic ! ( "expected `NodeId` to be lowered already for res {:#?}" , res) ;
597568 } )
598569 } )
0 commit comments