decompiler assign ops implementation

This commit is contained in:
xensik 2021-05-09 16:01:38 +02:00
parent 7ce2add85b
commit 302e8ab0b1
16 changed files with 553 additions and 177 deletions

View File

@ -546,7 +546,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
break; break;
case opcode::OP_ScriptLocalMethodChildThreadCall: case opcode::OP_ScriptLocalMethodChildThreadCall:
{ {
// TODO: child things...
auto obj = gsc::expr_ptr(std::move(stack_.top())); auto obj = gsc::expr_ptr(std::move(stack_.top()));
stack_.pop(); stack_.pop();
loc = obj.as_node->loc; loc = obj.as_node->loc;
@ -1395,7 +1394,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
stack_.pop(); stack_.pop();
args->loc = node->loc; args->loc = node->loc;
args->list.push_back(std::move(node)); args->list.push_back(std::move(node));
} }
loc = args->loc; loc = args->loc;
@ -1425,9 +1423,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
} }
break; break;
case opcode::OP_checkclearparams: case opcode::OP_checkclearparams:
{
// no needed
}
break; break;
case opcode::OP_notify: case opcode::OP_notify:
{ {
@ -1736,9 +1731,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
break; break;
case opcode::OP_CastFieldObject: case opcode::OP_CastFieldObject:
case opcode::OP_CastBool: case opcode::OP_CastBool:
{
//continue;
}
break; break;
case opcode::OP_BoolNot: case opcode::OP_BoolNot:
{ {
@ -1780,7 +1772,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
{ {
auto expr = std::make_unique<gsc::node_asm_jump>(loc, inst->data[0]); auto expr = std::make_unique<gsc::node_asm_jump>(loc, inst->data[0]);
func_->block->stmts.push_back(gsc::stmt_ptr(std::move(expr))); func_->block->stmts.push_back(gsc::stmt_ptr(std::move(expr)));
} }
break; break;
case opcode::OP_jumpback: case opcode::OP_jumpback:
@ -1871,20 +1862,6 @@ void decompiler::decompile_block(const gsc::stmt_list_ptr& block)
this->decompile_search_switch(block); this->decompile_search_switch(block);
this->decompile_search_ifelse(block); this->decompile_search_ifelse(block);
this->decompile_break_continue(block); this->decompile_break_continue(block);
this->decompile_nulls(block);
}
void decompiler::decompile_nulls(const gsc::stmt_list_ptr& block)
{
auto index = 0;
while(index < block->stmts.size())
{
if(block->stmts.at(index).as_node->type == gsc::node_t::null)
{
block->stmts.erase(block->stmts.begin() + index);
}
else index++;
}
} }
void decompiler::decompile_search_infinite(const gsc::stmt_list_ptr& block) void decompiler::decompile_search_infinite(const gsc::stmt_list_ptr& block)
@ -2991,7 +2968,7 @@ void decompiler::process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr)
} }
} }
void decompiler::process_expr_assign(const gsc::context_ptr& ctx, const gsc::expr_assign_ptr& expr) void decompiler::process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr)
{ {
if(expr->type == gsc::node_t::expr_increment) if(expr->type == gsc::node_t::expr_increment)
{ {
@ -3005,6 +2982,55 @@ void decompiler::process_expr_assign(const gsc::context_ptr& ctx, const gsc::exp
{ {
process_expr(ctx, expr->rvalue); process_expr(ctx, expr->rvalue);
process_expr(ctx, expr->lvalue); process_expr(ctx, expr->lvalue);
if(expr->type == gsc::node_t::expr_assign_equal)
{
switch(expr->rvalue.as_node->type)
{
case gsc::node_t::expr_bitwise_or:
if(expr->lvalue == expr->rvalue.as_bitwise_or->lvalue)
expr = std::make_unique<gsc::node_expr_assign_bitwise_or>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_bitwise_and:
if(expr->lvalue == expr->rvalue.as_bitwise_and->lvalue)
expr = std::make_unique<gsc::node_expr_assign_bitwise_and>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_bitwise_exor:
if(expr->lvalue == expr->rvalue.as_bitwise_exor->lvalue)
expr = std::make_unique<gsc::node_expr_assign_bitwise_exor>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_shift_left:
if(expr->lvalue == expr->rvalue.as_shift_left->lvalue)
expr = std::make_unique<gsc::node_expr_assign_shift_left>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_shift_right:
if(expr->lvalue == expr->rvalue.as_shift_right->lvalue)
expr = std::make_unique<gsc::node_expr_assign_shift_right>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_add:
if(expr->lvalue == expr->rvalue.as_add->lvalue)
expr = std::make_unique<gsc::node_expr_assign_add>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_sub:
if(expr->lvalue == expr->rvalue.as_sub->lvalue)
expr = std::make_unique<gsc::node_expr_assign_sub>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_mult:
if(expr->lvalue == expr->rvalue.as_mult->lvalue)
expr = std::make_unique<gsc::node_expr_assign_mult>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_div:
if(expr->lvalue == expr->rvalue.as_div->lvalue)
expr = std::make_unique<gsc::node_expr_assign_div>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_mod:
if(expr->lvalue == expr->rvalue.as_mod->lvalue)
expr = std::make_unique<gsc::node_expr_assign_mod>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
default:
break;
}
}
} }
} }

View File

@ -68,7 +68,7 @@ private:
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_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, const gsc::expr_assign_ptr& expr); void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
void process_expr_binary(const gsc::context_ptr& ctx, const gsc::expr_binary_ptr& expr); void process_expr_binary(const gsc::context_ptr& ctx, const gsc::expr_binary_ptr& expr);
void process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr); void process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr);
void process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr); void process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr);

View File

