TargetValue emit_simple_assignment(Assignment assignment) { Variable variable = (Variable)assignment.left.symbol_reference; if (requires_destroy(assignment.left.value_type)) { /* unref old value */ ccode.add_expression(destroy_value(assignment.left.target_value)); } if (assignment.Operator == AssignmentOperator.SIMPLE) { store_value(assignment.left.target_value, assignment.right.target_value, assignment.source_reference); } else { CCodeAssignmentOperator cop = (CCodeAssignmentOperator)0; if (assignment.Operator == AssignmentOperator.BITWISE_OR) { cop = CCodeAssignmentOperator.BITWISE_OR; } else if (assignment.Operator == AssignmentOperator.BITWISE_AND) { cop = CCodeAssignmentOperator.BITWISE_AND; } else if (assignment.Operator == AssignmentOperator.BITWISE_XOR) { cop = CCodeAssignmentOperator.BITWISE_XOR; } else if (assignment.Operator == AssignmentOperator.ADD) { cop = CCodeAssignmentOperator.ADD; } else if (assignment.Operator == AssignmentOperator.SUB) { cop = CCodeAssignmentOperator.SUB; } else if (assignment.Operator == AssignmentOperator.MUL) { cop = CCodeAssignmentOperator.MUL; } else if (assignment.Operator == AssignmentOperator.DIV) { cop = CCodeAssignmentOperator.DIV; } else if (assignment.Operator == AssignmentOperator.PERCENT) { cop = CCodeAssignmentOperator.PERCENT; } else if (assignment.Operator == AssignmentOperator.SHIFT_LEFT) { cop = CCodeAssignmentOperator.SHIFT_LEFT; } else if (assignment.Operator == AssignmentOperator.SHIFT_RIGHT) { cop = CCodeAssignmentOperator.SHIFT_RIGHT; } else { assert_not_reached(); } CCodeExpression codenode = new CCodeAssignment(get_cvalue(assignment.left), get_cvalue(assignment.right), cop); ccode.add_expression(codenode); } if (assignment.left.value_type is ArrayType && (((ArrayType)assignment.left.value_type).inline_allocated)) { return load_variable(variable, assignment.left.target_value); } else { return store_temp_value(assignment.left.target_value, assignment); } }
public CCodeAssignment(CCodeExpression l, CCodeExpression r, CCodeAssignmentOperator op = CCodeAssignmentOperator.SIMPLE) { left = l; Operator = op; right = r; }