diff options
-rw-r--r-- | src/trans/codegen_c.cpp | 11 | ||||
-rw-r--r-- | src/trans/monomorphise.cpp | 21 |
2 files changed, 25 insertions, 7 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp index ea3ef2d5..9af8875b 100644 --- a/src/trans/codegen_c.cpp +++ b/src/trans/codegen_c.cpp @@ -1165,6 +1165,9 @@ namespace { m_of << "\t// " << code->temporaries[i]; m_of << "\n"; } + for(unsigned int i = 0; i < code->drop_flags.size(); i ++) { + m_of << "\tbool df" << i << " = " << code->drop_flags[i] << ";\n"; + } for(unsigned int i = 0; i < code->blocks.size(); i ++) { TRACE_FUNCTION_F(p << " bb" << i); @@ -1184,13 +1187,17 @@ namespace { { case ::MIR::Statement::TAGDEAD: throw ""; case ::MIR::Statement::TAG_SetDropFlag: { - MIR_TODO(mir_res, "SetDropFlag"); + const auto& e = stmt.as_SetDropFlag(); + m_of << "\tdf" << e.idx << " = " << e.new_val << ";\n"; break; } case ::MIR::Statement::TAG_Drop: { const auto& e = stmt.as_Drop(); ::HIR::TypeRef tmp; const auto& ty = mir_res.get_lvalue_type(tmp, e.slot); + if( e.flag_idx != ~0u ) + m_of << "if( df" << e.flag_idx << " ) {\n"; + switch( e.kind ) { case ::MIR::eDropKind::SHALLOW: @@ -1211,6 +1218,8 @@ namespace { emit_destructor_call(e.slot, ty, false); break; } + if( e.flag_idx != ~0u ) + m_of << "}\n"; break; } case ::MIR::Statement::TAG_Asm: { const auto& e = stmt.as_Asm(); diff --git a/src/trans/monomorphise.cpp b/src/trans/monomorphise.cpp index dd30dc7a..3e52dfaf 100644 --- a/src/trans/monomorphise.cpp +++ b/src/trans/monomorphise.cpp @@ -76,6 +76,7 @@ namespace { DEBUG("- tmp" << output.temporaries.size()); output.temporaries.push_back( params.monomorph(resolve, ty) ); } + output.drop_flags = tpl->drop_flags; // 2. Monomorphise all paths output.blocks.reserve( tpl->blocks.size() ); @@ -87,18 +88,22 @@ namespace { statements.reserve( block.statements.size() ); for(const auto& stmt : block.statements) { - assert( stmt.is_Drop() || stmt.is_Assign() ); - if( stmt.is_Drop() ) + switch( stmt.tag() ) { + case ::MIR::Statement::TAGDEAD: throw ""; + case ::MIR::Statement::TAG_SetDropFlag: + statements.push_back( ::MIR::Statement( stmt.as_SetDropFlag() ) ); + break; + case ::MIR::Statement::TAG_Drop: { const auto& e = stmt.as_Drop(); DEBUG("- DROP " << e.slot); statements.push_back( ::MIR::Statement::make_Drop({ e.kind, - monomorph_LValue(resolve, params, e.slot) + monomorph_LValue(resolve, params, e.slot), + e.flag_idx }) ); - } - else - { + } break; + case ::MIR::Statement::TAG_Assign: { const auto& e = stmt.as_Assign(); DEBUG("- " << e.dst << " = " << e.src); @@ -218,6 +223,10 @@ namespace { monomorph_LValue(resolve, params, e.dst), mv$(rval) }) ); + } break; + case ::MIR::Statement::TAG_Asm: + TODO(params.sp, "Monormorphise asm!"); + break; } } |