fix switch variable propagation

This commit is contained in:
xensik 2021-06-24 12:26:56 +02:00
parent 8d886570aa
commit 3c4ad5cf0b
7 changed files with 42 additions and 7 deletions

View File

@ -2937,6 +2937,7 @@ void decompiler::process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stm
void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt) void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt)
{ {
std::vector<gsc::context*> childs; std::vector<gsc::context*> childs;
bool has_default = false;
for(auto& entry : stmt->stmts) for(auto& entry : stmt->stmts)
{ {
@ -2954,6 +2955,7 @@ void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt
} }
else if(entry.as_node->type == gsc::node_t::stmt_default) else if(entry.as_node->type == gsc::node_t::stmt_default)
{ {
has_default = true;
entry.as_default->ctx = std::make_unique<gsc::context>(); entry.as_default->ctx = std::make_unique<gsc::context>();
ctx->transfer_decompiler(entry.as_default->ctx); ctx->transfer_decompiler(entry.as_default->ctx);
@ -2966,7 +2968,10 @@ void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt
} }
} }
ctx->append(childs); if(has_default)
{
ctx->append(childs);
}
} }
void decompiler::process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt) void decompiler::process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt)

View File

@ -2937,6 +2937,7 @@ void decompiler::process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stm
void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt) void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt)
{ {
std::vector<gsc::context*> childs; std::vector<gsc::context*> childs;
bool has_default = false;
for(auto& entry : stmt->stmts) for(auto& entry : stmt->stmts)
{ {
@ -2954,6 +2955,7 @@ void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt
} }
else if(entry.as_node->type == gsc::node_t::stmt_default) else if(entry.as_node->type == gsc::node_t::stmt_default)
{ {
has_default = true;
entry.as_default->ctx = std::make_unique<gsc::context>(); entry.as_default->ctx = std::make_unique<gsc::context>();
ctx->transfer_decompiler(entry.as_default->ctx); ctx->transfer_decompiler(entry.as_default->ctx);
@ -2966,7 +2968,10 @@ void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt
} }
} }
ctx->append(childs); if(has_default)
{
ctx->append(childs);
}
} }
void decompiler::process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt) void decompiler::process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt)

View File

@ -2931,6 +2931,7 @@ void decompiler::process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stm
void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt) void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt)
{ {
std::vector<gsc::context*> childs; std::vector<gsc::context*> childs;
bool has_default = false;
for(auto& entry : stmt->stmts) for(auto& entry : stmt->stmts)
{ {
@ -2948,6 +2949,7 @@ void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt
} }
else if(entry.as_node->type == gsc::node_t::stmt_default) else if(entry.as_node->type == gsc::node_t::stmt_default)
{ {
has_default = true;
entry.as_default->ctx = std::make_unique<gsc::context>(); entry.as_default->ctx = std::make_unique<gsc::context>();
ctx->transfer_decompiler(entry.as_default->ctx); ctx->transfer_decompiler(entry.as_default->ctx);
@ -2960,7 +2962,10 @@ void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt
} }
} }
ctx->append(childs); if(has_default)
{
ctx->append(childs);
}
} }
void decompiler::process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt) void decompiler::process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt)

View File

@ -2931,6 +2931,7 @@ void decompiler::process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stm
void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt) void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt)
{ {
std::vector<gsc::context*> childs; std::vector<gsc::context*> childs;
bool has_default = false;
for(auto& entry : stmt->stmts) for(auto& entry : stmt->stmts)
{ {
@ -2948,6 +2949,7 @@ void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt
} }
else if(entry.as_node->type == gsc::node_t::stmt_default) else if(entry.as_node->type == gsc::node_t::stmt_default)
{ {
has_default = true;
entry.as_default->ctx = std::make_unique<gsc::context>(); entry.as_default->ctx = std::make_unique<gsc::context>();
ctx->transfer_decompiler(entry.as_default->ctx); ctx->transfer_decompiler(entry.as_default->ctx);
@ -2960,7 +2962,10 @@ void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt
} }
} }
ctx->append(childs); if(has_default)
{
ctx->append(childs);
}
} }
void decompiler::process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt) void decompiler::process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt)

View File

@ -2931,6 +2931,7 @@ void decompiler::process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stm
void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt) void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt)
{ {
std::vector<gsc::context*> childs; std::vector<gsc::context*> childs;
bool has_default = false;
for(auto& entry : stmt->stmts) for(auto& entry : stmt->stmts)
{ {
@ -2948,6 +2949,7 @@ void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt
} }
else if(entry.as_node->type == gsc::node_t::stmt_default) else if(entry.as_node->type == gsc::node_t::stmt_default)
{ {
has_default = true;
entry.as_default->ctx = std::make_unique<gsc::context>(); entry.as_default->ctx = std::make_unique<gsc::context>();
ctx->transfer_decompiler(entry.as_default->ctx); ctx->transfer_decompiler(entry.as_default->ctx);
@ -2960,7 +2962,10 @@ void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt
} }
} }
ctx->append(childs); if(has_default)
{
ctx->append(childs);
}
} }
void decompiler::process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt) void decompiler::process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt)

View File

@ -2937,6 +2937,7 @@ void decompiler::process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stm
void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt) void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt)
{ {
std::vector<gsc::context*> childs; std::vector<gsc::context*> childs;
bool has_default = false;
for(auto& entry : stmt->stmts) for(auto& entry : stmt->stmts)
{ {
@ -2954,6 +2955,7 @@ void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt
} }
else if(entry.as_node->type == gsc::node_t::stmt_default) else if(entry.as_node->type == gsc::node_t::stmt_default)
{ {
has_default = true;
entry.as_default->ctx = std::make_unique<gsc::context>(); entry.as_default->ctx = std::make_unique<gsc::context>();
ctx->transfer_decompiler(entry.as_default->ctx); ctx->transfer_decompiler(entry.as_default->ctx);
@ -2966,7 +2968,10 @@ void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt
} }
} }
ctx->append(childs); if(has_default)
{
ctx->append(childs);
}
} }
void decompiler::process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt) void decompiler::process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt)

View File

@ -2946,6 +2946,7 @@ void decompiler::process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stm
void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt) void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt)
{ {
std::vector<gsc::context*> childs; std::vector<gsc::context*> childs;
bool has_default = false;
for(auto& entry : stmt->stmts) for(auto& entry : stmt->stmts)
{ {
@ -2963,6 +2964,7 @@ void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt
} }
else if(entry.as_node->type == gsc::node_t::stmt_default) else if(entry.as_node->type == gsc::node_t::stmt_default)
{ {
has_default = true;
entry.as_default->ctx = std::make_unique<gsc::context>(); entry.as_default->ctx = std::make_unique<gsc::context>();
ctx->transfer_decompiler(entry.as_default->ctx); ctx->transfer_decompiler(entry.as_default->ctx);
@ -2975,7 +2977,10 @@ void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt
} }
} }
ctx->append(childs); if(has_default)
{
ctx->append(childs);
}
} }
void decompiler::process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt) void decompiler::process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt)