[vala/staging] codegen: Handle "modulo" operation on floating-types in CCodeAssignmentModule



commit 126dee3b683fa4cf9d9f5c4ed33f97d2b2e7daea
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Tue Mar 26 13:00:01 2019 +0100

    codegen: Handle "modulo" operation on floating-types in CCodeAssignmentModule
    
    Duplication with CCodeBaseModule.visit_binary_expression()
    
    See https://gitlab.gnome.org/GNOME/vala/issues/755

 codegen/valaccodeassignmentmodule.vala | 23 ++++++++++++++++++++++-
 codegen/valaccodebasemodule.vala       |  1 +
 2 files changed, 23 insertions(+), 1 deletion(-)
---
diff --git a/codegen/valaccodeassignmentmodule.vala b/codegen/valaccodeassignmentmodule.vala
index 96a47524e..617293b0a 100644
--- a/codegen/valaccodeassignmentmodule.vala
+++ b/codegen/valaccodeassignmentmodule.vala
@@ -49,7 +49,28 @@ public class Vala.CCodeAssignmentModule : CCodeMemberAccessModule {
                        case AssignmentOperator.SUB: cop = CCodeAssignmentOperator.SUB; break;
                        case AssignmentOperator.MUL: cop = CCodeAssignmentOperator.MUL; break;
                        case AssignmentOperator.DIV: cop = CCodeAssignmentOperator.DIV; break;
-                       case AssignmentOperator.PERCENT: cop = CCodeAssignmentOperator.PERCENT; break;
+                       case AssignmentOperator.PERCENT:
+                               // FIXME Code duplication with CCodeBaseModule.visit_binary_expression()
+                               var cleft = get_cvalue (assignment.left);
+                               var cright = get_cvalue (assignment.right);
+                               if (assignment.value_type.equals (double_type)) {
+                                       cfile.add_include ("math.h");
+                                       var ccall = new CCodeFunctionCall (new CCodeIdentifier ("fmod"));
+                                       ccall.add_argument (cleft);
+                                       ccall.add_argument (cright);
+                                       set_cvalue (assignment.right, ccall);
+                                       cop = CCodeAssignmentOperator.SIMPLE;
+                               } else if (assignment.value_type.equals (float_type)) {
+                                       cfile.add_include ("math.h");
+                                       var ccall = new CCodeFunctionCall (new CCodeIdentifier ("fmodf"));
+                                       ccall.add_argument (cleft);
+                                       ccall.add_argument (cright);
+                                       set_cvalue (assignment.right, ccall);
+                                       cop = CCodeAssignmentOperator.SIMPLE;
+                               } else {
+                                       cop = CCodeAssignmentOperator.PERCENT;
+                               }
+                               break;
                        case AssignmentOperator.SHIFT_LEFT: cop = CCodeAssignmentOperator.SHIFT_LEFT; break;
                        case AssignmentOperator.SHIFT_RIGHT: cop = CCodeAssignmentOperator.SHIFT_RIGHT; break;
                        default: assert_not_reached ();
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 8e9863aed..62fd66554 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -5471,6 +5471,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                        op = CCodeBinaryOperator.DIV;
                        break;
                case BinaryOperator.MOD:
+                       // FIXME Code duplication with CCodeAssignmentModule.emit_simple_assignment()
                        if (expr.value_type.equals (double_type)) {
                                cfile.add_include ("math.h");
                                var ccall = new CCodeFunctionCall (new CCodeIdentifier ("fmod"));


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]