@ -546,7 +546,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
break; break;
case opcode::OP_ScriptLocalMethodChildThreadCall: case opcode::OP_ScriptLocalMethodChildThreadCall:
{ {
// TODO: child things...
auto obj = gsc::expr_ptr(std::move(stack_.top())); auto obj = gsc::expr_ptr(std::move(stack_.top()));
stack_.pop(); stack_.pop();
loc = obj.as_node->loc; loc = obj.as_node->loc;
@ -1395,7 +1394,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
stack_.pop(); stack_.pop();
args->loc = node->loc; args->loc = node->loc;
args->list.push_back(std::move(node)); args->list.push_back(std::move(node));
} }
loc = args->loc; loc = args->loc;
@ -1425,9 +1423,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
} }
break; break;
case opcode::OP_checkclearparams: case opcode::OP_checkclearparams:
{
// no needed
}
break; break;
case opcode::OP_notify: case opcode::OP_notify:
{ {
@ -1736,9 +1731,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
break; break;
case opcode::OP_CastFieldObject: case opcode::OP_CastFieldObject:
case opcode::OP_CastBool: case opcode::OP_CastBool:
{
//continue;
}
break; break;
case opcode::OP_BoolNot: case opcode::OP_BoolNot:
{ {
@ -1780,7 +1772,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
{ {
auto expr = std::make_unique<gsc::node_asm_jump>(loc, inst->data[0]); auto expr = std::make_unique<gsc::node_asm_jump>(loc, inst->data[0]);
func_->block->stmts.push_back(gsc::stmt_ptr(std::move(expr))); func_->block->stmts.push_back(gsc::stmt_ptr(std::move(expr)));
} }
break; break;
case opcode::OP_jumpback: case opcode::OP_jumpback:
@ -1871,20 +1862,6 @@ void decompiler::decompile_block(const gsc::stmt_list_ptr& block)
this->decompile_search_switch(block); this->decompile_search_switch(block);
this->decompile_search_ifelse(block); this->decompile_search_ifelse(block);
this->decompile_break_continue(block); this->decompile_break_continue(block);
this->decompile_nulls(block);
}
void decompiler::decompile_nulls(const gsc::stmt_list_ptr& block)
{
auto index = 0;
while(index < block->stmts.size())
{
if(block->stmts.at(index).as_node->type == gsc::node_t::null)
{
block->stmts.erase(block->stmts.begin() + index);
}
else index++;
}
} }
void decompiler::decompile_search_infinite(const gsc::stmt_list_ptr& block) void decompiler::decompile_search_infinite(const gsc::stmt_list_ptr& block)
@ -2991,7 +2968,7 @@ void decompiler::process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr)
} }
} }
void decompiler::process_expr_assign(const gsc::context_ptr& ctx, const gsc::expr_assign_ptr& expr) void decompiler::process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr)
{ {
if(expr->type == gsc::node_t::expr_increment) if(expr->type == gsc::node_t::expr_increment)
{ {
@ -3005,6 +2982,55 @@ void decompiler::process_expr_assign(const gsc::context_ptr& ctx, const gsc::exp
{ {
process_expr(ctx, expr->rvalue); process_expr(ctx, expr->rvalue);
process_expr(ctx, expr->lvalue); process_expr(ctx, expr->lvalue);
if(expr->type == gsc::node_t::expr_assign_equal)
{
switch(expr->rvalue.as_node->type)
{
case gsc::node_t::expr_bitwise_or:
if(expr->lvalue == expr->rvalue.as_bitwise_or->lvalue)
expr = std::make_unique<gsc::node_expr_assign_bitwise_or>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_bitwise_and:
if(expr->lvalue == expr->rvalue.as_bitwise_and->lvalue)
expr = std::make_unique<gsc::node_expr_assign_bitwise_and>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_bitwise_exor:
if(expr->lvalue == expr->rvalue.as_bitwise_exor->lvalue)
expr = std::make_unique<gsc::node_expr_assign_bitwise_exor>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_shift_left:
if(expr->lvalue == expr->rvalue.as_shift_left->lvalue)
expr = std::make_unique<gsc::node_expr_assign_shift_left>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_shift_right:
if(expr->lvalue == expr->rvalue.as_shift_right->lvalue)
expr = std::make_unique<gsc::node_expr_assign_shift_right>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_add:
if(expr->lvalue == expr->rvalue.as_add->lvalue)
expr = std::make_unique<gsc::node_expr_assign_add>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_sub:
if(expr->lvalue == expr->rvalue.as_sub->lvalue)
expr = std::make_unique<gsc::node_expr_assign_sub>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_mult:
if(expr->lvalue == expr->rvalue.as_mult->lvalue)
expr = std::make_unique<gsc::node_expr_assign_mult>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_div:
if(expr->lvalue == expr->rvalue.as_div->lvalue)
expr = std::make_unique<gsc::node_expr_assign_div>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_mod:
if(expr->lvalue == expr->rvalue.as_mod->lvalue)
expr = std::make_unique<gsc::node_expr_assign_mod>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
default:
break;
}
}
} }
} }

View File

@ -68,7 +68,7 @@ private:
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_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, const gsc::expr_assign_ptr& expr); void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
void process_expr_binary(const gsc::context_ptr& ctx, const gsc::expr_binary_ptr& expr); void process_expr_binary(const gsc::context_ptr& ctx, const gsc::expr_binary_ptr& expr);
void process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr); void process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr);
void process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr); void process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr);

View File

