diff options
author | John Hodge <tpg@mutabah.net> | 2016-12-12 23:13:08 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-12-12 23:13:08 +0800 |
commit | 8e8696dc777e9a4c6dae5d739268c32c2ad5707e (patch) | |
tree | 8413e897c8c6b90b7391676ae07d3514279189db /src | |
parent | 382c9dd2ed03f2d5c76af24de07cd22d74e8d6dd (diff) | |
download | mrust-8e8696dc777e9a4c6dae5d739268c32c2ad5707e.tar.gz |
Trans C - Hack in arrays in const
Diffstat (limited to 'src')
-rw-r--r-- | src/trans/codegen_c.cpp | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp index bbd3fbdc..08874803 100644 --- a/src/trans/codegen_c.cpp +++ b/src/trans/codegen_c.cpp @@ -1042,10 +1042,39 @@ namespace { ), (BorrowOf, // TODO: If the type is Borrow of a DST, do a fat assign. - emit_dst(); m_of << " = "; - if( ! ty.m_data.is_Function() ) - m_of << "&"; - m_of << Trans_Mangle(e); + if( ty.m_data.is_Function() ) + { + emit_dst(); m_of << " = " << Trans_Mangle(e); + } + else if( ty.m_data.is_Borrow() ) + { + const auto& ity = *ty.m_data.as_Borrow().inner; + switch( metadata_type(ity) ) + { + case MetadataType::None: + emit_dst(); m_of << " = &" << Trans_Mangle(e); + break; + case MetadataType::Slice: + emit_dst(); m_of << ".PTR = &" << Trans_Mangle(e) << ";\n\t"; + // HACK: Since getting the size is hard, use two sizeofs + emit_dst(); m_of << ".META = sizeof(" << Trans_Mangle(e) << ") / "; + if( ity.m_data.is_Slice() ) { + m_of << "sizeof("; emit_ctype(*ity.m_data.as_Slice().inner); m_of << ")"; + } + else { + m_of << "/*TODO*/"; + } + break; + case MetadataType::TraitObject: + emit_dst(); m_of << ".PTR = &" << Trans_Mangle(e) << ";\n\t"; + emit_dst(); m_of << ".META = /* TODO: Const VTable */"; + break; + } + } + else + { + emit_dst(); m_of << " = &" << Trans_Mangle(e); + } ), (String, emit_dst(); m_of << ".PTR = "; |