summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/hir/deserialise.cpp6
-rw-r--r--src/hir/from_ast.cpp16
-rw-r--r--src/hir/hir.hpp13
-rw-r--r--src/hir/hir_ops.cpp6
-rw-r--r--src/hir/visitor.cpp6
-rw-r--r--src/hir_conv/resolve_ufcs_outer.cpp4
-rw-r--r--src/hir_expand/closures.cpp10
-rw-r--r--src/trans/auto_impls.cpp11
-rw-r--r--src/trans/enumerate.cpp12
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);