summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2017-11-24 08:55:35 +0800
committerJohn Hodge <tpg@ucc.asn.au>2017-11-24 08:57:03 +0800
commit5f10912ba53c05b96a73675c7160f502c3075cb9 (patch)
tree850f8c85d5b92943b7444232eef48afd2fa9f999 /src
parent19031a8e7290f0d911f1f85366342f4fcc66261c (diff)
downloadmrust-5f10912ba53c05b96a73675c7160f502c3075cb9.tar.gz
Codegen C - Generate call_mut for both Fn and FnMut
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)