Skip to content

Commit 20b9682

Browse files
committed
Reserve extra capacity upfront in more places
1 parent 16c7172 commit 20b9682

File tree

6 files changed

+32
-1
lines changed

6 files changed

+32
-1
lines changed

fathom/src/core/binary.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ impl<'arena, 'data> Context<'arena, 'data> {
285285
}
286286

287287
pub fn add_module(&mut self, module: &Module<'arena>) {
288+
self.item_exprs.reserve(module.items.len());
288289
for item in module.items {
289290
match item {
290291
Item::Def { expr, .. } => {

fathom/src/core/semantics.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1016,6 +1016,7 @@ impl<'arena, 'env> EvalEnv<'arena, 'env> {
10161016
scope: &'out_arena Scope<'out_arena>,
10171017
terms: &[Term<'arena>],
10181018
) -> &'out_arena [Term<'out_arena>] {
1019+
self.local_exprs.reserve(terms.len());
10191020
let initial_locals = self.local_exprs.len();
10201021

10211022
let terms = scope.to_scope_from_iter(terms.iter().map(|term| {

fathom/src/env.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,10 @@ impl<Entry> UniqueEnv<Entry> {
198198
pub fn truncate(&mut self, len: EnvLen) {
199199
self.entries.truncate(len.0 as usize);
200200
}
201+
202+
pub fn reserve(&mut self, additional: usize) {
203+
self.entries.reserve(additional);
204+
}
201205
}
202206

203207
impl<Entry> std::ops::Deref for UniqueEnv<Entry> {
@@ -340,6 +344,10 @@ impl<Entry> SharedEnv<Entry> {
340344
pub fn iter(&self) -> impl DoubleEndedIterator<Item = &Entry> {
341345
self.entries.iter()
342346
}
347+
348+
pub fn reserve(&mut self, _additional: usize) {
349+
// FIXME: `rpds::VectorSync<Entry>` has no method to reserve extra space
350+
}
343351
}
344352

345353
impl<Entry: fmt::Debug> fmt::Debug for SharedEnv<Entry> {

fathom/src/surface/distillation.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ impl<'interner, 'arena, 'env> Context<'interner, 'arena, 'env> {
205205
labels: &[StringId],
206206
exprs: &[core::Term<'_>],
207207
) -> Term<'arena, ()> {
208+
self.local_names.reserve(labels.len());
208209
let initial_local_len = self.local_len();
209210
let exprs = (self.scope).to_scope_from_iter(
210211
Iterator::zip(labels.iter(), exprs.iter()).map(|(label, expr)| {
@@ -542,6 +543,7 @@ impl<'interner, 'arena, 'env> Context<'interner, 'arena, 'env> {
542543
self.check_dependent_tuple(labels, formats)
543544
}
544545
core::Term::RecordType(_span, labels, types) => {
546+
self.local_names.reserve(labels.len());
545547
let initial_local_len = self.local_len();
546548
let type_fields = (self.scope).to_scope_from_iter(
547549
Iterator::zip(labels.iter(), types.iter()).map(|(label, r#type)| {
@@ -718,6 +720,7 @@ impl<'interner, 'arena, 'env> Context<'interner, 'arena, 'env> {
718720
) -> &'arena [FormatField<'arena, ()>] {
719721
use crate::core::Prim::FormatSucceed;
720722

723+
self.local_names.reserve(labels.len());
721724
let initial_local_len = self.local_len();
722725
let core_fields = Iterator::zip(labels.iter().copied(), core_formats.iter());
723726
let format_fields =

fathom/src/surface/elaboration.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

fathom/src/surface/elaboration/reporting.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ impl Message {
203203
type_labels,
204204
} => {
205205
let interner = interner.borrow();
206-
let mut diagnostic_labels = Vec::new();
206+
let mut diagnostic_labels = Vec::with_capacity(expr_labels.len());
207207
{
208208
let mut type_labels = type_labels.iter().peekable();
209209

0 commit comments

Comments
 (0)