diff options
author | John Hodge <tpg@mutabah.net> | 2016-12-04 18:29:28 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-12-04 18:29:28 +0800 |
commit | 1d52ab49192de2a6954f3d51d650e08b58ada8bb (patch) | |
tree | 0d65e2d9168ca6e29ea0837f259e4e325125d3b8 /src | |
parent | b3defa907ce7cfeb45c73dc765430918f80cc7fe (diff) | |
download | mrust-1d52ab49192de2a6954f3d51d650e08b58ada8bb.tar.gz |
Trans C - Handle pointers to arrays better
Diffstat (limited to 'src')
-rw-r--r-- | src/trans/codegen_c.cpp | 44 |
1 files changed, 20 insertions, 24 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp index b429c8a8..7ec0e2e4 100644 --- a/src/trans/codegen_c.cpp +++ b/src/trans/codegen_c.cpp @@ -674,32 +674,10 @@ namespace { m_of << " " << inner; ), (Borrow, - if( *te.inner == ::HIR::CoreType::Str ) { - m_of << "STR_PTR " << inner; - } - else if( te.inner->m_data.is_TraitObject() ) { - m_of << "TRAITOBJ_PTR " << inner; - } - else if( te.inner->m_data.is_Slice() ) { - m_of << "SLICE_PTR " << inner; - } - else { - emit_ctype(*te.inner, FMT_CB(ss, ss << "*" << inner;)); - } + emit_ctype_ptr(*te.inner, inner); ), (Pointer, - if( *te.inner == ::HIR::CoreType::Str ) { - m_of << "STR_PTR " << inner; - } - else if( te.inner->m_data.is_TraitObject() ) { - m_of << "TRAITOBJ_PTR " << inner; - } - else if( te.inner->m_data.is_Slice() ) { - m_of << "SLICE_PTR " << inner; - } - else { - emit_ctype(*te.inner, FMT_CB(ss, ss << "*" << inner;)); - } + emit_ctype_ptr(*te.inner, inner); ), (Function, m_of << "t_" << Trans_Mangle(ty) << " " << inner; @@ -710,6 +688,24 @@ namespace { ) } + void emit_ctype_ptr(const ::HIR::TypeRef& inner_ty, ::FmtLambda inner) { + if( inner_ty == ::HIR::CoreType::Str ) { + m_of << "STR_PTR " << inner; + } + else if( inner_ty.m_data.is_TraitObject() ) { + m_of << "TRAITOBJ_PTR " << inner; + } + else if( inner_ty.m_data.is_Slice() ) { + m_of << "SLICE_PTR " << inner; + } + else if( inner_ty.m_data.is_Array() ) { + emit_ctype(inner_ty, FMT_CB(ss, ss << "(*" << inner << ")";)); + } + else { + emit_ctype(inner_ty, FMT_CB(ss, ss << "*" << inner;)); + } + } + int is_dst(const ::HIR::TypeRef& ty) const { if( ty == ::HIR::CoreType::Str ) |