@ -546,7 +546,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
break; break;
case opcode::OP_ScriptLocalMethodChildThreadCall: case opcode::OP_ScriptLocalMethodChildThreadCall:
{ {
// TODO: child things...
auto obj = gsc::expr_ptr(std::move(stack_.top())); auto obj = gsc::expr_ptr(std::move(stack_.top()));
stack_.pop(); stack_.pop();
loc = obj.as_node->loc; loc = obj.as_node->loc;
@ -1389,7 +1388,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
stack_.pop(); stack_.pop();
args->loc = node->loc; args->loc = node->loc;
args->list.push_back(std::move(node)); args->list.push_back(std::move(node));
} }
loc = args->loc; loc = args->loc;
@ -1419,9 +1417,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
} }
break; break;
case opcode::OP_checkclearparams: case opcode::OP_checkclearparams:
{
// no needed
}
break; break;
case opcode::OP_notify: case opcode::OP_notify:
{ {
@ -1730,9 +1725,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
break; break;
case opcode::OP_CastFieldObject: case opcode::OP_CastFieldObject:
case opcode::OP_CastBool: case opcode::OP_CastBool:
{
//continue;
}
break; break;
case opcode::OP_BoolNot: case opcode::OP_BoolNot:
{ {
@ -1774,7 +1766,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
{ {
auto expr = std::make_unique<gsc::node_asm_jump>(loc, inst->data[0]); auto expr = std::make_unique<gsc::node_asm_jump>(loc, inst->data[0]);
func_->block->stmts.push_back(gsc::stmt_ptr(std::move(expr))); func_->block->stmts.push_back(gsc::stmt_ptr(std::move(expr)));
} }
break; break;
case opcode::OP_jumpback: case opcode::OP_jumpback:
@ -1865,20 +1856,6 @@ void decompiler::decompile_block(const gsc::stmt_list_ptr& block)
this->decompile_search_switch(block); this->decompile_search_switch(block);
this->decompile_search_ifelse(block); this->decompile_search_ifelse(block);
this->decompile_break_continue(block); this->decompile_break_continue(block);
this->decompile_nulls(block);
}
void decompiler::decompile_nulls(const gsc::stmt_list_ptr& block)
{
auto index = 0;
while(index < block->stmts.size())
{
if(block->stmts.at(index).as_node->type == gsc::node_t::null)
{
block->stmts.erase(block->stmts.begin() + index);
}
else index++;
}
} }
void decompiler::decompile_search_infinite(const gsc::stmt_list_ptr& block) void decompiler::decompile_search_infinite(const gsc::stmt_list_ptr& block)
@ -2985,7 +2962,7 @@ void decompiler::process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr)
} }
} }
void decompiler::process_expr_assign(const gsc::context_ptr& ctx, const gsc::expr_assign_ptr& expr) void decompiler::process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr)
{ {
if(expr->type == gsc::node_t::expr_increment) if(expr->type == gsc::node_t::expr_increment)
{ {
@ -2999,6 +2976,55 @@ void decompiler::process_expr_assign(const gsc::context_ptr& ctx, const gsc::exp
{ {
process_expr(ctx, expr->rvalue); process_expr(ctx, expr->rvalue);
process_expr(ctx, expr->lvalue); process_expr(ctx, expr->lvalue);
if(expr->type == gsc::node_t::expr_assign_equal)
{
switch(expr->rvalue.as_node->type)
{
case gsc::node_t::expr_bitwise_or:
if(expr->lvalue == expr->rvalue.as_bitwise_or->lvalue)
expr = std::make_unique<gsc::node_expr_assign_bitwise_or>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_bitwise_and:
if(expr->lvalue == expr->rvalue.as_bitwise_and->lvalue)
expr = std::make_unique<gsc::node_expr_assign_bitwise_and>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_bitwise_exor:
if(expr->lvalue == expr->rvalue.as_bitwise_exor->lvalue)
expr = std::make_unique<gsc::node_expr_assign_bitwise_exor>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_shift_left:
if(expr->lvalue == expr->rvalue.as_shift_left->lvalue)
expr = std::make_unique<gsc::node_expr_assign_shift_left>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_shift_right:
if(expr->lvalue == expr->rvalue.as_shift_right->lvalue)
expr = std::make_unique<gsc::node_expr_assign_shift_right>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_add:
if(expr->lvalue == expr->rvalue.as_add->lvalue)
expr = std::make_unique<gsc::node_expr_assign_add>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_sub:
if(expr->lvalue == expr->rvalue.as_sub->lvalue)
expr = std::make_unique<gsc::node_expr_assign_sub>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_mult:
if(expr->lvalue == expr->rvalue.as_mult->lvalue)
expr = std::make_unique<gsc::node_expr_assign_mult>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_div:
if(expr->lvalue == expr->rvalue.as_div->lvalue)
expr = std::make_unique<gsc::node_expr_assign_div>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_mod:
if(expr->lvalue == expr->rvalue.as_mod->lvalue)
expr = std::make_unique<gsc::node_expr_assign_mod>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
default:
break;
}
}
} }
} }

View File

@ -68,7 +68,7 @@ private:
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_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, const gsc::expr_assign_ptr& expr); void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
void process_expr_binary(const gsc::context_ptr& ctx, const gsc::expr_binary_ptr& expr); void process_expr_binary(const gsc::context_ptr& ctx, const gsc::expr_binary_ptr& expr);
void process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr); void process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr);
void process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr); void process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr);

View File

