diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/trans/codegen_c.cpp | 47 |
1 files changed, 33 insertions, 14 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp index e4de8745..41d38373 100644 --- a/src/trans/codegen_c.cpp +++ b/src/trans/codegen_c.cpp @@ -690,19 +690,39 @@ namespace { m_of << (c ? "true" : "false"); ), (Bytes, - emit_lvalue(e.dst); - m_of << ".PTR = "; - m_of << "\"" << ::std::oct; - for(const auto& v : c) { - if( ' ' <= v && v < 0x7F && v != '"' && v != '\\' ) - m_of << v; - else - m_of << "\\" << (unsigned int)v; + ::HIR::TypeRef tmp; + const auto& ty = mir_res.get_lvalue_type(tmp, e.dst); + MIR_ASSERT(mir_res, ty.m_data.is_Borrow(), "Const::Bytes returning non-borrow - " << ty); + if( ty.m_data.as_Borrow().inner->m_data.is_Array() ) { + // Array borrow : Cast the C string to the array + emit_lvalue(e.dst); + m_of << " = "; + // - Laziness + m_of << "(void*)\"" << ::std::oct; + for(const auto& v : c) { + if( ' ' <= v && v < 0x7F && v != '"' && v != '\\' ) + m_of << v; + else + m_of << "\\" << (unsigned int)v; + } + m_of << "\"" << ::std::dec; + } + else { + // Slice borrow (asumed), pointer and metadata + emit_lvalue(e.dst); + m_of << ".PTR = "; + m_of << "\"" << ::std::oct; + for(const auto& v : c) { + if( ' ' <= v && v < 0x7F && v != '"' && v != '\\' ) + m_of << v; + else + m_of << "\\" << (unsigned int)v; + } + m_of << "\"" << ::std::dec; + m_of << ";\n\t"; + emit_lvalue(e.dst); + m_of << ".META = " << c.size(); } - m_of << "\"" << ::std::dec; - m_of << ";\n\t"; - emit_lvalue(e.dst); - m_of << ".META = " << c.size(); ), (StaticString, emit_lvalue(e.dst); @@ -1255,8 +1275,7 @@ namespace { { if( i != 0 ) m_of << ","; ss << "\n\t\t"; - this->emit_ctype( params.monomorph(m_crate, item.m_args[i].second) ); - ss << " arg" << i; + this->emit_ctype( params.monomorph(m_crate, item.m_args[i].second), FMT_CB(os, os << "arg" << i;) ); } ss << "\n\t\t)"; } |