]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Use a special CCodeBinaryExpression for string comparisons
authorRico Tzschichholz <ricotz@ubuntu.com>
Wed, 14 Dec 2022 16:22:44 +0000 (17:22 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Thu, 22 Dec 2022 16:00:29 +0000 (17:00 +0100)
This preserves support for recursive replacement of arguments while this
expression was actually transformed into a function call.

ccode/Makefile.am
ccode/valaccodebinarycompareexpression.vala [new file with mode: 0644]
codegen/valaccodebasemodule.vala

index c87c5dd1d9cdbea1606b66c273070ae83df3fbfd..f0062efe2d9f08db901c6ab293539ea7a98ab414 100644 (file)
@@ -20,6 +20,7 @@ libvalaccode_la_VALASOURCES = \
        valaccode.vala \
        valaccodeassignment.vala \
        valaccodebinaryexpression.vala \
+       valaccodebinarycompareexpression.vala \
        valaccodeblock.vala \
        valaccodebreakstatement.vala \
        valaccodecasestatement.vala \
diff --git a/ccode/valaccodebinarycompareexpression.vala b/ccode/valaccodebinarycompareexpression.vala
new file mode 100644 (file)
index 0000000..fdfd5b7
--- /dev/null
@@ -0,0 +1,63 @@
+/* valaccodebinarycompareexpression.vala
+ *
+ * Copyright (C) 2022  Rico Tzschichholz
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+ *
+ * Author:
+ *     Rico Tzschichholz <ricotz@ubuntu.com>
+ */
+
+/**
+ * Represents an expression comparing two operands checking against a non-boolean result in C code.
+ */
+public class Vala.CCodeBinaryCompareExpression : CCodeBinaryExpression {
+       /**
+        * The compare function.
+        */
+       public CCodeExpression call { get; set; }
+
+       /**
+        * The expected result.
+        */
+       public CCodeExpression result { get; set; }
+
+       public CCodeBinaryCompareExpression (CCodeExpression cmp, CCodeBinaryOperator op, CCodeExpression l, CCodeExpression r, CCodeExpression res) {
+               base (op, l, r);
+               call = cmp;
+               result = res;
+       }
+
+       public override void write (CCodeWriter writer) {
+               call.write_inner (writer);
+               writer.write_string (" (");
+               left.write (writer);
+               writer.write_string (", ");
+               right.write (writer);
+               writer.write_string (")");
+
+               switch (operator) {
+               case CCodeBinaryOperator.LESS_THAN: writer.write_string (" < "); break;
+               case CCodeBinaryOperator.GREATER_THAN: writer.write_string (" > "); break;
+               case CCodeBinaryOperator.LESS_THAN_OR_EQUAL: writer.write_string (" <= "); break;
+               case CCodeBinaryOperator.GREATER_THAN_OR_EQUAL: writer.write_string (" >= "); break;
+               case CCodeBinaryOperator.EQUALITY: writer.write_string (" == "); break;
+               case CCodeBinaryOperator.INEQUALITY: writer.write_string (" != "); break;
+               default: assert_not_reached ();
+               }
+
+               result.write_inner (writer);
+       }
+}
index c2eefe02c5bfeff0bd1816c89ae6d227f858c565..2969679c927f24e45a85bf364bd500c1e1035a4c 100644 (file)
@@ -5912,24 +5912,23 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                        case BinaryOperator.GREATER_THAN:
                        case BinaryOperator.LESS_THAN_OR_EQUAL:
                        case BinaryOperator.GREATER_THAN_OR_EQUAL:
-                               CCodeFunctionCall ccall;
+                               CCodeExpression call;
                                if (context.profile == Profile.POSIX) {
                                        cfile.add_include ("string.h");
-                                       ccall = new CCodeFunctionCall (new CCodeIdentifier (generate_cmp_wrapper (new CCodeIdentifier ("strcmp"))));
+                                       call = new CCodeIdentifier (generate_cmp_wrapper (new CCodeIdentifier ("strcmp")));
                                } else {
-                                       ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_strcmp0"));
+                                       call = new CCodeIdentifier ("g_strcmp0");
                                }
-                               ccall.add_argument (cleft);
-                               ccall.add_argument (cright);
-                               cleft = ccall;
-                               cright = new CCodeConstant ("0");
+                               set_cvalue (expr, new CCodeBinaryCompareExpression (call, op, cleft, cright, new CCodeConstant ("0")));
                                break;
                        default:
+                               set_cvalue (expr, new CCodeBinaryExpression (op, cleft, cright));
                                break;
                        }
+               } else {
+                       set_cvalue (expr, new CCodeBinaryExpression (op, cleft, cright));
                }
 
-               set_cvalue (expr, new CCodeBinaryExpression (op, cleft, cright));
                if (left_chain != null) {
                        set_cvalue (expr, new CCodeBinaryExpression (CCodeBinaryOperator.AND, left_chain, get_cvalue (expr)));
                }