예제 #1
0
		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);
			}
		}
예제 #2
0
 public CCodeAssignment(CCodeExpression l, CCodeExpression r, CCodeAssignmentOperator op = CCodeAssignmentOperator.SIMPLE)
 {
     left     = l;
     Operator = op;
     right    = r;
 }