From: Rico Tzschichholz Date: Wed, 14 Dec 2022 16:22:44 +0000 (+0100) Subject: codegen: Use a special CCodeBinaryExpression for string comparisons X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a67d19f51082944e3751760d6c0ae09efc35b860;p=thirdparty%2Fvala.git codegen: Use a special CCodeBinaryExpression for string comparisons This preserves support for recursive replacement of arguments while this expression was actually transformed into a function call. --- diff --git a/ccode/Makefile.am b/ccode/Makefile.am index c87c5dd1d..f0062efe2 100644 --- a/ccode/Makefile.am +++ b/ccode/Makefile.am @@ -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 index 000000000..fdfd5b768 --- /dev/null +++ b/ccode/valaccodebinarycompareexpression.vala @@ -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 + */ + +/** + * 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); + } +} diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index c2eefe02c..2969679c9 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -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))); }