summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-12-04 18:29:28 +0800
committerJohn Hodge <tpg@mutabah.net>2016-12-04 18:29:28 +0800
commit1d52ab49192de2a6954f3d51d650e08b58ada8bb (patch)
tree0d65e2d9168ca6e29ea0837f259e4e325125d3b8 /src
parentb3defa907ce7cfeb45c73dc765430918f80cc7fe (diff)
downloadmrust-1d52ab49192de2a6954f3d51d650e08b58ada8bb.tar.gz
Trans C - Handle pointers to arrays better
Diffstat (limited to 'src')
-rw-r--r--src/trans/codegen_c.cpp44
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 )