diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2022-12-14 17:22:44 +0100 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2022-12-22 17:00:29 +0100 |
commit | a67d19f51082944e3751760d6c0ae09efc35b860 (patch) | |
tree | 1c6ad3be7cfbff441d290f572b65f38ff339dd78 /ccode | |
parent | 144566870cb7263ba7827459bf2ec2a9aa86e193 (diff) | |
download | vala-a67d19f51082944e3751760d6c0ae09efc35b860.tar.gz |
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.
Diffstat (limited to 'ccode')
-rw-r--r-- | ccode/Makefile.am | 1 | ||||
-rw-r--r-- | ccode/valaccodebinarycompareexpression.vala | 63 |
2 files changed, 64 insertions, 0 deletions
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 <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); + } +} |