summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/trans/codegen_c.cpp11
-rw-r--r--src/trans/monomorphise.cpp21
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;
}
}