@ -546,7 +546,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
break; break;
case opcode::OP_ScriptLocalMethodChildThreadCall: case opcode::OP_ScriptLocalMethodChildThreadCall:
{ {
// TODO: child things...
auto obj = gsc::expr_ptr(std::move(stack_.top())); auto obj = gsc::expr_ptr(std::move(stack_.top()));
stack_.pop(); stack_.pop();
loc = obj.as_node->loc; loc = obj.as_node->loc;
@ -1389,7 +1388,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
stack_.pop(); stack_.pop();
args->loc = node->loc; args->loc = node->loc;
args->list.push_back(std::move(node)); args->list.push_back(std::move(node));
} }
loc = args->loc; loc = args->loc;
@ -1419,9 +1417,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
} }
break; break;
case opcode::OP_checkclearparams: case opcode::OP_checkclearparams:
{
// no needed
}
break; break;
case opcode::OP_notify: case opcode::OP_notify:
{ {
@ -1730,9 +1725,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
break; break;
case opcode::OP_CastFieldObject: case opcode::OP_CastFieldObject:
case opcode::OP_CastBool: case opcode::OP_CastBool:
{
//continue;
}
break; break;
case opcode::OP_BoolNot: case opcode::OP_BoolNot:
{ {
@ -1774,7 +1766,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
{ {
auto expr = std::make_unique<gsc::node_asm_jump>(loc, inst->data[0]); auto expr = std::make_unique<gsc::node_asm_jump>(loc, inst->data[0]);
func_->block->stmts.push_back(gsc::stmt_ptr(std::move(expr))); func_->block->stmts.push_back(gsc::stmt_ptr(std::move(expr)));
} }
break; break;
case opcode::OP_jumpback: case opcode::OP_jumpback:
@ -1865,20 +1856,6 @@ void decompiler::decompile_block(const gsc::stmt_list_ptr& block)
this->decompile_search_switch(block); this->decompile_search_switch(block);
this->decompile_search_ifelse(block); this->decompile_search_ifelse(block);
this->decompile_break_continue(block); this->decompile_break_continue(block);
this->decompile_nulls(block);
}
void decompiler::decompile_nulls(const gsc::stmt_list_ptr& block)
{
auto index = 0;
while(index < block->stmts.size())
{
if(block->stmts.at(index).as_node->type == gsc::node_t::null)
{
block->stmts.erase(block->stmts.begin() + index);
}
else index++;
}
} }
void decompiler::decompile_search_infinite(const gsc::stmt_list_ptr& block) void decompiler::decompile_search_infinite(const gsc::stmt_list_ptr& block)
@ -2985,7 +2962,7 @@ void decompiler::process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr)
} }
} }
void decompiler::process_expr_assign(const gsc::context_ptr& ctx, const gsc::expr_assign_ptr& expr) void decompiler::process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr)
{ {
if(expr->type == gsc::node_t::expr_increment) if(expr->type == gsc::node_t::expr_increment)
{ {
@ -2999,6 +2976,55 @@ void decompiler::process_expr_assign(const gsc::context_ptr& ctx, const gsc::exp
{ {
process_expr(ctx, expr->rvalue); process_expr(ctx, expr->rvalue);
process_expr(ctx, expr->lvalue); process_expr(ctx, expr->lvalue);
if(expr->type == gsc::node_t::expr_assign_equal)
{
switch(expr->rvalue.as_node->type)
{
case gsc::node_t::expr_bitwise_or:
if(expr->lvalue == expr->rvalue.as_bitwise_or->lvalue)
expr = std::make_unique<gsc::node_expr_assign_bitwise_or>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_bitwise_and:
if(expr->lvalue == expr->rvalue.as_bitwise_and->lvalue)
expr = std::make_unique<gsc::node_expr_assign_bitwise_and>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_bitwise_exor:
if(expr->lvalue == expr->rvalue.as_bitwise_exor->lvalue)
expr = std::make_unique<gsc::node_expr_assign_bitwise_exor>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_shift_left:
if(expr->lvalue == expr->rvalue.as_shift_left->lvalue)
expr = std::make_unique<gsc::node_expr_assign_shift_left>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_shift_right:
if(expr->lvalue == expr->rvalue.as_shift_right->lvalue)
expr = std::make_unique<gsc::node_expr_assign_shift_right>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_add:
if(expr->lvalue == expr->rvalue.as_add->lvalue)
expr = std::make_unique<gsc::node_expr_assign_add>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_sub:
if(expr->lvalue == expr->rvalue.as_sub->lvalue)
expr = std::make_unique<gsc::node_expr_assign_sub>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_mult:
if(expr->lvalue == expr->rvalue.as_mult->lvalue)
expr = std::make_unique<gsc::node_expr_assign_mult>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_div:
if(expr->lvalue == expr->rvalue.as_div->lvalue)
expr = std::make_unique<gsc::node_expr_assign_div>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_mod:
if(expr->lvalue == expr->rvalue.as_mod->lvalue)
expr = std::make_unique<gsc::node_expr_assign_mod>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
default:
break;
}
}
} }
} }

View File

@ -68,7 +68,7 @@ private:
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_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, const gsc::expr_assign_ptr& expr); void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
void process_expr_binary(const gsc::context_ptr& ctx, const gsc::expr_binary_ptr& expr); void process_expr_binary(const gsc::context_ptr& ctx, const gsc::expr_binary_ptr& expr);
void process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr); void process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr);
void process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr); void process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr);

View File

@ -546,7 +546,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
break; break;
case opcode::OP_ScriptLocalMethodChildThreadCall: case opcode::OP_ScriptLocalMethodChildThreadCall:
{ {
// TODO: child things...
auto obj = gsc::expr_ptr(std::move(stack_.top())); auto obj = gsc::expr_ptr(std::move(stack_.top()));
stack_.pop(); stack_.pop();
loc = obj.as_node->loc; loc = obj.as_node->loc;
@ -1389,7 +1388,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
stack_.pop(); stack_.pop();
args->loc = node->loc; args->loc = node->loc;
args->list.push_back(std::move(node)); args->list.push_back(std::move(node));
} }
loc = args->loc; loc = args->loc;
@ -1419,9 +1417,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
} }
break; break;
case opcode::OP_checkclearparams: case opcode::OP_checkclearparams:
{
// no needed
}
break; break;
case opcode::OP_notify: case opcode::OP_notify:
{ {
@ -1730,9 +1725,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
break; break;
case opcode::OP_CastFieldObject: case opcode::OP_CastFieldObject:
case opcode::OP_CastBool: case opcode::OP_CastBool:
{
//continue;
}
break; break;
case opcode::OP_BoolNot: case opcode::OP_BoolNot:
{ {
@ -1774,7 +1766,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
{ {
auto expr = std::make_unique<gsc::node_asm_jump>(loc, inst->data[0]); auto expr = std::make_unique<gsc::node_asm_jump>(loc, inst->data[0]);
func_->block->stmts.push_back(gsc::stmt_ptr(std::move(expr))); func_->block->stmts.push_back(gsc::stmt_ptr(std::move(expr)));
} }
break; break;
case opcode::OP_jumpback: case opcode::OP_jumpback:
@ -1865,20 +1856,6 @@ void decompiler::decompile_block(const gsc::stmt_list_ptr& block)
this->decompile_search_switch(block); this->decompile_search_switch(block);
this->decompile_search_ifelse(block); this->decompile_search_ifelse(block);
this->decompile_break_continue(block); this->decompile_break_continue(block);
this->decompile_nulls(block);
}
void decompiler::decompile_nulls(const gsc::stmt_list_ptr& block)
{
auto index = 0;
while(index < block->stmts.size())
{
if(block->stmts.at(index).as_node->type == gsc::node_t::null)
{
block->stmts.erase(block->stmts.begin() + index);
}
else index++;
}
} }
void decompiler::decompile_search_infinite(const gsc::stmt_list_ptr& block) void decompiler::decompile_search_infinite(const gsc::stmt_list_ptr& block)
@ -2985,7 +2962,7 @@ void decompiler::process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr)
} }
} }
void decompiler::process_expr_assign(const gsc::context_ptr& ctx, const gsc::expr_assign_ptr& expr) void decompiler::process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr)
{ {
if(expr->type == gsc::node_t::expr_increment) if(expr->type == gsc::node_t::expr_increment)
{ {
@ -2999,6 +2976,55 @@ void decompiler::process_expr_assign(const gsc::context_ptr& ctx, const gsc::exp
{ {
process_expr(ctx, expr->rvalue); process_expr(ctx, expr->rvalue);
process_expr(ctx, expr->lvalue); process_expr(ctx, expr->lvalue);
if(expr->type == gsc::node_t::expr_assign_equal)
{
switch(expr->rvalue.as_node->type)
{
case gsc::node_t::expr_bitwise_or:
if(expr->lvalue == expr->rvalue.as_bitwise_or->lvalue)
expr = std::make_unique<gsc::node_expr_assign_bitwise_or>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_bitwise_and:
if(expr->lvalue == expr->rvalue.as_bitwise_and->lvalue)
expr = std::make_unique<gsc::node_expr_assign_bitwise_and>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_bitwise_exor:
if(expr->lvalue == expr->rvalue.as_bitwise_exor->lvalue)
expr = std::make_unique<gsc::node_expr_assign_bitwise_exor>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_shift_left:
if(expr->lvalue == expr->rvalue.as_shift_left->lvalue)
expr = std::make_unique<gsc::node_expr_assign_shift_left>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_shift_right:
if(expr->lvalue == expr->rvalue.as_shift_right->lvalue)
expr = std::make_unique<gsc::node_expr_assign_shift_right>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_add:
if(expr->lvalue == expr->rvalue.as_add->lvalue)
expr = std::make_unique<gsc::node_expr_assign_add>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_sub:
if(expr->lvalue == expr->rvalue.as_sub->lvalue)
expr = std::make_unique<gsc::node_expr_assign_sub>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_mult:
if(expr->lvalue == expr->rvalue.as_mult->lvalue)
expr = std::make_unique<gsc::node_expr_assign_mult>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_div:
if(expr->lvalue == expr->rvalue.as_div->lvalue)
expr = std::make_unique<gsc::node_expr_assign_div>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_mod:
if(expr->lvalue == expr->rvalue.as_mod->lvalue)
expr = std::make_unique<gsc::node_expr_assign_mod>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
default:
break;
}
}
} }
} }

View File

@ -68,7 +68,7 @@ private:
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_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, const gsc::expr_assign_ptr& expr); void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
void process_expr_binary(const gsc::context_ptr& ctx, const gsc::expr_binary_ptr& expr); void process_expr_binary(const gsc::context_ptr& ctx, const gsc::expr_binary_ptr& expr);
void process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr); void process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr);
void process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr); void process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr);

