@@ -67,6 +67,12 @@ impl<'arena> ItemEnv<'arena> {
6767 self . types . push ( r#type) ;
6868 self . exprs . push ( expr) ;
6969 }
70+
71+ fn reserve ( & mut self , additional : usize ) {
72+ self . names . reserve ( additional) ;
73+ self . types . reserve ( additional) ;
74+ self . exprs . reserve ( additional) ;
75+ }
7076}
7177
7278/// Local variable environment.
@@ -110,6 +116,13 @@ impl<'arena> LocalEnv<'arena> {
110116 self . names . len ( )
111117 }
112118
119+ fn reserve ( & mut self , additional : usize ) {
120+ self . names . reserve ( additional) ;
121+ self . types . reserve ( additional) ;
122+ self . infos . reserve ( additional) ;
123+ self . exprs . reserve ( additional) ;
124+ }
125+
113126 /// Push a local definition onto the context.
114127 fn push_def (
115128 & mut self ,
@@ -595,6 +608,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
595608 ) -> core:: Module < ' out_arena > {
596609 let elab_order = order:: elaboration_order ( self , surface_module) ;
597610 let mut items = Vec :: with_capacity ( surface_module. items . len ( ) ) ;
611+ self . item_env . reserve ( surface_module. items . len ( ) ) ;
598612
599613 for item in elab_order. iter ( ) . copied ( ) . map ( |i| & surface_module. items [ i] ) {
600614 match item {
@@ -981,6 +995,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
981995 core:: Term :: RecordLit ( range. into ( ) , labels, exprs. into ( ) )
982996 }
983997 ( Term :: Tuple ( range, elem_exprs) , Value :: Universe ) => {
998+ self . local_env . reserve ( elem_exprs. len ( ) ) ;
984999 let mut interner = self . interner . borrow_mut ( ) ;
9851000 let labels = interner. get_tuple_labels ( 0 ..elem_exprs. len ( ) ) ;
9861001 let labels = self . scope . to_scope_from_iter ( labels. iter ( ) . copied ( ) ) ;
@@ -1003,6 +1018,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
10031018 ( Term :: Tuple ( range, elem_exprs) , Value :: Stuck ( Head :: Prim ( Prim :: FormatType ) , args) )
10041019 if args. is_empty ( ) =>
10051020 {
1021+ self . local_env . reserve ( elem_exprs. len ( ) ) ;
10061022 let mut interner = self . interner . borrow_mut ( ) ;
10071023 let labels = interner. get_tuple_labels ( 0 ..elem_exprs. len ( ) ) ;
10081024 let labels = self . scope . to_scope_from_iter ( labels. iter ( ) . copied ( ) ) ;
@@ -1310,6 +1326,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
13101326 ( fun_type, self . universe . clone ( ) )
13111327 }
13121328 Term :: FunType ( range, patterns, body_type) => {
1329+ self . local_env . reserve ( patterns. len ( ) ) ;
13131330 let initial_local_len = self . local_env . len ( ) ;
13141331
13151332 // Elaborate the parameters, collecting them in a stack
@@ -1615,6 +1632,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
16151632 body_expr : & Term < ' _ , ByteRange > ,
16161633 body_type : Option < & Term < ' _ , ByteRange > > ,
16171634 ) -> ( core:: Term < ' arena > , ArcValue < ' arena > ) {
1635+ self . local_env . reserve ( patterns. len ( ) ) ;
16181636 let initial_local_len = self . local_env . len ( ) ;
16191637
16201638 // Elaborate the parameters, collecting them into a stack
0 commit comments