summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/trans/codegen_c.cpp19
1 files changed, 12 insertions, 7 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp
index acc4f6f2..0a4e021a 100644
--- a/src/trans/codegen_c.cpp
+++ b/src/trans/codegen_c.cpp
@@ -1739,20 +1739,25 @@ namespace {
// TODO: Hack in fn pointer VTable handling
if( const auto* te = type.m_data.opt_Function() )
{
- const char* call_fcn_name = nullptr;
+ const char* names[] = { "call", "call_mut" };
+ const ::HIR::SimplePath* traits[] = { &m_resolve.m_lang_Fn, &m_resolve.m_lang_FnMut };
+ size_t offset;
if( trait_path.m_path == m_resolve.m_lang_Fn )
- call_fcn_name = "call";
+ offset = 0;
else if( trait_path.m_path == m_resolve.m_lang_FnMut )
- call_fcn_name = "call_mut";
- else if( trait_path.m_path == m_resolve.m_lang_FnOnce )
- call_fcn_name = "call_once";
+ offset = 1;
+ //else if( trait_path.m_path == m_resolve.m_lang_FnOnce )
+ // call_fcn_name = "call_once";
else
- ;
+ offset = 2;
- if( call_fcn_name )
+ while(offset < sizeof(names)/sizeof(names[0]))
{
+ const auto& trait_name = *traits[offset];
+ const char* call_fcn_name = names[offset++];
auto fcn_p = p.clone();
fcn_p.m_data.as_UfcsKnown().item = call_fcn_name;
+ fcn_p.m_data.as_UfcsKnown().trait.m_path = trait_name.clone();
emit_ctype(*te->m_rettype);
auto arg_ty = ::HIR::TypeRef::new_unit();
for(const auto& ty : te->m_arg_types)