From 0f474b05a888b219f4a0f2d52a545a8e095006f8 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Wed, 4 Jan 2017 21:21:15 +0800 Subject: Codegen C - Fat pointer deref --- src/trans/codegen_c.cpp | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) (limited to 'src') 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; -- cgit v1.2.3