From db8e135a055c0f71fd80e2533430a4c9304ffd56 Mon Sep 17 00:00:00 2001 From: Ayaz Hafiz Date: Mon, 7 Nov 2022 15:31:00 -0600 Subject: [PATCH] Simplify AbilitySet storage --- crates/compiler/solve/src/solve.rs | 18 +++++++----------- crates/compiler/types/src/types.rs | 18 +++++++++++++----- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/crates/compiler/solve/src/solve.rs b/crates/compiler/solve/src/solve.rs index 6dfb56239f..b42ee50e38 100644 --- a/crates/compiler/solve/src/solve.rs +++ b/crates/compiler/solve/src/solve.rs @@ -2819,7 +2819,7 @@ fn type_to_variable<'a>( let lambda_set_vars_offset = type_arguments_offset + type_arguments.len(); let infer_ext_vars_offset = lambda_set_vars_offset + lambda_set_variables.len(); - for (((target_index, arg_type), arg_region), opt_ability) in + for (((target_index, arg_type), arg_region), abilities) in (new_variables.indices().skip(type_arguments_offset)) .zip(type_arguments.into_iter()) .zip(type_argument_regions.into_iter()) @@ -2827,9 +2827,9 @@ fn type_to_variable<'a>( { let copy_var = helper!(arg_type); subs.variables[target_index] = copy_var; - if types[opt_ability].is_some() { + if !types[abilities].is_empty() { let arg_region = types[arg_region]; - bind_to_abilities.push((Loc::at(arg_region, copy_var), opt_ability)); + bind_to_abilities.push((Loc::at(arg_region, copy_var), abilities)); } } @@ -2917,7 +2917,7 @@ fn type_to_variable<'a>( let new_variables = VariableSubsSlice::reserve_into_subs(subs, all_vars_length); - for (((target_index, typ), region), opt_abilities) in + for (((target_index, typ), region), abilities) in (new_variables.indices().skip(type_arguments_offset)) .zip(type_arguments.into_iter()) .zip(type_argument_regions.into_iter()) @@ -2925,9 +2925,9 @@ fn type_to_variable<'a>( { let copy_var = helper!(typ); subs.variables[target_index] = copy_var; - if types[opt_abilities].is_some() { + if !types[abilities].is_empty() { let region = types[region]; - bind_to_abilities.push((Loc::at(region, copy_var), opt_abilities)); + bind_to_abilities.push((Loc::at(region, copy_var), abilities)); } } @@ -3063,11 +3063,7 @@ fn type_to_variable<'a>( } for (Loc { value: var, region }, abilities) in bind_to_abilities { - // TODO: SoA represent as Some>, not the other way - let abilities = types[abilities] - .as_ref() - .expect("should only have been added if it was Some"); - + let abilities = &types[abilities]; match *subs.get_content_unchecked(var) { Content::RigidVar(a) => { // TODO(multi-abilities): check run cache diff --git a/crates/compiler/types/src/types.rs b/crates/compiler/types/src/types.rs index dea2a0e16c..feff4e9c23 100644 --- a/crates/compiler/types/src/types.rs +++ b/crates/compiler/types/src/types.rs @@ -297,6 +297,10 @@ impl AbilitySet { pub fn into_sorted_iter(self) -> impl ExactSizeIterator { self.0.into_iter() } + + pub fn is_empty(&self) -> bool { + self.0.is_empty() + } } impl FromIterator for AbilitySet { @@ -363,7 +367,7 @@ impl std::ops::Neg for Polarity { pub struct AliasShared { pub symbol: Symbol, - pub type_argument_abilities: Slice>, + pub type_argument_abilities: Slice, pub type_argument_regions: Slice, pub lambda_set_variables: Slice, pub infer_ext_in_output_variables: Slice, @@ -468,7 +472,7 @@ pub struct Types { field_names: Vec, // aliases - type_arg_abilities: Vec>, // TODO: structural sharing for `AbilitySet`s themselves + type_arg_abilities: Vec, // TODO: structural sharing for `AbilitySet`s themselves aliases: Vec, // these tag types are relatively rare, and so we store them in a way that reduces space, at @@ -650,7 +654,9 @@ impl Types { let type_argument_abilities = Slice::extend_new( &mut self.type_arg_abilities, - type_arguments.iter().map(|a| a.opt_abilities.clone()), + type_arguments + .iter() + .map(|a| a.opt_abilities.as_ref().cloned().unwrap_or_default()), ); // TODO: populate correctly @@ -836,7 +842,9 @@ impl Types { let type_argument_abilities = Slice::extend_new( &mut self.type_arg_abilities, - type_arguments.iter().map(|a| a.value.opt_abilities.clone()), + type_arguments + .iter() + .map(|a| a.value.opt_abilities.as_ref().cloned().unwrap_or_default()), ); let alias_shared = AliasShared { @@ -987,7 +995,7 @@ macro_rules! impl_types_index_slice { impl_types_index! { tags, TypeTag aliases, AliasShared - type_arg_abilities, Option + type_arg_abilities, AbilitySet regions, Region tag_names, TagName field_types, RecordField<()>