summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-12-12 23:13:08 +0800
committerJohn Hodge <tpg@mutabah.net>2016-12-12 23:13:08 +0800
commit8e8696dc777e9a4c6dae5d739268c32c2ad5707e (patch)
tree8413e897c8c6b90b7391676ae07d3514279189db
parent382c9dd2ed03f2d5c76af24de07cd22d74e8d6dd (diff)
downloadmrust-8e8696dc777e9a4c6dae5d739268c32c2ad5707e.tar.gz
Trans C - Hack in arrays in const
-rw-r--r--src/trans/codegen_c.cpp37
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 = ";