diff options
author | John Hodge <tpg@mutabah.net> | 2017-01-04 21:21:15 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2017-01-04 21:21:15 +0800 |
commit | 0f474b05a888b219f4a0f2d52a545a8e095006f8 (patch) | |
tree | 5e6fcff020981a79efaef9ba367c59b403b9c181 | |
parent | 6529f81284009d916f48b51582728a23f74c2745 (diff) | |
download | mrust-0f474b05a888b219f4a0f2d52a545a8e095006f8.tar.gz |
Codegen C - Fat pointer deref
-rw-r--r-- | src/trans/codegen_c.cpp | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp index a59d947a..cf881f39 100644 --- a/src/trans/codegen_c.cpp +++ b/src/trans/codegen_c.cpp @@ -2221,9 +2221,17 @@ namespace { ::HIR::TypeRef tmp; const auto& ty = m_mir_res->get_lvalue_type(tmp, *e.val); if( ty.m_data.is_Slice() ) { - m_of << "(("; emit_ctype(*ty.m_data.as_Slice().inner); m_of << "*)"; - emit_lvalue(*e.val); - m_of << ".DATA)[" << e.field_index << "]"; + if( e.val->is_Deref() ) + { + m_of << "(("; emit_ctype(*ty.m_data.as_Slice().inner); m_of << "*)"; + emit_lvalue(*e.val->as_Deref().val); + m_of << ".DATA)"; + } + else + { + emit_lvalue(*e.val); + } + m_of << "[" << e.field_index << "]"; } else if( ty.m_data.is_Array() ) { emit_lvalue(*e.val); @@ -2247,9 +2255,22 @@ namespace { } ), (Deref, - m_of << "(*"; - emit_lvalue(*e.val); - m_of << ")"; + // TODO: If the type is unsized, then this pointer is a fat pointer, so we need to cast the data pointer. + ::HIR::TypeRef tmp; + const auto& ty = m_mir_res->get_lvalue_type(tmp, val); + auto dst_type = metadata_type(ty); + if( dst_type != MetadataType:: None ) + { + m_of << "(*("; emit_ctype(ty); m_of << "*)"; + emit_lvalue(*e.val); + m_of << ")"; + } + else + { + m_of << "(*"; + emit_lvalue(*e.val); + m_of << ")"; + } ), (Index, ::HIR::TypeRef tmp; |