From: Rico Tzschichholz Date: Tue, 26 Mar 2019 12:00:01 +0000 (+0100) Subject: codegen: Handle "modulo" operation on floating-types in CCodeAssignmentModule X-Git-Tag: 0.45.1~81 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=126dee3b683fa4cf9d9f5c4ed33f97d2b2e7daea;p=thirdparty%2Fvala.git codegen: Handle "modulo" operation on floating-types in CCodeAssignmentModule Duplication with CCodeBaseModule.visit_binary_expression() See https://gitlab.gnome.org/GNOME/vala/issues/755 --- 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"));