fix decompiler variable stack
This commit is contained in:
parent
dc6d1d5231
commit
2dcde964e1
@ -2864,6 +2864,9 @@ void decompiler::process_stmt_if(const gsc::context_ptr& ctx, const gsc::stmt_if
|
|||||||
|
|
||||||
void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stmt_ifelse_ptr& stmt)
|
void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stmt_ifelse_ptr& stmt)
|
||||||
{
|
{
|
||||||
|
std::vector<gsc::context*> childs;
|
||||||
|
auto abort = gsc::abort_t::abort_return;
|
||||||
|
|
||||||
process_expr(ctx, stmt->expr);
|
process_expr(ctx, stmt->expr);
|
||||||
|
|
||||||
stmt->ctx_if = std::make_unique<gsc::context>();
|
stmt->ctx_if = std::make_unique<gsc::context>();
|
||||||
@ -2871,12 +2874,30 @@ void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stm
|
|||||||
|
|
||||||
process_stmt(stmt->ctx_if, stmt->stmt_if);
|
process_stmt(stmt->ctx_if, stmt->stmt_if);
|
||||||
|
|
||||||
|
if(stmt->ctx_if->abort <= gsc::abort_t::abort_return)
|
||||||
|
{
|
||||||
|
abort = stmt->ctx_if->abort;
|
||||||
|
|
||||||
|
if(abort == gsc::abort_t::abort_none)
|
||||||
|
childs.push_back(stmt->ctx_if.get());
|
||||||
|
}
|
||||||
|
|
||||||
stmt->ctx_else = std::make_unique<gsc::context>();
|
stmt->ctx_else = std::make_unique<gsc::context>();
|
||||||
ctx->transfer_decompiler(stmt->ctx_else);
|
ctx->transfer_decompiler(stmt->ctx_else);
|
||||||
|
|
||||||
process_stmt(stmt->ctx_else, stmt->stmt_else);
|
process_stmt(stmt->ctx_else, stmt->stmt_else);
|
||||||
|
|
||||||
std::vector<gsc::context*> childs({stmt->ctx_if.get(), stmt->ctx_else.get()});
|
if(stmt->ctx_else->abort <= abort)
|
||||||
|
{
|
||||||
|
abort = stmt->ctx_else->abort;
|
||||||
|
|
||||||
|
if (abort == gsc::abort_t::abort_none)
|
||||||
|
childs.push_back(stmt->ctx_else.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
ctx->abort = abort;
|
||||||
|
|
||||||
ctx->append(childs);
|
ctx->append(childs);
|
||||||
|
|
||||||
if(stmt->stmt_if.as_list->stmts.size() == 1 && !gsc::node::is_special_stmt(stmt->stmt_if.as_list->stmts.at(0)))
|
if(stmt->stmt_if.as_list->stmts.size() == 1 && !gsc::node::is_special_stmt(stmt->stmt_if.as_list->stmts.at(0)))
|
||||||
@ -3020,11 +3041,27 @@ void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt
|
|||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
ctx->abort = gsc::abort_t::abort_break;
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void decompiler::process_stmt_continue(const gsc::context_ptr& ctx, const gsc::stmt_continue_ptr& stmt)
|
||||||
|
{
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void decompiler::process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt)
|
void decompiler::process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt)
|
||||||
{
|
{
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_return;
|
||||||
|
}
|
||||||
|
|
||||||
if(stmt->expr.as_node->type == gsc::node_t::null)
|
if(stmt->expr.as_node->type == gsc::node_t::null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
@ -67,6 +67,7 @@ private:
|
|||||||
void process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stmt_switch_ptr& stmt);
|
void process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stmt_switch_ptr& stmt);
|
||||||
void process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt);
|
void process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt);
|
||||||
void process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt);
|
void process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt);
|
||||||
|
void process_stmt_continue(const gsc::context_ptr& ctx, const gsc::stmt_continue_ptr& stmt);
|
||||||
void process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt);
|
void process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt);
|
||||||
void process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr);
|
void process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr);
|
||||||
void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
|
void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
|
||||||
|
@ -2864,6 +2864,9 @@ void decompiler::process_stmt_if(const gsc::context_ptr& ctx, const gsc::stmt_if
|
|||||||
|
|
||||||
void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stmt_ifelse_ptr& stmt)
|
void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stmt_ifelse_ptr& stmt)
|
||||||
{
|
{
|
||||||
|
std::vector<gsc::context*> childs;
|
||||||
|
auto abort = gsc::abort_t::abort_return;
|
||||||
|
|
||||||
process_expr(ctx, stmt->expr);
|
process_expr(ctx, stmt->expr);
|
||||||
|
|
||||||
stmt->ctx_if = std::make_unique<gsc::context>();
|
stmt->ctx_if = std::make_unique<gsc::context>();
|
||||||
@ -2871,12 +2874,30 @@ void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stm
|
|||||||
|
|
||||||
process_stmt(stmt->ctx_if, stmt->stmt_if);
|
process_stmt(stmt->ctx_if, stmt->stmt_if);
|
||||||
|
|
||||||
|
if(stmt->ctx_if->abort <= gsc::abort_t::abort_return)
|
||||||
|
{
|
||||||
|
abort = stmt->ctx_if->abort;
|
||||||
|
|
||||||
|
if(abort == gsc::abort_t::abort_none)
|
||||||
|
childs.push_back(stmt->ctx_if.get());
|
||||||
|
}
|
||||||
|
|
||||||
stmt->ctx_else = std::make_unique<gsc::context>();
|
stmt->ctx_else = std::make_unique<gsc::context>();
|
||||||
ctx->transfer_decompiler(stmt->ctx_else);
|
ctx->transfer_decompiler(stmt->ctx_else);
|
||||||
|
|
||||||
process_stmt(stmt->ctx_else, stmt->stmt_else);
|
process_stmt(stmt->ctx_else, stmt->stmt_else);
|
||||||
|
|
||||||
std::vector<gsc::context*> childs({stmt->ctx_if.get(), stmt->ctx_else.get()});
|
if(stmt->ctx_else->abort <= abort)
|
||||||
|
{
|
||||||
|
abort = stmt->ctx_else->abort;
|
||||||
|
|
||||||
|
if (abort == gsc::abort_t::abort_none)
|
||||||
|
childs.push_back(stmt->ctx_else.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
ctx->abort = abort;
|
||||||
|
|
||||||
ctx->append(childs);
|
ctx->append(childs);
|
||||||
|
|
||||||
if(stmt->stmt_if.as_list->stmts.size() == 1 && !gsc::node::is_special_stmt(stmt->stmt_if.as_list->stmts.at(0)))
|
if(stmt->stmt_if.as_list->stmts.size() == 1 && !gsc::node::is_special_stmt(stmt->stmt_if.as_list->stmts.at(0)))
|
||||||
@ -3020,11 +3041,27 @@ void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt
|
|||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
ctx->abort = gsc::abort_t::abort_break;
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void decompiler::process_stmt_continue(const gsc::context_ptr& ctx, const gsc::stmt_continue_ptr& stmt)
|
||||||
|
{
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void decompiler::process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt)
|
void decompiler::process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt)
|
||||||
{
|
{
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_return;
|
||||||
|
}
|
||||||
|
|
||||||
if(stmt->expr.as_node->type == gsc::node_t::null)
|
if(stmt->expr.as_node->type == gsc::node_t::null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
@ -67,6 +67,7 @@ private:
|
|||||||
void process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stmt_switch_ptr& stmt);
|
void process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stmt_switch_ptr& stmt);
|
||||||
void process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt);
|
void process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt);
|
||||||
void process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt);
|
void process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt);
|
||||||
|
void process_stmt_continue(const gsc::context_ptr& ctx, const gsc::stmt_continue_ptr& stmt);
|
||||||
void process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt);
|
void process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt);
|
||||||
void process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr);
|
void process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr);
|
||||||
void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
|
void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
|
||||||
|
@ -2877,6 +2877,7 @@ void decompiler::process_stmt(const gsc::context_ptr& ctx, const gsc::stmt_ptr&
|
|||||||
case gsc::node_t::stmt_foreach: process_stmt_foreach(ctx, stmt.as_foreach); break;
|
case gsc::node_t::stmt_foreach: process_stmt_foreach(ctx, stmt.as_foreach); break;
|
||||||
case gsc::node_t::stmt_switch: process_stmt_switch(ctx, stmt.as_switch); break;
|
case gsc::node_t::stmt_switch: process_stmt_switch(ctx, stmt.as_switch); break;
|
||||||
case gsc::node_t::stmt_break: process_stmt_break(ctx, stmt.as_break); break;
|
case gsc::node_t::stmt_break: process_stmt_break(ctx, stmt.as_break); break;
|
||||||
|
case gsc::node_t::stmt_continue: process_stmt_continue(ctx, stmt.as_continue); break;
|
||||||
case gsc::node_t::stmt_return: process_stmt_return(ctx, stmt.as_return); break;
|
case gsc::node_t::stmt_return: process_stmt_return(ctx, stmt.as_return); break;
|
||||||
case gsc::node_t::asm_remove: process_var_remove(ctx, stmt.as_asm_remove); break;
|
case gsc::node_t::asm_remove: process_var_remove(ctx, stmt.as_asm_remove); break;
|
||||||
case gsc::node_t::asm_create:
|
case gsc::node_t::asm_create:
|
||||||
@ -2971,6 +2972,9 @@ void decompiler::process_stmt_if(const gsc::context_ptr& ctx, const gsc::stmt_if
|
|||||||
|
|
||||||
void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stmt_ifelse_ptr& stmt)
|
void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stmt_ifelse_ptr& stmt)
|
||||||
{
|
{
|
||||||
|
std::vector<gsc::context*> childs;
|
||||||
|
auto abort = gsc::abort_t::abort_return;
|
||||||
|
|
||||||
process_expr(ctx, stmt->expr);
|
process_expr(ctx, stmt->expr);
|
||||||
|
|
||||||
stmt->ctx_if = std::make_unique<gsc::context>();
|
stmt->ctx_if = std::make_unique<gsc::context>();
|
||||||
@ -2978,12 +2982,30 @@ void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stm
|
|||||||
|
|
||||||
process_stmt(stmt->ctx_if, stmt->stmt_if);
|
process_stmt(stmt->ctx_if, stmt->stmt_if);
|
||||||
|
|
||||||
|
if(stmt->ctx_if->abort <= gsc::abort_t::abort_return)
|
||||||
|
{
|
||||||
|
abort = stmt->ctx_if->abort;
|
||||||
|
|
||||||
|
if(abort == gsc::abort_t::abort_none)
|
||||||
|
childs.push_back(stmt->ctx_if.get());
|
||||||
|
}
|
||||||
|
|
||||||
stmt->ctx_else = std::make_unique<gsc::context>();
|
stmt->ctx_else = std::make_unique<gsc::context>();
|
||||||
ctx->transfer_decompiler(stmt->ctx_else);
|
ctx->transfer_decompiler(stmt->ctx_else);
|
||||||
|
|
||||||
process_stmt(stmt->ctx_else, stmt->stmt_else);
|
process_stmt(stmt->ctx_else, stmt->stmt_else);
|
||||||
|
|
||||||
std::vector<gsc::context*> childs({stmt->ctx_if.get(), stmt->ctx_else.get()});
|
if(stmt->ctx_else->abort <= abort)
|
||||||
|
{
|
||||||
|
abort = stmt->ctx_else->abort;
|
||||||
|
|
||||||
|
if (abort == gsc::abort_t::abort_none)
|
||||||
|
childs.push_back(stmt->ctx_else.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
ctx->abort = abort;
|
||||||
|
|
||||||
ctx->append(childs);
|
ctx->append(childs);
|
||||||
|
|
||||||
if(stmt->stmt_if.as_list->stmts.size() == 1 && !gsc::node::is_special_stmt(stmt->stmt_if.as_list->stmts.at(0)))
|
if(stmt->stmt_if.as_list->stmts.size() == 1 && !gsc::node::is_special_stmt(stmt->stmt_if.as_list->stmts.at(0)))
|
||||||
@ -3127,11 +3149,27 @@ void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt
|
|||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
ctx->abort = gsc::abort_t::abort_break;
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void decompiler::process_stmt_continue(const gsc::context_ptr& ctx, const gsc::stmt_continue_ptr& stmt)
|
||||||
|
{
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void decompiler::process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt)
|
void decompiler::process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt)
|
||||||
{
|
{
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_return;
|
||||||
|
}
|
||||||
|
|
||||||
if(stmt->expr.as_node->type == gsc::node_t::null)
|
if(stmt->expr.as_node->type == gsc::node_t::null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
@ -67,6 +67,7 @@ private:
|
|||||||
void process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stmt_switch_ptr& stmt);
|
void process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stmt_switch_ptr& stmt);
|
||||||
void process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt);
|
void process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt);
|
||||||
void process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt);
|
void process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt);
|
||||||
|
void process_stmt_continue(const gsc::context_ptr& ctx, const gsc::stmt_continue_ptr& stmt);
|
||||||
void process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt);
|
void process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt);
|
||||||
void process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr);
|
void process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr);
|
||||||
void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
|
void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
|
||||||
|
@ -2858,6 +2858,9 @@ void decompiler::process_stmt_if(const gsc::context_ptr& ctx, const gsc::stmt_if
|
|||||||
|
|
||||||
void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stmt_ifelse_ptr& stmt)
|
void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stmt_ifelse_ptr& stmt)
|
||||||
{
|
{
|
||||||
|
std::vector<gsc::context*> childs;
|
||||||
|
auto abort = gsc::abort_t::abort_return;
|
||||||
|
|
||||||
process_expr(ctx, stmt->expr);
|
process_expr(ctx, stmt->expr);
|
||||||
|
|
||||||
stmt->ctx_if = std::make_unique<gsc::context>();
|
stmt->ctx_if = std::make_unique<gsc::context>();
|
||||||
@ -2865,12 +2868,30 @@ void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stm
|
|||||||
|
|
||||||
process_stmt(stmt->ctx_if, stmt->stmt_if);
|
process_stmt(stmt->ctx_if, stmt->stmt_if);
|
||||||
|
|
||||||
|
if(stmt->ctx_if->abort <= gsc::abort_t::abort_return)
|
||||||
|
{
|
||||||
|
abort = stmt->ctx_if->abort;
|
||||||
|
|
||||||
|
if(abort == gsc::abort_t::abort_none)
|
||||||
|
childs.push_back(stmt->ctx_if.get());
|
||||||
|
}
|
||||||
|
|
||||||
stmt->ctx_else = std::make_unique<gsc::context>();
|
stmt->ctx_else = std::make_unique<gsc::context>();
|
||||||
ctx->transfer_decompiler(stmt->ctx_else);
|
ctx->transfer_decompiler(stmt->ctx_else);
|
||||||
|
|
||||||
process_stmt(stmt->ctx_else, stmt->stmt_else);
|
process_stmt(stmt->ctx_else, stmt->stmt_else);
|
||||||
|
|
||||||
std::vector<gsc::context*> childs({stmt->ctx_if.get(), stmt->ctx_else.get()});
|
if(stmt->ctx_else->abort <= abort)
|
||||||
|
{
|
||||||
|
abort = stmt->ctx_else->abort;
|
||||||
|
|
||||||
|
if (abort == gsc::abort_t::abort_none)
|
||||||
|
childs.push_back(stmt->ctx_else.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
ctx->abort = abort;
|
||||||
|
|
||||||
ctx->append(childs);
|
ctx->append(childs);
|
||||||
|
|
||||||
if(stmt->stmt_if.as_list->stmts.size() == 1 && !gsc::node::is_special_stmt(stmt->stmt_if.as_list->stmts.at(0)))
|
if(stmt->stmt_if.as_list->stmts.size() == 1 && !gsc::node::is_special_stmt(stmt->stmt_if.as_list->stmts.at(0)))
|
||||||
@ -3014,11 +3035,27 @@ void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt
|
|||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
ctx->abort = gsc::abort_t::abort_break;
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void decompiler::process_stmt_continue(const gsc::context_ptr& ctx, const gsc::stmt_continue_ptr& stmt)
|
||||||
|
{
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void decompiler::process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt)
|
void decompiler::process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt)
|
||||||
{
|
{
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_return;
|
||||||
|
}
|
||||||
|
|
||||||
if(stmt->expr.as_node->type == gsc::node_t::null)
|
if(stmt->expr.as_node->type == gsc::node_t::null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
@ -67,6 +67,7 @@ private:
|
|||||||
void process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stmt_switch_ptr& stmt);
|
void process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stmt_switch_ptr& stmt);
|
||||||
void process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt);
|
void process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt);
|
||||||
void process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt);
|
void process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt);
|
||||||
|
void process_stmt_continue(const gsc::context_ptr& ctx, const gsc::stmt_continue_ptr& stmt);
|
||||||
void process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt);
|
void process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt);
|
||||||
void process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr);
|
void process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr);
|
||||||
void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
|
void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
|
||||||
|
@ -2858,6 +2858,9 @@ void decompiler::process_stmt_if(const gsc::context_ptr& ctx, const gsc::stmt_if
|
|||||||
|
|
||||||
void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stmt_ifelse_ptr& stmt)
|
void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stmt_ifelse_ptr& stmt)
|
||||||
{
|
{
|
||||||
|
std::vector<gsc::context*> childs;
|
||||||
|
auto abort = gsc::abort_t::abort_return;
|
||||||
|
|
||||||
process_expr(ctx, stmt->expr);
|
process_expr(ctx, stmt->expr);
|
||||||
|
|
||||||
stmt->ctx_if = std::make_unique<gsc::context>();
|
stmt->ctx_if = std::make_unique<gsc::context>();
|
||||||
@ -2865,12 +2868,30 @@ void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stm
|
|||||||
|
|
||||||
process_stmt(stmt->ctx_if, stmt->stmt_if);
|
process_stmt(stmt->ctx_if, stmt->stmt_if);
|
||||||
|
|
||||||
|
if(stmt->ctx_if->abort <= gsc::abort_t::abort_return)
|
||||||
|
{
|
||||||
|
abort = stmt->ctx_if->abort;
|
||||||
|
|
||||||
|
if(abort == gsc::abort_t::abort_none)
|
||||||
|
childs.push_back(stmt->ctx_if.get());
|
||||||
|
}
|
||||||
|
|
||||||
stmt->ctx_else = std::make_unique<gsc::context>();
|
stmt->ctx_else = std::make_unique<gsc::context>();
|
||||||
ctx->transfer_decompiler(stmt->ctx_else);
|
ctx->transfer_decompiler(stmt->ctx_else);
|
||||||
|
|
||||||
process_stmt(stmt->ctx_else, stmt->stmt_else);
|
process_stmt(stmt->ctx_else, stmt->stmt_else);
|
||||||
|
|
||||||
std::vector<gsc::context*> childs({stmt->ctx_if.get(), stmt->ctx_else.get()});
|
if(stmt->ctx_else->abort <= abort)
|
||||||
|
{
|
||||||
|
abort = stmt->ctx_else->abort;
|
||||||
|
|
||||||
|
if (abort == gsc::abort_t::abort_none)
|
||||||
|
childs.push_back(stmt->ctx_else.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
ctx->abort = abort;
|
||||||
|
|
||||||
ctx->append(childs);
|
ctx->append(childs);
|
||||||
|
|
||||||
if(stmt->stmt_if.as_list->stmts.size() == 1 && !gsc::node::is_special_stmt(stmt->stmt_if.as_list->stmts.at(0)))
|
if(stmt->stmt_if.as_list->stmts.size() == 1 && !gsc::node::is_special_stmt(stmt->stmt_if.as_list->stmts.at(0)))
|
||||||
@ -3014,11 +3035,27 @@ void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt
|
|||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
ctx->abort = gsc::abort_t::abort_break;
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void decompiler::process_stmt_continue(const gsc::context_ptr& ctx, const gsc::stmt_continue_ptr& stmt)
|
||||||
|
{
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void decompiler::process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt)
|
void decompiler::process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt)
|
||||||
{
|
{
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_return;
|
||||||
|
}
|
||||||
|
|
||||||
if(stmt->expr.as_node->type == gsc::node_t::null)
|
if(stmt->expr.as_node->type == gsc::node_t::null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
@ -67,6 +67,7 @@ private:
|
|||||||
void process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stmt_switch_ptr& stmt);
|
void process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stmt_switch_ptr& stmt);
|
||||||
void process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt);
|
void process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt);
|
||||||
void process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt);
|
void process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt);
|
||||||
|
void process_stmt_continue(const gsc::context_ptr& ctx, const gsc::stmt_continue_ptr& stmt);
|
||||||
void process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt);
|
void process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt);
|
||||||
void process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr);
|
void process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr);
|
||||||
void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
|
void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
|
||||||
|
@ -2914,6 +2914,9 @@ void decompiler::process_stmt_if(const gsc::context_ptr& ctx, const gsc::stmt_if
|
|||||||
|
|
||||||
void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stmt_ifelse_ptr& stmt)
|
void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stmt_ifelse_ptr& stmt)
|
||||||
{
|
{
|
||||||
|
std::vector<gsc::context*> childs;
|
||||||
|
auto abort = gsc::abort_t::abort_return;
|
||||||
|
|
||||||
process_expr(ctx, stmt->expr);
|
process_expr(ctx, stmt->expr);
|
||||||
|
|
||||||
stmt->ctx_if = std::make_unique<gsc::context>();
|
stmt->ctx_if = std::make_unique<gsc::context>();
|
||||||
@ -2921,12 +2924,30 @@ void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stm
|
|||||||
|
|
||||||
process_stmt(stmt->ctx_if, stmt->stmt_if);
|
process_stmt(stmt->ctx_if, stmt->stmt_if);
|
||||||
|
|
||||||
|
if(stmt->ctx_if->abort <= gsc::abort_t::abort_return)
|
||||||
|
{
|
||||||
|
abort = stmt->ctx_if->abort;
|
||||||
|
|
||||||
|
if(abort == gsc::abort_t::abort_none)
|
||||||
|
childs.push_back(stmt->ctx_if.get());
|
||||||
|
}
|
||||||
|
|
||||||
stmt->ctx_else = std::make_unique<gsc::context>();
|
stmt->ctx_else = std::make_unique<gsc::context>();
|
||||||
ctx->transfer_decompiler(stmt->ctx_else);
|
ctx->transfer_decompiler(stmt->ctx_else);
|
||||||
|
|
||||||
process_stmt(stmt->ctx_else, stmt->stmt_else);
|
process_stmt(stmt->ctx_else, stmt->stmt_else);
|
||||||
|
|
||||||
std::vector<gsc::context*> childs({stmt->ctx_if.get(), stmt->ctx_else.get()});
|
if(stmt->ctx_else->abort <= abort)
|
||||||
|
{
|
||||||
|
abort = stmt->ctx_else->abort;
|
||||||
|
|
||||||
|
if (abort == gsc::abort_t::abort_none)
|
||||||
|
childs.push_back(stmt->ctx_else.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
ctx->abort = abort;
|
||||||
|
|
||||||
ctx->append(childs);
|
ctx->append(childs);
|
||||||
|
|
||||||
if(stmt->stmt_if.as_list->stmts.size() == 1 && !gsc::node::is_special_stmt(stmt->stmt_if.as_list->stmts.at(0)))
|
if(stmt->stmt_if.as_list->stmts.size() == 1 && !gsc::node::is_special_stmt(stmt->stmt_if.as_list->stmts.at(0)))
|
||||||
@ -3070,11 +3091,27 @@ void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt
|
|||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
ctx->abort = gsc::abort_t::abort_break;
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void decompiler::process_stmt_continue(const gsc::context_ptr& ctx, const gsc::stmt_continue_ptr& stmt)
|
||||||
|
{
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void decompiler::process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt)
|
void decompiler::process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt)
|
||||||
{
|
{
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_return;
|
||||||
|
}
|
||||||
|
|
||||||
if(stmt->expr.as_node->type == gsc::node_t::null)
|
if(stmt->expr.as_node->type == gsc::node_t::null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
@ -67,6 +67,7 @@ private:
|
|||||||
void process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stmt_switch_ptr& stmt);
|
void process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stmt_switch_ptr& stmt);
|
||||||
void process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt);
|
void process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt);
|
||||||
void process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt);
|
void process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt);
|
||||||
|
void process_stmt_continue(const gsc::context_ptr& ctx, const gsc::stmt_continue_ptr& stmt);
|
||||||
void process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt);
|
void process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt);
|
||||||
void process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr);
|
void process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr);
|
||||||
void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
|
void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
|
||||||
|
@ -2864,6 +2864,9 @@ void decompiler::process_stmt_if(const gsc::context_ptr& ctx, const gsc::stmt_if
|
|||||||
|
|
||||||
void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stmt_ifelse_ptr& stmt)
|
void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stmt_ifelse_ptr& stmt)
|
||||||
{
|
{
|
||||||
|
std::vector<gsc::context*> childs;
|
||||||
|
auto abort = gsc::abort_t::abort_return;
|
||||||
|
|
||||||
process_expr(ctx, stmt->expr);
|
process_expr(ctx, stmt->expr);
|
||||||
|
|
||||||
stmt->ctx_if = std::make_unique<gsc::context>();
|
stmt->ctx_if = std::make_unique<gsc::context>();
|
||||||
@ -2871,12 +2874,30 @@ void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stm
|
|||||||
|
|
||||||
process_stmt(stmt->ctx_if, stmt->stmt_if);
|
process_stmt(stmt->ctx_if, stmt->stmt_if);
|
||||||
|
|
||||||
|
if(stmt->ctx_if->abort <= gsc::abort_t::abort_return)
|
||||||
|
{
|
||||||
|
abort = stmt->ctx_if->abort;
|
||||||
|
|
||||||
|
if(abort == gsc::abort_t::abort_none)
|
||||||
|
childs.push_back(stmt->ctx_if.get());
|
||||||
|
}
|
||||||
|
|
||||||
stmt->ctx_else = std::make_unique<gsc::context>();
|
stmt->ctx_else = std::make_unique<gsc::context>();
|
||||||
ctx->transfer_decompiler(stmt->ctx_else);
|
ctx->transfer_decompiler(stmt->ctx_else);
|
||||||
|
|
||||||
process_stmt(stmt->ctx_else, stmt->stmt_else);
|
process_stmt(stmt->ctx_else, stmt->stmt_else);
|
||||||
|
|
||||||
std::vector<gsc::context*> childs({stmt->ctx_if.get(), stmt->ctx_else.get()});
|
if(stmt->ctx_else->abort <= abort)
|
||||||
|
{
|
||||||
|
abort = stmt->ctx_else->abort;
|
||||||
|
|
||||||
|
if (abort == gsc::abort_t::abort_none)
|
||||||
|
childs.push_back(stmt->ctx_else.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
ctx->abort = abort;
|
||||||
|
|
||||||
ctx->append(childs);
|
ctx->append(childs);
|
||||||
|
|
||||||
if(stmt->stmt_if.as_list->stmts.size() == 1 && !gsc::node::is_special_stmt(stmt->stmt_if.as_list->stmts.at(0)))
|
if(stmt->stmt_if.as_list->stmts.size() == 1 && !gsc::node::is_special_stmt(stmt->stmt_if.as_list->stmts.at(0)))
|
||||||
@ -3020,11 +3041,27 @@ void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt
|
|||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
ctx->abort = gsc::abort_t::abort_break;
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void decompiler::process_stmt_continue(const gsc::context_ptr& ctx, const gsc::stmt_continue_ptr& stmt)
|
||||||
|
{
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void decompiler::process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt)
|
void decompiler::process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt)
|
||||||
{
|
{
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_return;
|
||||||
|
}
|
||||||
|
|
||||||
if(stmt->expr.as_node->type == gsc::node_t::null)
|
if(stmt->expr.as_node->type == gsc::node_t::null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
@ -67,6 +67,7 @@ private:
|
|||||||
void process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stmt_switch_ptr& stmt);
|
void process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stmt_switch_ptr& stmt);
|
||||||
void process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt);
|
void process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt);
|
||||||
void process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt);
|
void process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt);
|
||||||
|
void process_stmt_continue(const gsc::context_ptr& ctx, const gsc::stmt_continue_ptr& stmt);
|
||||||
void process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt);
|
void process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt);
|
||||||
void process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr);
|
void process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr);
|
||||||
void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
|
void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
|
||||||
|
@ -2873,6 +2873,9 @@ void decompiler::process_stmt_if(const gsc::context_ptr& ctx, const gsc::stmt_if
|
|||||||
|
|
||||||
void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stmt_ifelse_ptr& stmt)
|
void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stmt_ifelse_ptr& stmt)
|
||||||
{
|
{
|
||||||
|
std::vector<gsc::context*> childs;
|
||||||
|
auto abort = gsc::abort_t::abort_return;
|
||||||
|
|
||||||
process_expr(ctx, stmt->expr);
|
process_expr(ctx, stmt->expr);
|
||||||
|
|
||||||
stmt->ctx_if = std::make_unique<gsc::context>();
|
stmt->ctx_if = std::make_unique<gsc::context>();
|
||||||
@ -2880,12 +2883,30 @@ void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stm
|
|||||||
|
|
||||||
process_stmt(stmt->ctx_if, stmt->stmt_if);
|
process_stmt(stmt->ctx_if, stmt->stmt_if);
|
||||||
|
|
||||||
|
if(stmt->ctx_if->abort <= gsc::abort_t::abort_return)
|
||||||
|
{
|
||||||
|
abort = stmt->ctx_if->abort;
|
||||||
|
|
||||||
|
if(abort == gsc::abort_t::abort_none)
|
||||||
|
childs.push_back(stmt->ctx_if.get());
|
||||||
|
}
|
||||||
|
|
||||||
stmt->ctx_else = std::make_unique<gsc::context>();
|
stmt->ctx_else = std::make_unique<gsc::context>();
|
||||||
ctx->transfer_decompiler(stmt->ctx_else);
|
ctx->transfer_decompiler(stmt->ctx_else);
|
||||||
|
|
||||||
process_stmt(stmt->ctx_else, stmt->stmt_else);
|
process_stmt(stmt->ctx_else, stmt->stmt_else);
|
||||||
|
|
||||||
std::vector<gsc::context*> childs({stmt->ctx_if.get(), stmt->ctx_else.get()});
|
if(stmt->ctx_else->abort <= abort)
|
||||||
|
{
|
||||||
|
abort = stmt->ctx_else->abort;
|
||||||
|
|
||||||
|
if (abort == gsc::abort_t::abort_none)
|
||||||
|
childs.push_back(stmt->ctx_else.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
ctx->abort = abort;
|
||||||
|
|
||||||
ctx->append(childs);
|
ctx->append(childs);
|
||||||
|
|
||||||
if(stmt->stmt_if.as_list->stmts.size() == 1 && !gsc::node::is_special_stmt(stmt->stmt_if.as_list->stmts.at(0)))
|
if(stmt->stmt_if.as_list->stmts.size() == 1 && !gsc::node::is_special_stmt(stmt->stmt_if.as_list->stmts.at(0)))
|
||||||
@ -3029,11 +3050,27 @@ void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt
|
|||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
ctx->abort = gsc::abort_t::abort_break;
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void decompiler::process_stmt_continue(const gsc::context_ptr& ctx, const gsc::stmt_continue_ptr& stmt)
|
||||||
|
{
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void decompiler::process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt)
|
void decompiler::process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt)
|
||||||
{
|
{
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_return;
|
||||||
|
}
|
||||||
|
|
||||||
if(stmt->expr.as_node->type == gsc::node_t::null)
|
if(stmt->expr.as_node->type == gsc::node_t::null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
@ -67,6 +67,7 @@ private:
|
|||||||
void process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stmt_switch_ptr& stmt);
|
void process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stmt_switch_ptr& stmt);
|
||||||
void process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt);
|
void process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt);
|
||||||
void process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt);
|
void process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt);
|
||||||
|
void process_stmt_continue(const gsc::context_ptr& ctx, const gsc::stmt_continue_ptr& stmt);
|
||||||
void process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt);
|
void process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt);
|
||||||
void process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr);
|
void process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr);
|
||||||
void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
|
void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
|
||||||
|
@ -2914,6 +2914,9 @@ void decompiler::process_stmt_if(const gsc::context_ptr& ctx, const gsc::stmt_if
|
|||||||
|
|
||||||
void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stmt_ifelse_ptr& stmt)
|
void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stmt_ifelse_ptr& stmt)
|
||||||
{
|
{
|
||||||
|
std::vector<gsc::context*> childs;
|
||||||
|
auto abort = gsc::abort_t::abort_return;
|
||||||
|
|
||||||
process_expr(ctx, stmt->expr);
|
process_expr(ctx, stmt->expr);
|
||||||
|
|
||||||
stmt->ctx_if = std::make_unique<gsc::context>();
|
stmt->ctx_if = std::make_unique<gsc::context>();
|
||||||
@ -2921,12 +2924,30 @@ void decompiler::process_stmt_ifelse(const gsc::context_ptr& ctx, const gsc::stm
|
|||||||
|
|
||||||
process_stmt(stmt->ctx_if, stmt->stmt_if);
|
process_stmt(stmt->ctx_if, stmt->stmt_if);
|
||||||
|
|
||||||
|
if(stmt->ctx_if->abort <= gsc::abort_t::abort_return)
|
||||||
|
{
|
||||||
|
abort = stmt->ctx_if->abort;
|
||||||
|
|
||||||
|
if(abort == gsc::abort_t::abort_none)
|
||||||
|
childs.push_back(stmt->ctx_if.get());
|
||||||
|
}
|
||||||
|
|
||||||
stmt->ctx_else = std::make_unique<gsc::context>();
|
stmt->ctx_else = std::make_unique<gsc::context>();
|
||||||
ctx->transfer_decompiler(stmt->ctx_else);
|
ctx->transfer_decompiler(stmt->ctx_else);
|
||||||
|
|
||||||
process_stmt(stmt->ctx_else, stmt->stmt_else);
|
process_stmt(stmt->ctx_else, stmt->stmt_else);
|
||||||
|
|
||||||
std::vector<gsc::context*> childs({stmt->ctx_if.get(), stmt->ctx_else.get()});
|
if(stmt->ctx_else->abort <= abort)
|
||||||
|
{
|
||||||
|
abort = stmt->ctx_else->abort;
|
||||||
|
|
||||||
|
if (abort == gsc::abort_t::abort_none)
|
||||||
|
childs.push_back(stmt->ctx_else.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
ctx->abort = abort;
|
||||||
|
|
||||||
ctx->append(childs);
|
ctx->append(childs);
|
||||||
|
|
||||||
if(stmt->stmt_if.as_list->stmts.size() == 1 && !gsc::node::is_special_stmt(stmt->stmt_if.as_list->stmts.at(0)))
|
if(stmt->stmt_if.as_list->stmts.size() == 1 && !gsc::node::is_special_stmt(stmt->stmt_if.as_list->stmts.at(0)))
|
||||||
@ -3070,11 +3091,27 @@ void decompiler::process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt
|
|||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
ctx->abort = gsc::abort_t::abort_break;
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void decompiler::process_stmt_continue(const gsc::context_ptr& ctx, const gsc::stmt_continue_ptr& stmt)
|
||||||
|
{
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void decompiler::process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt)
|
void decompiler::process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt)
|
||||||
{
|
{
|
||||||
|
if(ctx->abort == gsc::abort_t::abort_none)
|
||||||
|
{
|
||||||
|
ctx->abort = gsc::abort_t::abort_return;
|
||||||
|
}
|
||||||
|
|
||||||
if(stmt->expr.as_node->type == gsc::node_t::null)
|
if(stmt->expr.as_node->type == gsc::node_t::null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
@ -67,6 +67,7 @@ private:
|
|||||||
void process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stmt_switch_ptr& stmt);
|
void process_stmt_switch(const gsc::context_ptr& ctx, const gsc::stmt_switch_ptr& stmt);
|
||||||
void process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt);
|
void process_stmt_cases(const gsc::context_ptr& ctx, const gsc::stmt_list_ptr& stmt);
|
||||||
void process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt);
|
void process_stmt_break(const gsc::context_ptr& ctx, const gsc::stmt_break_ptr& stmt);
|
||||||
|
void process_stmt_continue(const gsc::context_ptr& ctx, const gsc::stmt_continue_ptr& stmt);
|
||||||
void process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt);
|
void process_stmt_return(const gsc::context_ptr& ctx, const gsc::stmt_return_ptr& stmt);
|
||||||
void process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr);
|
void process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr);
|
||||||
void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
|
void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
|
||||||
|
Loading…
Reference in New Issue
Block a user