View File

@ -546,7 +546,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
break; break;
case opcode::OP_ScriptLocalMethodChildThreadCall: case opcode::OP_ScriptLocalMethodChildThreadCall:
{ {
// TODO: child things...
auto obj = gsc::expr_ptr(std::move(stack_.top())); auto obj = gsc::expr_ptr(std::move(stack_.top()));
stack_.pop(); stack_.pop();
loc = obj.as_node->loc; loc = obj.as_node->loc;
@ -1395,7 +1394,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
stack_.pop(); stack_.pop();
args->loc = node->loc; args->loc = node->loc;
args->list.push_back(std::move(node)); args->list.push_back(std::move(node));
} }
loc = args->loc; loc = args->loc;
@ -1425,9 +1423,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
} }
break; break;
case opcode::OP_checkclearparams: case opcode::OP_checkclearparams:
{
// no needed
}
break; break;
case opcode::OP_notify: case opcode::OP_notify:
{ {
@ -1736,9 +1731,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
break; break;
case opcode::OP_CastFieldObject: case opcode::OP_CastFieldObject:
case opcode::OP_CastBool: case opcode::OP_CastBool:
{
//continue;
}
break; break;
case opcode::OP_BoolNot: case opcode::OP_BoolNot:
{ {
@ -1780,7 +1772,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
{ {
auto expr = std::make_unique<gsc::node_asm_jump>(loc, inst->data[0]); auto expr = std::make_unique<gsc::node_asm_jump>(loc, inst->data[0]);
func_->block->stmts.push_back(gsc::stmt_ptr(std::move(expr))); func_->block->stmts.push_back(gsc::stmt_ptr(std::move(expr)));
} }
break; break;
case opcode::OP_jumpback: case opcode::OP_jumpback:
@ -1871,20 +1862,6 @@ void decompiler::decompile_block(const gsc::stmt_list_ptr& block)
this->decompile_search_switch(block); this->decompile_search_switch(block);
this->decompile_search_ifelse(block); this->decompile_search_ifelse(block);
this->decompile_break_continue(block); this->decompile_break_continue(block);
this->decompile_nulls(block);
}
void decompiler::decompile_nulls(const gsc::stmt_list_ptr& block)
{
auto index = 0;
while(index < block->stmts.size())
{
if(block->stmts.at(index).as_node->type == gsc::node_t::null)
{
block->stmts.erase(block->stmts.begin() + index);
}
else index++;
}
} }
void decompiler::decompile_search_infinite(const gsc::stmt_list_ptr& block) void decompiler::decompile_search_infinite(const gsc::stmt_list_ptr& block)
@ -2991,7 +2968,7 @@ void decompiler::process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr)
} }
} }
void decompiler::process_expr_assign(const gsc::context_ptr& ctx, const gsc::expr_assign_ptr& expr) void decompiler::process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr)
{ {
if(expr->type == gsc::node_t::expr_increment) if(expr->type == gsc::node_t::expr_increment)
{ {
@ -3005,6 +2982,55 @@ void decompiler::process_expr_assign(const gsc::context_ptr& ctx, const gsc::exp
{ {
process_expr(ctx, expr->rvalue); process_expr(ctx, expr->rvalue);
process_expr(ctx, expr->lvalue); process_expr(ctx, expr->lvalue);
if(expr->type == gsc::node_t::expr_assign_equal)
{
switch(expr->rvalue.as_node->type)
{
case gsc::node_t::expr_bitwise_or:
if(expr->lvalue == expr->rvalue.as_bitwise_or->lvalue)
expr = std::make_unique<gsc::node_expr_assign_bitwise_or>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_bitwise_and:
if(expr->lvalue == expr->rvalue.as_bitwise_and->lvalue)
expr = std::make_unique<gsc::node_expr_assign_bitwise_and>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_bitwise_exor:
if(expr->lvalue == expr->rvalue.as_bitwise_exor->lvalue)
expr = std::make_unique<gsc::node_expr_assign_bitwise_exor>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_shift_left:
if(expr->lvalue == expr->rvalue.as_shift_left->lvalue)
expr = std::make_unique<gsc::node_expr_assign_shift_left>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_shift_right:
if(expr->lvalue == expr->rvalue.as_shift_right->lvalue)
expr = std::make_unique<gsc::node_expr_assign_shift_right>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_add:
if(expr->lvalue == expr->rvalue.as_add->lvalue)
expr = std::make_unique<gsc::node_expr_assign_add>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_sub:
if(expr->lvalue == expr->rvalue.as_sub->lvalue)
expr = std::make_unique<gsc::node_expr_assign_sub>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_mult:
if(expr->lvalue == expr->rvalue.as_mult->lvalue)
expr = std::make_unique<gsc::node_expr_assign_mult>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_div:
if(expr->lvalue == expr->rvalue.as_div->lvalue)
expr = std::make_unique<gsc::node_expr_assign_div>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_mod:
if(expr->lvalue == expr->rvalue.as_mod->lvalue)
expr = std::make_unique<gsc::node_expr_assign_mod>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
default:
break;
}
}
} }
} }

View File

@ -68,7 +68,7 @@ private:
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_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, const gsc::expr_assign_ptr& expr); void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
void process_expr_binary(const gsc::context_ptr& ctx, const gsc::expr_binary_ptr& expr); void process_expr_binary(const gsc::context_ptr& ctx, const gsc::expr_binary_ptr& expr);
void process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr); void process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr);
void process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr); void process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr);

