[vala/0.54] codegen: Clear existing length values when revisiting a slice expression



commit f98c094c0fcbf1b8a09d6faf3b93e78026304e4a
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Wed Jan 5 20:45:10 2022 +0100

    codegen: Clear existing length values when revisiting a slice expression
    
    Fixes https://gitlab.gnome.org/GNOME/vala/issues/1274

 codegen/valaccodearraymodule.vala |  3 ++-
 codegen/valaglibvalue.vala        | 11 +++++++++++
 2 files changed, 13 insertions(+), 1 deletion(-)
---
diff --git a/codegen/valaccodearraymodule.vala b/codegen/valaccodearraymodule.vala
index b2707ff8d..632b26046 100644
--- a/codegen/valaccodearraymodule.vala
+++ b/codegen/valaccodearraymodule.vala
@@ -210,7 +210,8 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                var splicelen = new CCodeBinaryExpression (CCodeBinaryOperator.MINUS, cstop, cstart);
 
                set_cvalue (expr, cstartpointer);
-               append_array_length (expr, splicelen);
+               // Make sure no previous length values are preserved
+               set_array_length (expr, splicelen);
        }
 
        void append_struct_array_free_loop (Struct st) {
diff --git a/codegen/valaglibvalue.vala b/codegen/valaglibvalue.vala
index ed095cf83..acd8ac9d7 100644
--- a/codegen/valaglibvalue.vala
+++ b/codegen/valaglibvalue.vala
@@ -142,6 +142,17 @@ namespace Vala {
                glib_value.append_array_length_cvalue (size);
        }
 
+       public static void set_array_length (Expression expr, CCodeExpression size) {
+               unowned GLibValue? glib_value = (GLibValue) expr.target_value;
+               if (glib_value == null) {
+                       expr.target_value = new GLibValue (expr.value_type);
+                       glib_value = (GLibValue) expr.target_value;
+               } else {
+                       glib_value.array_length_cvalues = null;
+               }
+               glib_value.append_array_length_cvalue (size);
+       }
+
        public static unowned List<CCodeExpression>? get_array_lengths (Expression expr) {
                unowned GLibValue? glib_value = (GLibValue) expr.target_value;
                if (glib_value == null) {


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