diff options
author | John Hodge <tpg@ucc.asn.au> | 2017-11-24 08:55:35 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2017-11-24 08:57:03 +0800 |
commit | 5f10912ba53c05b96a73675c7160f502c3075cb9 (patch) | |
tree | 850f8c85d5b92943b7444232eef48afd2fa9f999 /src | |
parent | 19031a8e7290f0d911f1f85366342f4fcc66261c (diff) | |
download | mrust-5f10912ba53c05b96a73675c7160f502c3075cb9.tar.gz |
Codegen C - Generate call_mut for both Fn and FnMut
Diffstat (limited to 'src')
-rw-r--r-- | src/trans/codegen_c.cpp | 19 |
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) |