View File

@ -546,7 +546,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
break; break;
case opcode::OP_ScriptLocalMethodChildThreadCall: case opcode::OP_ScriptLocalMethodChildThreadCall:
{ {
// TODO: child things...
auto obj = gsc::expr_ptr(std::move(stack_.top())); auto obj = gsc::expr_ptr(std::move(stack_.top()));
stack_.pop(); stack_.pop();
loc = obj.as_node->loc; loc = obj.as_node->loc;
@ -1395,7 +1394,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
stack_.pop(); stack_.pop();
args->loc = node->loc; args->loc = node->loc;
args->list.push_back(std::move(node)); args->list.push_back(std::move(node));
} }
loc = args->loc; loc = args->loc;
@ -1425,9 +1423,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
} }
break; break;
case opcode::OP_checkclearparams: case opcode::OP_checkclearparams:
{
// no needed
}
break; break;
case opcode::OP_notify: case opcode::OP_notify:
{ {
@ -1736,9 +1731,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
break; break;
case opcode::OP_CastFieldObject: case opcode::OP_CastFieldObject:
case opcode::OP_CastBool: case opcode::OP_CastBool:
{
//continue;
}
break; break;
case opcode::OP_BoolNot: case opcode::OP_BoolNot:
{ {
@ -1780,7 +1772,6 @@ void decompiler::decompile_statements(const gsc::function_ptr& func)
{ {
auto expr = std::make_unique<gsc::node_asm_jump>(loc, inst->data[0]); auto expr = std::make_unique<gsc::node_asm_jump>(loc, inst->data[0]);
func_->block->stmts.push_back(gsc::stmt_ptr(std::move(expr))); func_->block->stmts.push_back(gsc::stmt_ptr(std::move(expr)));
} }
break; break;
case opcode::OP_jumpback: case opcode::OP_jumpback:
@ -1880,20 +1871,6 @@ void decompiler::decompile_block(const gsc::stmt_list_ptr& block)
this->decompile_search_switch(block); this->decompile_search_switch(block);
this->decompile_search_ifelse(block); this->decompile_search_ifelse(block);
this->decompile_break_continue(block); this->decompile_break_continue(block);
this->decompile_nulls(block);
}
void decompiler::decompile_nulls(const gsc::stmt_list_ptr& block)
{
auto index = 0;
while(index < block->stmts.size())
{
if(block->stmts.at(index).as_node->type == gsc::node_t::null)
{
block->stmts.erase(block->stmts.begin() + index);
}
else index++;
}
} }
void decompiler::decompile_search_infinite(const gsc::stmt_list_ptr& block) void decompiler::decompile_search_infinite(const gsc::stmt_list_ptr& block)
@ -3000,7 +2977,7 @@ void decompiler::process_expr(const gsc::context_ptr& ctx, gsc::expr_ptr& expr)
} }
} }
void decompiler::process_expr_assign(const gsc::context_ptr& ctx, const gsc::expr_assign_ptr& expr) void decompiler::process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr)
{ {
if(expr->type == gsc::node_t::expr_increment) if(expr->type == gsc::node_t::expr_increment)
{ {
@ -3014,6 +2991,55 @@ void decompiler::process_expr_assign(const gsc::context_ptr& ctx, const gsc::exp
{ {
process_expr(ctx, expr->rvalue); process_expr(ctx, expr->rvalue);
process_expr(ctx, expr->lvalue); process_expr(ctx, expr->lvalue);
if(expr->type == gsc::node_t::expr_assign_equal)
{
switch(expr->rvalue.as_node->type)
{
case gsc::node_t::expr_bitwise_or:
if(expr->lvalue == expr->rvalue.as_bitwise_or->lvalue)
expr = std::make_unique<gsc::node_expr_assign_bitwise_or>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_bitwise_and:
if(expr->lvalue == expr->rvalue.as_bitwise_and->lvalue)
expr = std::make_unique<gsc::node_expr_assign_bitwise_and>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_bitwise_exor:
if(expr->lvalue == expr->rvalue.as_bitwise_exor->lvalue)
expr = std::make_unique<gsc::node_expr_assign_bitwise_exor>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_shift_left:
if(expr->lvalue == expr->rvalue.as_shift_left->lvalue)
expr = std::make_unique<gsc::node_expr_assign_shift_left>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_shift_right:
if(expr->lvalue == expr->rvalue.as_shift_right->lvalue)
expr = std::make_unique<gsc::node_expr_assign_shift_right>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_add:
if(expr->lvalue == expr->rvalue.as_add->lvalue)
expr = std::make_unique<gsc::node_expr_assign_add>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_sub:
if(expr->lvalue == expr->rvalue.as_sub->lvalue)
expr = std::make_unique<gsc::node_expr_assign_sub>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_mult:
if(expr->lvalue == expr->rvalue.as_mult->lvalue)
expr = std::make_unique<gsc::node_expr_assign_mult>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_div:
if(expr->lvalue == expr->rvalue.as_div->lvalue)
expr = std::make_unique<gsc::node_expr_assign_div>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
case gsc::node_t::expr_mod:
if(expr->lvalue == expr->rvalue.as_mod->lvalue)
expr = std::make_unique<gsc::node_expr_assign_mod>(std::move(expr->lvalue), std::move(expr->rvalue.as_mod->rvalue));
break;
default:
break;
}
}
} }
} }

View File

@ -68,7 +68,7 @@ private:
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_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, const gsc::expr_assign_ptr& expr); void process_expr_assign(const gsc::context_ptr& ctx, gsc::expr_assign_ptr& expr);
void process_expr_binary(const gsc::context_ptr& ctx, const gsc::expr_binary_ptr& expr); void process_expr_binary(const gsc::context_ptr& ctx, const gsc::expr_binary_ptr& expr);
void process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr); void process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr);
void process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr); void process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr);

