From a27f2c4d866203cfbe22d87f9ae43f6d1cd37081 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sat, 31 Dec 2016 09:35:03 +0800 Subject: Trans - Efficiency cleanups --- src/trans/enumerate.cpp | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'src/trans/enumerate.cpp') diff --git a/src/trans/enumerate.cpp b/src/trans/enumerate.cpp index 1750e730..c6433b18 100644 --- a/src/trans/enumerate.cpp +++ b/src/trans/enumerate.cpp @@ -25,6 +25,7 @@ namespace { // Queue of items to enumerate ::std::deque fcn_queue; + ::std::vector fcns_to_type_visit; EnumState(const ::HIR::Crate& crate): crate(crate) @@ -34,6 +35,7 @@ namespace { { if(auto* e = rv.add_function(mv$(p))) { + fcns_to_type_visit.push_back(e); e->ptr = &fcn; e->pp = mv$(pp); fcn_queue.push_back(e); @@ -346,26 +348,30 @@ void Trans_Enumerate_Types(EnumState& state) bool constructors_added; do { - for(const auto& ent : state.rv.m_functions) + // Visit all functions that haven't been type-visited yet + for(unsigned int i = 0; i < state.fcns_to_type_visit.size(); i++) { - TRACE_FUNCTION_F("Enumerate fn " << ent.first); - assert(ent.second->ptr); - const auto& fcn = *ent.second->ptr; - const auto& pp = ent.second->pp; + auto p = state.fcns_to_type_visit[i]; + TRACE_FUNCTION_F("Function " << ::std::find_if(state.rv.m_functions.begin(), state.rv.m_functions.end(), [&](const auto&x){ return x.second.get() == p; })->first); + assert(p->ptr); + const auto& fcn = *p->ptr; + const auto& pp = p->pp; - tv.visit_type( pp.monomorph(state.crate, fcn.m_return) ); + tv.visit_type( pp.monomorph(tv.m_resolve, fcn.m_return) ); for(const auto& arg : fcn.m_args) - tv.visit_type( pp.monomorph(state.crate, arg.second) ); + tv.visit_type( pp.monomorph(tv.m_resolve, arg.second) ); if( fcn.m_code.m_mir ) { const auto& mir = *fcn.m_code.m_mir; for(const auto& ty : mir.named_variables) - tv.visit_type(pp.monomorph(state.crate, ty)); + tv.visit_type(pp.monomorph(tv.m_resolve, ty)); for(const auto& ty : mir.temporaries) - tv.visit_type(pp.monomorph(state.crate, ty)); + tv.visit_type(pp.monomorph(tv.m_resolve, ty)); } } + state.fcns_to_type_visit.clear(); + // TODO: Similarly restrict revisiting of statics. for(const auto& ent : state.rv.m_statics) { TRACE_FUNCTION_F("Enumerate static " << ent.first); @@ -373,7 +379,7 @@ void Trans_Enumerate_Types(EnumState& state) const auto& stat = *ent.second->ptr; const auto& pp = ent.second->pp; - tv.visit_type( pp.monomorph(state.crate, stat.m_type) ); + tv.visit_type( pp.monomorph(tv.m_resolve, stat.m_type) ); } constructors_added = false; -- cgit v1.2.3