diff options
-rw-r--r-- | src/hir/deserialise.cpp | 6 | ||||
-rw-r--r-- | src/hir/from_ast.cpp | 16 | ||||
-rw-r--r-- | src/hir/hir.hpp | 13 | ||||
-rw-r--r-- | src/hir/hir_ops.cpp | 6 | ||||
-rw-r--r-- | src/hir/visitor.cpp | 6 | ||||
-rw-r--r-- | src/hir_conv/resolve_ufcs_outer.cpp | 4 | ||||
-rw-r--r-- | src/hir_expand/closures.cpp | 10 | ||||
-rw-r--r-- | src/trans/auto_impls.cpp | 11 | ||||
-rw-r--r-- | src/trans/enumerate.cpp | 12 |
9 files changed, 43 insertions, 41 deletions
diff --git a/src/hir/deserialise.cpp b/src/hir/deserialise.cpp index f2794f29..9a353986 100644 --- a/src/hir/deserialise.cpp +++ b/src/hir/deserialise.cpp @@ -842,9 +842,9 @@ template<typename T> DEF_D( ::HIR::Crate::ImplGroup<T>, ::HIR::Crate::ImplGroup<T> rv; - rv.named = d.deserialise_pathmap< ::std::vector<T>>(); - rv.non_named = d.deserialise_vec<T>(); - rv.generic = d.deserialise_vec<T>(); + rv.named = d.deserialise_pathmap< ::std::vector<::std::unique_ptr<T> > >(); + rv.non_named = d.deserialise_vec< ::std::unique_ptr<T> >(); + rv.generic = d.deserialise_vec< ::std::unique_ptr<T> >(); return rv; ) template<> DEF_D( ::HIR::ExternLibrary, return d.deserialise_extlib(); ) diff --git a/src/hir/from_ast.cpp b/src/hir/from_ast.cpp index 0ad59d56..3976aa9d 100644 --- a/src/hir/from_ast.cpp +++ b/src/hir/from_ast.cpp @@ -1677,7 +1677,7 @@ void LowerHIR_Module_Impls(const ::AST::Module& ast_mod, ::HIR::Crate& hir_crat } // Sorted later on - hir_crate.m_trait_impls[mv$(trait_name)].generic.push_back( ::HIR::TraitImpl { + hir_crate.m_trait_impls[mv$(trait_name)].generic.push_back(box$(::HIR::TraitImpl { mv$(params), mv$(trait_args), mv$(type), @@ -1688,7 +1688,7 @@ void LowerHIR_Module_Impls(const ::AST::Module& ast_mod, ::HIR::Crate& hir_crat mv$(types), LowerHIR_SimplePath(Span(), ast_mod.path()) - } ); + })); } else if( impl.def().type().m_data.is_None() ) { @@ -1697,14 +1697,14 @@ void LowerHIR_Module_Impls(const ::AST::Module& ast_mod, ::HIR::Crate& hir_crat else { auto type = LowerHIR_Type(impl.def().type()); - hir_crate.m_marker_impls[mv$(trait_name)].generic.push_back(::HIR::MarkerImpl { + hir_crate.m_marker_impls[mv$(trait_name)].generic.push_back(box$(::HIR::MarkerImpl { mv$(params), mv$(trait_args), true, mv$(type), LowerHIR_SimplePath(Span(), ast_mod.path()) - } ); + })); } } else @@ -1751,14 +1751,14 @@ void LowerHIR_Module_Impls(const ::AST::Module& ast_mod, ::HIR::Crate& hir_crat } // Sorted later on - hir_crate.m_type_impls.generic.push_back( ::HIR::TypeImpl { + hir_crate.m_type_impls.generic.push_back( box$(::HIR::TypeImpl { mv$(params), mv$(type), mv$(methods), mv$(constants), LowerHIR_SimplePath(Span(), ast_mod.path()) - } ); + }) ); } } for( const auto& i : ast_mod.items() ) @@ -1773,14 +1773,14 @@ void LowerHIR_Module_Impls(const ::AST::Module& ast_mod, ::HIR::Crate& hir_crat auto trait_args = mv$(trait.m_params); // Sorting done later - hir_crate.m_marker_impls[mv$(trait_name)].generic.push_back(::HIR::MarkerImpl { + hir_crate.m_marker_impls[mv$(trait_name)].generic.push_back(box$(::HIR::MarkerImpl { mv$(params), mv$(trait_args), false, mv$(type), LowerHIR_SimplePath(Span(), ast_mod.path()) - } ); + }) ); } } diff --git a/src/hir/hir.hpp b/src/hir/hir.hpp index 2169c0c3..35373b51 100644 --- a/src/hir/hir.hpp +++ b/src/hir/hir.hpp @@ -530,12 +530,13 @@ public: template<typename T> struct ImplGroup { - ::std::map<::HIR::SimplePath, ::std::vector<T>> named; - ::std::vector<T> non_named; // TODO: use a map of HIR::TypeRef::Data::Tag - ::std::vector<T> generic; + typedef ::std::vector<::std::unique_ptr<T>> list_t; + ::std::map<::HIR::SimplePath, list_t> named; + list_t non_named; // TODO: use a map of HIR::TypeRef::Data::Tag + list_t generic; - const ::std::vector<T>* get_list_for_type(const ::HIR::TypeRef& ty) const { - static ::std::vector<T> empty; + const list_t* get_list_for_type(const ::HIR::TypeRef& ty) const { + static list_t empty; if( const auto* p = ty.get_sort_path() ) { auto it = named.find(*p); if( it != named.end() ) @@ -548,7 +549,7 @@ public: return &non_named; } } - ::std::vector<T>& get_list_for_type_mut(const ::HIR::TypeRef& ty) { + list_t& get_list_for_type_mut(const ::HIR::TypeRef& ty) { if( const auto* p = ty.get_sort_path() ) { return named[*p]; } diff --git a/src/hir/hir_ops.cpp b/src/hir/hir_ops.cpp index d9b1fb07..a548b725 100644 --- a/src/hir/hir_ops.cpp +++ b/src/hir/hir_ops.cpp @@ -938,13 +938,13 @@ bool ::HIR::TraitImpl::overlaps_with(const Crate& crate, const ::HIR::TraitImpl& namespace { template<typename ImplType> - bool find_impls_list(const ::std::vector<ImplType>& impl_list, const ::HIR::TypeRef& type, ::HIR::t_cb_resolve_type ty_res, ::std::function<bool(const ImplType&)> callback) + bool find_impls_list(const typename ::HIR::Crate::ImplGroup<ImplType>::list_t& impl_list, const ::HIR::TypeRef& type, ::HIR::t_cb_resolve_type ty_res, ::std::function<bool(const ImplType&)> callback) { for(const auto& impl : impl_list) { - if( impl.matches_type(type, ty_res) ) + if( impl->matches_type(type, ty_res) ) { - if( callback(impl) ) + if( callback(*impl) ) { return true; } diff --git a/src/hir/visitor.cpp b/src/hir/visitor.cpp index 1cc54090..664d34ad 100644 --- a/src/hir/visitor.cpp +++ b/src/hir/visitor.cpp @@ -19,16 +19,16 @@ namespace { { for( auto& impl : impl_group.second ) { - cb(impl); + cb(*impl); } } for( auto& impl : g.non_named ) { - cb(impl); + cb(*impl); } for( auto& impl : g.generic ) { - cb(impl); + cb(*impl); } } } diff --git a/src/hir_conv/resolve_ufcs_outer.cpp b/src/hir_conv/resolve_ufcs_outer.cpp index 1f245a0d..4e90f4f2 100644 --- a/src/hir_conv/resolve_ufcs_outer.cpp +++ b/src/hir_conv/resolve_ufcs_outer.cpp @@ -343,8 +343,8 @@ namespace { template<typename T> void sort_impl_group(::HIR::Crate::ImplGroup<T>& ig) { - auto new_end = ::std::remove_if(ig.generic.begin(), ig.generic.end(), [&ig](T& ty_impl) { - const auto& type = ty_impl.m_type; // Using field accesses in templates feels so dirty + auto new_end = ::std::remove_if(ig.generic.begin(), ig.generic.end(), [&ig](::std::unique_ptr<T>& ty_impl) { + const auto& type = ty_impl->m_type; // Using field accesses in templates feels so dirty const ::HIR::SimplePath* path = type.get_sort_path(); if( path ) diff --git a/src/hir_expand/closures.cpp b/src/hir_expand/closures.cpp index f09917de..0d6efd4c 100644 --- a/src/hir_expand/closures.cpp +++ b/src/hir_expand/closures.cpp @@ -50,7 +50,7 @@ namespace { { for(auto& impl : new_trait_impls) { - ::std::vector<::HIR::TraitImpl>* trait_impl_list; + ::HIR::Crate::ImplGroup<::HIR::TraitImpl>::list_t* trait_impl_list; switch(impl.first) { case ::HIR::ExprNode_Closure::Class::Once: @@ -61,7 +61,7 @@ namespace { if(0) case ::HIR::ExprNode_Closure::Class::Shared: trait_impl_list = &crate.m_trait_impls[crate.get_lang_item_path(sp, "fn" )].get_list_for_type_mut(impl.second.m_type); - trait_impl_list->push_back( mv$(impl.second) ); + trait_impl_list->push_back( box$(impl.second) ); break; case ::HIR::ExprNode_Closure::Class::NoCapture: { assert(impl.second.m_methods.size() == 1); @@ -70,8 +70,8 @@ namespace { // NOTE: This should always have a name const auto& path = impl.second.m_type.m_data.as_Path().path.m_data.as_Generic().m_path; DEBUG("Adding type impl " << path); - auto list_it = crate.m_type_impls.named.insert( ::std::make_pair(path, ::std::vector<::HIR::TypeImpl>()) ).first; - list_it->second.push_back( ::HIR::TypeImpl { + auto* list_it = &crate.m_type_impls.named[path]; + list_it->push_back(box$(::HIR::TypeImpl { mv$(impl.second.m_params), mv$(impl.second.m_type), make_map1( @@ -80,7 +80,7 @@ namespace { ), {}, mv$(impl.second.m_src_module) - } ); + })); } break; case ::HIR::ExprNode_Closure::Class::Unknown: BUG(Span(), "Encountered Unkown closure type in new impls"); diff --git a/src/trans/auto_impls.cpp b/src/trans/auto_impls.cpp index f7f85b23..351c93e4 100644 --- a/src/trans/auto_impls.cpp +++ b/src/trans/auto_impls.cpp @@ -202,7 +202,8 @@ void Trans_AutoImpl_Clone(State& state, ::HIR::TypeRef ty) impl.m_methods.insert(::std::make_pair( RcString::new_interned("clone"), ::HIR::TraitImpl::ImplEnt< ::HIR::Function> { false, ::std::move(fcn) } )); // Add impl to the crate - state.crate.m_trait_impls[state.lang_Clone].get_list_for_type_mut(impl.m_type).push_back( ::std::move(impl) ); + auto& list = state.crate.m_trait_impls[state.lang_Clone].get_list_for_type_mut(impl.m_type); + list.push_back( box$(impl) ); } void Trans_AutoImpls(::HIR::Crate& crate, TransList& trans_list) @@ -238,10 +239,10 @@ void Trans_AutoImpls(::HIR::Crate& crate, TransList& trans_list) auto e = trans_list.add_function(::std::move(p)); const auto* impl_list = impl_list_it->second.get_list_for_type(ty); - assert(impl_list); - auto it = ::std::find_if( impl_list->begin(), impl_list->end(), [&](const auto& i){ return i.m_type == ty; }); - assert( it->m_methods.size() == 1 ); - e->ptr = &it->m_methods.begin()->second.data; + ASSERT_BUG(Span(), impl_list, "No impl list of Clone for " << ty); + auto& impl = **::std::find_if( impl_list->begin(), impl_list->end(), [&](const auto& i){ return i->m_type == ty; }); + assert( impl.m_methods.size() == 1 ); + e->ptr = &impl.m_methods.begin()->second.data; } } diff --git a/src/trans/enumerate.cpp b/src/trans/enumerate.cpp index 91b00084..d8426022 100644 --- a/src/trans/enumerate.cpp +++ b/src/trans/enumerate.cpp @@ -256,16 +256,16 @@ TransList Trans_Enumerate_Public(::HIR::Crate& crate) { for(auto& impl : impl_list.second) { - Trans_Enumerate_Public_TraitImpl(state, resolve, trait_path, impl); + Trans_Enumerate_Public_TraitImpl(state, resolve, trait_path, *impl); } } for(auto& impl : impl_group.second.non_named) { - Trans_Enumerate_Public_TraitImpl(state, resolve, trait_path, impl); + Trans_Enumerate_Public_TraitImpl(state, resolve, trait_path, *impl); } for(auto& impl : impl_group.second.generic) { - Trans_Enumerate_Public_TraitImpl(state, resolve, trait_path, impl); + Trans_Enumerate_Public_TraitImpl(state, resolve, trait_path, *impl); } } struct H1 @@ -302,16 +302,16 @@ TransList Trans_Enumerate_Public(::HIR::Crate& crate) { for(auto& impl : impl_grp.second) { - H1::enumerate_type_impl(state, impl); + H1::enumerate_type_impl(state, *impl); } } for(auto& impl : crate.m_type_impls.non_named) { - H1::enumerate_type_impl(state, impl); + H1::enumerate_type_impl(state, *impl); } for(auto& impl : crate.m_type_impls.generic) { - H1::enumerate_type_impl(state, impl); + H1::enumerate_type_impl(state, *impl); } auto rv = Trans_Enumerate_CommonPost(state); |