summaryrefslogtreecommitdiff
path: root/src/trans/enumerate.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/trans/enumerate.cpp')
-rw-r--r--src/trans/enumerate.cpp77
1 files changed, 38 insertions, 39 deletions
diff --git a/src/trans/enumerate.cpp b/src/trans/enumerate.cpp
index 24dfce3c..81b02199 100644
--- a/src/trans/enumerate.cpp
+++ b/src/trans/enumerate.cpp
@@ -27,35 +27,35 @@ void Trans_Enumerate_FillFrom_Literal(TransList& out, const ::HIR::Crate& crate,
TransList Trans_Enumerate_Main(const ::HIR::Crate& crate)
{
static Span sp;
-
+
TransList rv;
-
+
// "start" language item
// - Takes main, and argc/argv as arguments
{
auto start_path = crate.get_lang_item_path(sp, "start");
const auto& fcn = crate.get_function_by_path(sp, start_path);
-
+
auto* ptr = rv.add_function(start_path);
assert(ptr);
Trans_Enumerate_FillFrom(rv, crate, fcn, *ptr);
}
-
+
// user entrypoint
{
auto main_path = ::HIR::SimplePath("", {"main"});
const auto& fcn = crate.get_function_by_path(sp, main_path);
-
+
auto* ptr = rv.add_function(main_path);
assert(ptr);
Trans_Enumerate_FillFrom(rv, crate, fcn, *ptr);
}
-
+
// TODO: Search the trans list for external functions that refer to a named symbol, search for that defined elsewhere.
// - Not needed yet, there's a slow hack elsewhere
Trans_Enumerate_Types(rv, crate);
-
+
return rv;
}
@@ -97,11 +97,11 @@ namespace {
TransList Trans_Enumerate_Public(const ::HIR::Crate& crate)
{
TransList rv;
-
+
Trans_Enumerate_Public_Mod(rv, crate, crate.m_root_module, ::HIR::SimplePath("",{}));
-
+
Trans_Enumerate_Types(rv, crate);
-
+
return rv;
}
@@ -111,22 +111,22 @@ namespace {
template<typename T>
bool operator()(const T* lhs, const T* rhs) const { return *lhs < *rhs; }
};
-
+
struct TypeVisitor
{
const ::HIR::Crate& m_crate;
::StaticTraitResolve m_resolve;
::std::vector< ::HIR::TypeRef>& out_list;
-
+
::std::set< ::HIR::TypeRef> visited;
::std::set< const ::HIR::TypeRef*, PtrComp> active_set;
-
+
TypeVisitor(const ::HIR::Crate& crate, ::std::vector< ::HIR::TypeRef>& out_list):
m_crate(crate),
m_resolve(crate),
out_list(out_list)
{}
-
+
void visit_struct(const ::HIR::GenericPath& path, const ::HIR::Struct& item) {
static Span sp;
::HIR::TypeRef tmp;
@@ -188,19 +188,19 @@ namespace {
)
}
}
-
+
void visit_type(const ::HIR::TypeRef& ty)
{
// Already done
if( visited.find(ty) != visited.end() )
return ;
-
+
if( active_set.find(&ty) != active_set.end() ) {
// TODO: Handle recursion
return ;
}
active_set.insert( &ty );
-
+
TU_MATCHA( (ty.m_data), (te),
// Impossible
(Infer,
@@ -236,7 +236,7 @@ namespace {
static Span sp;
// Ensure that the data trait's vtable is present
const auto& trait = *te.m_trait.m_trait_ptr;
-
+
auto vtable_ty_spath = te.m_trait.m_path.m_path;
vtable_ty_spath.m_components.back() += "#vtable";
const auto& vtable_ref = m_crate.get_struct_by_path(sp, vtable_ty_spath);
@@ -249,8 +249,8 @@ namespace {
vtable_params.m_types.resize(idx+1);
vtable_params.m_types[idx] = ty_b.second.clone();
}
-
-
+
+
visit_type( ::HIR::TypeRef( ::HIR::GenericPath(vtable_ty_spath, mv$(vtable_params)), &vtable_ref ) );
),
(Array,
@@ -276,7 +276,7 @@ namespace {
)
)
active_set.erase( active_set.find(&ty) );
-
+
visited.insert( ty.clone() );
out_list.push_back( ty.clone() );
DEBUG("Add type " << ty);
@@ -300,11 +300,11 @@ void Trans_Enumerate_Types(TransList& out, const ::HIR::Crate& crate)
assert(ent.second->ptr);
const auto& fcn = *ent.second->ptr;
const auto& pp = ent.second->pp;
-
+
tv.visit_type( pp.monomorph(crate, fcn.m_return) );
for(const auto& arg : fcn.m_args)
tv.visit_type( pp.monomorph(crate, arg.second) );
-
+
if( fcn.m_code.m_mir )
{
const auto& mir = *fcn.m_code.m_mir;
@@ -320,10 +320,10 @@ void Trans_Enumerate_Types(TransList& out, const ::HIR::Crate& crate)
assert(ent.second->ptr);
const auto& stat = *ent.second->ptr;
const auto& pp = ent.second->pp;
-
+
tv.visit_type( pp.monomorph(crate, stat.m_type) );
}
-
+
constructors_added = false;
for(unsigned int i = types_count; i < out.m_types.size(); i ++ )
{
@@ -346,16 +346,15 @@ void Trans_Enumerate_Types(TransList& out, const ::HIR::Crate& crate)
)
)
ASSERT_BUG(Span(), markings_ptr, "Path binding not set correctly - " << ty);
-
+
if( markings_ptr->has_drop_impl )
{
// Add the Drop impl to the codegen list
Trans_Enumerate_FillFrom_Path(out, crate, ::HIR::Path( ty.clone(), crate.get_lang_item_path(sp, "drop"), "drop"), {});
-
constructors_added = true;
}
}
-
+
if( const auto* ity = tv.m_resolve.is_type_owned_box(ty) )
{
// Reqire drop glue for inner type.
@@ -386,7 +385,7 @@ namespace {
else {
mod = &crate.m_root_module;
}
-
+
for( unsigned int i = 0; i < path.m_components.size() - 1; i ++ )
{
const auto& pc = path.m_components[i];
@@ -408,12 +407,12 @@ namespace {
)
)
}
-
+
auto it = mod->m_value_items.find( path.m_components.back() );
if( it == mod->m_value_items.end() ) {
return EntPtr {};
}
-
+
TU_MATCH( ::HIR::ValueItem, (it->second->ent), (e),
(Import,
),
@@ -439,7 +438,7 @@ namespace {
{
TRACE_FUNCTION_F(path);
StaticTraitResolve resolve { crate };
-
+
TU_MATCH(::HIR::Path::Data, (path.m_data), (e),
(Generic,
return get_ent_simplepath(sp, crate, e.m_path);
@@ -472,13 +471,13 @@ namespace {
),
(UfcsKnown,
EntPtr rv;
-
+
// Obtain trait pointer (for default impl and to know what the item type is)
const auto& trait_ref = crate.get_trait_by_path(sp, e.trait.m_path);
auto trait_vi_it = trait_ref.m_values.find(e.item);
ASSERT_BUG(sp, trait_vi_it != trait_ref.m_values.end(), "Couldn't find item " << e.item << " in trait " << e.trait.m_path);
const auto& trait_vi = trait_vi_it->second;
-
+
bool is_dynamic = false;
::std::vector<::HIR::TypeRef> best_impl_params;
const ::HIR::TraitImpl* best_impl = nullptr;
@@ -494,7 +493,7 @@ namespace {
const auto& impl_ref_e = impl_ref.m_data.as_TraitImpl();
const auto& impl = *impl_ref_e.impl;
ASSERT_BUG(sp, impl.m_trait_args.m_types.size() == e.trait.m_params.m_types.size(), "Trait parameter count mismatch " << impl.m_trait_args << " vs " << e.trait.m_params);
-
+
if( best_impl == nullptr || impl.more_specific_than(*best_impl) ) {
best_impl = &impl;
bool is_spec = false;
@@ -538,7 +537,7 @@ namespace {
const auto& impl = *best_impl;
impl_pp.m_types = mv$(best_impl_params);
-
+
TU_MATCHA( (trait_vi), (ve),
(Constant, TODO(sp, "Associated constant"); ),
(Static,
@@ -793,7 +792,7 @@ void Trans_Enumerate_FillFrom_VTable(TransList& out, const ::HIR::Crate& crate,
const auto& type = *vtable_path.m_data.as_UfcsKnown().type;
const auto& trait_path = vtable_path.m_data.as_UfcsKnown().trait;
const auto& tr = crate.get_trait_by_path(Span(), trait_path.m_path);
-
+
auto monomorph_cb_trait = monomorphise_type_get_cb(sp, &type, &trait_path.m_params, nullptr);
for(const auto& m : tr.m_value_indexes)
{
@@ -841,7 +840,7 @@ namespace {
}
)
}
-
+
for(const auto& ti : mod.m_mod_items)
{
TU_IFLET( ::HIR::TypeItem, ti.second->ent, Module, i,
@@ -849,7 +848,7 @@ namespace {
return rv;
)
}
-
+
return nullptr;
}
::HIR::Function* find_function_by_link_name(const ::HIR::Crate& crate, const char* name, ::HIR::SimplePath& out_path)