View File

@ -29,6 +29,7 @@ enum class node_t
data_undefined, data_undefined,
data_empty_array, data_empty_array,
data_thisthread, data_thisthread,
expr_paren,
expr_size, expr_size,
expr_field, expr_field,
expr_array, expr_array,
@ -134,6 +135,7 @@ struct node_game;
struct node_undefined; struct node_undefined;
struct node_empty_array; struct node_empty_array;
struct node_thisthread; struct node_thisthread;
struct node_expr_paren;
struct node_expr_size; struct node_expr_size;
struct node_expr_field; struct node_expr_field;
struct node_expr_array; struct node_expr_array;
@ -237,6 +239,7 @@ using game_ptr = std::unique_ptr<node_game>;
using undefined_ptr = std::unique_ptr<node_undefined>; using undefined_ptr = std::unique_ptr<node_undefined>;
using empty_array_ptr = std::unique_ptr<node_empty_array>; using empty_array_ptr = std::unique_ptr<node_empty_array>;
using thisthread_ptr = std::unique_ptr<node_thisthread>; using thisthread_ptr = std::unique_ptr<node_thisthread>;
using expr_paren_ptr = std::unique_ptr<node_expr_paren>;
using expr_size_ptr = std::unique_ptr<node_expr_size>; using expr_size_ptr = std::unique_ptr<node_expr_size>;
using expr_field_ptr = std::unique_ptr<node_expr_field>; using expr_field_ptr = std::unique_ptr<node_expr_field>;
using expr_array_ptr = std::unique_ptr<node_expr_array>; using expr_array_ptr = std::unique_ptr<node_expr_array>;
@ -354,6 +357,7 @@ union expr_ptr
undefined_ptr as_undefined; undefined_ptr as_undefined;
empty_array_ptr as_empty_array; empty_array_ptr as_empty_array;
thisthread_ptr as_thisthread; thisthread_ptr as_thisthread;
expr_paren_ptr as_paren;
expr_size_ptr as_size; expr_size_ptr as_size;
expr_field_ptr as_field; expr_field_ptr as_field;
expr_array_ptr as_array; expr_array_ptr as_array;
@ -408,12 +412,15 @@ union expr_ptr
new(&as_node) node_ptr(std::move(val.as_node)); new(&as_node) node_ptr(std::move(val.as_node));
} }
~expr_ptr(){}
expr_ptr& operator=(expr_ptr && val) expr_ptr& operator=(expr_ptr && val)
{ {
new(&as_node) node_ptr(std::move(val.as_node)); new(&as_node) node_ptr(std::move(val.as_node));
return *(expr_ptr*)&as_node; return *(expr_ptr*)&as_node;
} }
~expr_ptr(){}
bool operator==(const expr_ptr& rhs) const;
}; };
union stmt_ptr union stmt_ptr
@ -542,6 +549,11 @@ struct node_true : public node
{ {
return "true"; return "true";
} }
friend bool operator==(const node_true& lhs, const node_true& rhs)
{
return true;
}
}; };
struct node_false : public node struct node_false : public node
@ -553,6 +565,11 @@ struct node_false : public node
{ {
return "false"; return "false";
} }
friend bool operator==(const node_false& lhs, const node_false& rhs)
{
return true;
}
}; };
struct node_integer : public node struct node_integer : public node
@ -569,6 +586,11 @@ struct node_integer : public node
{ {
return value; return value;
} }
friend bool operator==(const node_integer& lhs, const node_integer& rhs)
{
return lhs.value == rhs.value;
}
}; };
struct node_float : public node struct node_float : public node
@ -585,6 +607,11 @@ struct node_float : public node
{ {
return value; return value;
} }
friend bool operator==(const node_float& lhs, const node_float& rhs)
{
return lhs.value == rhs.value;
}
}; };
struct node_vector : public node struct node_vector : public node
@ -603,6 +630,11 @@ struct node_vector : public node
{ {
return "( "s + x.as_node->print() + ", " + y.as_node->print() + ", "+ z.as_node->print() + " )"; return "( "s + x.as_node->print() + ", " + y.as_node->print() + ", "+ z.as_node->print() + " )";
} }
friend bool operator==(const node_vector& lhs, const node_vector& rhs)
{
return lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z;
}
}; };
struct node_string : public node struct node_string : public node
@ -619,6 +651,11 @@ struct node_string : public node
{ {
return value; return value;
} }
friend bool operator==(const node_string& lhs, const node_string& rhs)
{
return lhs.value == rhs.value;
}
}; };
struct node_istring : public node struct node_istring : public node
@ -635,6 +672,11 @@ struct node_istring : public node
{ {
return "&"s += value; return "&"s += value;
} }
friend bool operator==(const node_istring& lhs, const node_istring& rhs)
{
return lhs.value == rhs.value;
}
}; };
struct node_file : public node struct node_file : public node
@ -656,6 +698,11 @@ struct node_file : public node
{ {
return value; return value;
} }
friend bool operator==(const node_file& lhs, const node_file& rhs)
{
return lhs.value == rhs.value;
}
}; };
struct node_name : public node struct node_name : public node
@ -672,6 +719,11 @@ struct node_name : public node
{ {
return value; return value;
} }
friend bool operator==(const node_name& lhs, const node_name& rhs)
{
return lhs.value == rhs.value;
}
}; };
struct node_animtree : public node struct node_animtree : public node
@ -684,6 +736,11 @@ struct node_animtree : public node
{ {
return "#animtree"; return "#animtree";
} }
friend bool operator==(const node_animtree& lhs, const node_animtree& rhs)
{
return true;
}
}; };
struct node_animation : public node struct node_animation : public node
@ -700,6 +757,11 @@ struct node_animation : public node
{ {
return "%"s += value; return "%"s += value;
} }
friend bool operator==(const node_animation& lhs, const node_animation& rhs)
{
return lhs.value == rhs.value;
}
}; };
struct node_level : public node struct node_level : public node
@ -712,6 +774,11 @@ struct node_level : public node
{ {
return "level"; return "level";
} }
friend bool operator==(const node_level& lhs, const node_level& rhs)
{
return true;
}
}; };
struct node_anim : public node struct node_anim : public node
@ -724,6 +791,11 @@ struct node_anim : public node
{ {
return "anim"; return "anim";
} }
friend bool operator==(const node_anim& lhs, const node_anim& rhs)
{
return true;
}
}; };
struct node_self : public node struct node_self : public node
@ -736,6 +808,11 @@ struct node_self : public node
{ {
return "self"; return "self";
} }
friend bool operator==(const node_self& lhs, const node_self& rhs)
{
return true;
}
}; };
struct node_game : public node struct node_game : public node
@ -748,6 +825,11 @@ struct node_game : public node
{ {
return "game"; return "game";
} }
friend bool operator==(const node_game& lhs, const node_game& rhs)
{
return true;
}
}; };
struct node_undefined : public node struct node_undefined : public node
@ -760,6 +842,11 @@ struct node_undefined : public node
{ {
return "undefined"; return "undefined";
} }
friend bool operator==(const node_undefined& lhs, const node_undefined& rhs)
{
return true;
}
}; };
struct node_empty_array : public node struct node_empty_array : public node
@ -772,6 +859,11 @@ struct node_empty_array : public node
{ {
return "[]"; return "[]";
} }
friend bool operator==(const node_empty_array& lhs, const node_empty_array& rhs)
{
return true;
}
}; };
struct node_thisthread : public node struct node_thisthread : public node
@ -784,6 +876,32 @@ struct node_thisthread : public node
{ {
return "thisthread"; return "thisthread";
} }
friend bool operator==(const node_thisthread& lhs, const node_thisthread& rhs)
{
return true;
}
};
struct node_expr_paren : public node
{
expr_ptr expr;
node_expr_paren(expr_ptr expr)
: node(node_t::expr_paren), expr(std::move(expr)) {}
node_expr_paren(const location& loc, expr_ptr expr)
: node(node_t::expr_paren, loc), expr(std::move(expr)) {}
auto print() -> std::string override
{
return "(" + expr.as_node->print() + ")";
}
friend bool operator==(const node_expr_paren& lhs, const node_expr_paren& rhs)
{
return lhs.expr == rhs.expr;
}
}; };
struct node_expr_size : public node struct node_expr_size : public node
@ -800,6 +918,11 @@ struct node_expr_size : public node
{ {
return obj.as_node->print() + ".size"; return obj.as_node->print() + ".size";
} }
friend bool operator==(const node_expr_size& lhs, const node_expr_size& rhs)
{
return lhs.obj == rhs.obj;
}
}; };
struct node_expr_field : public node struct node_expr_field : public node
@ -817,6 +940,11 @@ struct node_expr_field : public node
{ {
return obj.as_node->print() + "." + field->print(); return obj.as_node->print() + "." + field->print();
} }
friend bool operator==(const node_expr_field& lhs, const node_expr_field& rhs)
{
return lhs.obj == rhs.obj && lhs.field == rhs.field;
}
}; };
struct node_expr_array : public node struct node_expr_array : public node
@ -834,6 +962,11 @@ struct node_expr_array : public node
{ {
return obj.as_node->print() + "[" + key.as_node->print() + "]"; return obj.as_node->print() + "[" + key.as_node->print() + "]";
} }
friend bool operator==(const node_expr_array& lhs, const node_expr_array& rhs)
{
return lhs.obj == rhs.obj && lhs.key == rhs.key;
}
}; };
struct node_expr_arguments : public node struct node_expr_arguments : public node

