StatementAssign * StatementAssign::make_possible_compound_assign(CGContext &cg_context, const Lhs &l, eAssignOps op, const Expression &e) { eBinaryOps bop = compound_to_binary_ops(op); const Expression *rhs = NULL; SafeOpFlags *fs = NULL; std::string tmp1; std::string tmp2; if (bop != MAX_BINARY_OP) { //SafeOpFlags *local_fs = SafeOpFlags::make_random(sOpAssign, true); SafeOpFlags *local_fs = NULL; FunctionInvocation* fi = NULL; if (safe_assign(op)) { local_fs = SafeOpFlags::make_dummy_flags(); fi = new FunctionInvocationBinary(bop, local_fs); } else { local_fs = SafeOpFlags::make_random(sOpAssign); fi = FunctionInvocationBinary::CreateFunctionInvocationBinary(cg_context, bop, local_fs); tmp1 = dynamic_cast<FunctionInvocationBinary*>(fi)->get_tmp_var1(); tmp2 = dynamic_cast<FunctionInvocationBinary*>(fi)->get_tmp_var2(); } fs = local_fs->clone(); fi->add_operand(new ExpressionVariable(*(l.get_var()), &l.get_type())); fi->add_operand(e.clone()); rhs = new ExpressionFuncall(*fi); } else { rhs = &e; #if 0 if (e.term_type == eFunction) { const ExpressionFuncall* func = dynamic_cast<const ExpressionFuncall*>(&e); if (!func->get_invoke().safe_invocation()) { fs = SafeOpFlags::make_dummy_flags(); fs = NULL; } } #endif if (op != eSimpleAssign) { fs = SafeOpFlags::make_random(sOpAssign); bool op1 = fs->get_op1_sign(); bool op2 = fs->get_op2_sign(); enum SafeOpSize size = fs->get_op_size(); eSimpleType type1 = SafeOpFlags::flags_to_type(op1, size); eSimpleType type2 = SafeOpFlags::flags_to_type(op2, size); const Block *blk = cg_context.get_current_block(); assert(blk); tmp1 = blk->create_new_tmp_var(type1); tmp2 = blk->create_new_tmp_var(type2); } } StatementAssign *sa = new StatementAssign(cg_context.get_current_block(), l, op, e, rhs, fs, tmp1, tmp2); return sa; }