View File

@ -5,4 +5,65 @@
#include "stdafx.hpp" #include "stdafx.hpp"
std::uint32_t xsk::gsc::node::indent_; namespace xsk
{
std::uint32_t gsc::node::indent_;
bool gsc::expr_ptr::operator==(const gsc::expr_ptr& rhs) const
{
if(as_node->type != rhs.as_node->type)
return false;
switch(as_node->type)
{
case gsc::node_t::data_true:
return *as_true == *rhs.as_true;
case gsc::node_t::data_false:
return *as_false == *rhs.as_false;
case gsc::node_t::data_integer:
return *as_integer == *rhs.as_integer;
case gsc::node_t::data_float:
return *as_float == *rhs.as_float;
case gsc::node_t::data_vector:
return *as_vector == *rhs.as_vector;
case gsc::node_t::data_string:
return *as_string == *rhs.as_string;
case gsc::node_t::data_istring:
return *as_istring == *rhs.as_istring;
case gsc::node_t::data_file:
return *as_file == *rhs.as_file;
case gsc::node_t::data_name:
return *as_name == *rhs.as_name;
case gsc::node_t::data_animtree:
return *as_animtree == *rhs.as_animtree;
case gsc::node_t::data_animation:
return *as_animation == *rhs.as_animation;
case gsc::node_t::data_level:
return *as_level == *rhs.as_level;
case gsc::node_t::data_anim:
return *as_anim == *rhs.as_anim;
case gsc::node_t::data_self:
return *as_self == *rhs.as_self;
case gsc::node_t::data_game:
return *as_game == *rhs.as_game;
case gsc::node_t::data_undefined:
return *as_undefined == *rhs.as_undefined;
case gsc::node_t::data_empty_array:
return *as_empty_array == *rhs.as_empty_array;
case gsc::node_t::data_thisthread:
return *as_thisthread == *rhs.as_thisthread;
case gsc::node_t::expr_paren:
return *as_paren == *rhs.as_paren;
case gsc::node_t::expr_size:
return *as_size == *rhs.as_size;
case gsc::node_t::expr_field:
return *as_field == *rhs.as_field;
case gsc::node_t::expr_array:
return *as_array == *rhs.as_array;
default:
return false;
}
}
} // namespace xsk