]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
gvariant: Use actual destroy_func when creating GHashTable
authorSergey Bugaev <bugaevc@gmail.com>
Sat, 7 Jun 2025 20:06:24 +0000 (23:06 +0300)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sat, 16 May 2026 12:12:54 +0000 (14:12 +0200)
Instead of hard-coding a few known types, use the actual destroy_func
for the type. This will now do the right thing for (nullable) structs.

codegen/valagvariantmodule.vala
tests/basic-types/gvariants-unboxing-safe.c-expected
tests/dbus/bug782719_client.c-expected
tests/dbus/dicts_client.c-expected
tests/dbus/dicts_server.c-expected
tests/dbus/type-mismatch_client.c-expected
tests/dbus/type-mismatch_server.c-expected

index af90ad4daa5d1f8a58491f4357c71ddcf70b920a..9254e68787802ed1da342c218331b8c56d2b6f6e 100644 (file)
@@ -509,25 +509,9 @@ public class Vala.GVariantModule : GValueModule {
                        hash_table_new.add_argument (new CCodeIdentifier ("g_direct_equal"));
                }
 
-               if (key_type.type_symbol.is_subtype_of (string_type.type_symbol)) {
-                       hash_table_new.add_argument (new CCodeIdentifier ("g_free"));
-               } else if (key_type.type_symbol == gvariant_type) {
-                       hash_table_new.add_argument (new CCodeCastExpression (new CCodeIdentifier ("g_variant_unref"), "GDestroyNotify"));
-               } else if (key_type.type_symbol.get_full_name () == "GLib.HashTable") {
-                       hash_table_new.add_argument (new CCodeCastExpression (new CCodeIdentifier ("g_hash_table_unref"), "GDestroyNotify"));
-               } else {
-                       hash_table_new.add_argument (new CCodeConstant ("NULL"));
-               }
+               hash_table_new.add_argument (new CCodeCastExpression (get_destroy_func_expression (key_type), "GDestroyNotify"));
+               hash_table_new.add_argument (new CCodeCastExpression (get_destroy_func_expression (value_type), "GDestroyNotify"));
 
-               if (value_type.type_symbol.is_subtype_of (string_type.type_symbol)) {
-                       hash_table_new.add_argument (new CCodeIdentifier ("g_free"));
-               } else if (value_type.type_symbol == gvariant_type) {
-                       hash_table_new.add_argument (new CCodeCastExpression (new CCodeIdentifier ("g_variant_unref"), "GDestroyNotify"));
-               } else if (value_type.type_symbol.get_full_name () == "GLib.HashTable") {
-                       hash_table_new.add_argument (new CCodeCastExpression (new CCodeIdentifier ("g_hash_table_unref"), "GDestroyNotify"));
-               } else {
-                       hash_table_new.add_argument (new CCodeConstant ("NULL"));
-               }
                ccode.add_assignment (new CCodeIdentifier (temp_name), hash_table_new);
 
                var iter_call = new CCodeFunctionCall (new CCodeIdentifier ("g_variant_iter_init"));
index 2c587db10827af728aec0cc2e5ee42254cf6c564..ffc46698632b942af6190ffd49bebe5a4d331d2e 100644 (file)
@@ -434,7 +434,7 @@ _variant_get10 (GVariant* value)
                GVariant* _tmp3_;
                GVariant* _tmp4_;
                GHashTable* _tmp5_;
-               _tmp1_ = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+               _tmp1_ = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, (GDestroyNotify) g_free);
                g_variant_iter_init (&_tmp2_, value);
                while (g_variant_iter_loop (&_tmp2_, "{?*}", &_tmp3_, &_tmp4_)) {
                        g_hash_table_insert (_tmp1_, g_variant_dup_string (_tmp3_, NULL), g_variant_dup_string (_tmp4_, NULL));
@@ -459,7 +459,7 @@ _variant_get11 (GVariant* value)
                GVariant* _tmp3_;
                GVariant* _tmp4_;
                GHashTable* _tmp5_;
-               _tmp1_ = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_free);
+               _tmp1_ = g_hash_table_new_full (g_direct_hash, g_direct_equal, (GDestroyNotify) NULL, (GDestroyNotify) g_free);
                g_variant_iter_init (&_tmp2_, value);
                while (g_variant_iter_loop (&_tmp2_, "{?*}", &_tmp3_, &_tmp4_)) {
                        g_hash_table_insert (_tmp1_, (gpointer) ((gintptr) g_variant_get_int32 (_tmp3_)), g_variant_dup_string (_tmp4_, NULL));
index d301658989ef1297e04e9285ea99262130c6d95b..018119ead2a9266ca6043fe841cf93d5a0ccdd7d 100644 (file)
@@ -199,14 +199,14 @@ test_proxy_test_nested_dict (Test* self,
        }
        g_variant_iter_init (&_reply_iter, _reply);
        _tmp0_ = g_variant_iter_next_value (&_reply_iter);
-       _tmp1_ = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_hash_table_unref);
+       _tmp1_ = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, (GDestroyNotify) g_hash_table_unref);
        g_variant_iter_init (&_tmp2_, _tmp0_);
        while (g_variant_iter_loop (&_tmp2_, "{?*}", &_tmp3_, &_tmp4_)) {
                GHashTable* _tmp5_;
                GVariantIter _tmp6_;
                GVariant* _tmp7_;
                GVariant* _tmp8_;
-               _tmp5_ = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref);
+               _tmp5_ = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, (GDestroyNotify) g_variant_unref);
                g_variant_iter_init (&_tmp6_, _tmp4_);
                while (g_variant_iter_loop (&_tmp6_, "{?*}", &_tmp7_, &_tmp8_)) {
                        g_hash_table_insert (_tmp5_, g_variant_dup_string (_tmp7_, NULL), g_variant_get_variant (_tmp8_));
index fdb305a2d1a5c942b58a8a000709dd0bcdde1490..9e12f1f564812495cab7198ab1f66fe152efca25 100644 (file)
@@ -229,7 +229,7 @@ test_proxy_test_dict (Test* self,
        }
        g_variant_iter_init (&_reply_iter, _reply);
        _tmp0_ = g_variant_iter_next_value (&_reply_iter);
-       _tmp1_ = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref);
+       _tmp1_ = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, (GDestroyNotify) g_variant_unref);
        g_variant_iter_init (&_tmp2_, _tmp0_);
        while (g_variant_iter_loop (&_tmp2_, "{?*}", &_tmp3_, &_tmp4_)) {
                g_hash_table_insert (_tmp1_, g_variant_dup_string (_tmp3_, NULL), g_variant_get_variant (_tmp4_));
index 5a5b6c4996b4ecb021d51243b290ba1fa1d0bd80..c9d11fb7bf7d23591bc976c0dec8b2cb008cd451 100644 (file)
@@ -605,7 +605,7 @@ test_interface_bar_proxy_foo (TestInterfaceBar* self,
        }
        g_variant_iter_init (&_reply_iter, _reply);
        _tmp4_ = g_variant_iter_next_value (&_reply_iter);
-       _tmp5_ = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref);
+       _tmp5_ = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, (GDestroyNotify) g_variant_unref);
        g_variant_iter_init (&_tmp6_, _tmp4_);
        while (g_variant_iter_loop (&_tmp6_, "{?*}", &_tmp7_, &_tmp8_)) {
                g_hash_table_insert (_tmp5_, g_variant_dup_string (_tmp7_, NULL), g_variant_get_variant (_tmp8_));
index 734722ffae38d84c9360e0325063c13382e590c2..c378fdb98b0b87b24e08a0068ad5fec2fbd6a5e7 100644 (file)
@@ -759,7 +759,7 @@ _dbus_test_out_mismatch (Test* self,
        _ready_data->a = g_variant_get_int32 (_tmp20_);
        g_variant_unref (_tmp20_);
        _tmp21_ = g_variant_iter_next_value (&_arguments_iter);
-       _tmp22_ = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+       _tmp22_ = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, (GDestroyNotify) NULL);
        g_variant_iter_init (&_tmp23_, _tmp21_);
        while (g_variant_iter_loop (&_tmp23_, "{?*}", &_tmp24_, &_tmp25_)) {
                g_hash_table_insert (_tmp22_, g_variant_dup_string (_tmp24_, NULL), (gpointer) ((gintptr) g_variant_get_int32 (_tmp25_)));
@@ -827,7 +827,7 @@ _dbus_test_in_mismatch (Test* self,
        _ready_data->a = g_variant_get_int32 (_tmp26_);
        g_variant_unref (_tmp26_);
        _tmp27_ = g_variant_iter_next_value (&_arguments_iter);
-       _tmp28_ = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+       _tmp28_ = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, (GDestroyNotify) NULL);
        g_variant_iter_init (&_tmp29_, _tmp27_);
        while (g_variant_iter_loop (&_tmp29_, "{?*}", &_tmp30_, &_tmp31_)) {
                g_hash_table_insert (_tmp28_, g_variant_dup_string (_tmp30_, NULL), (gpointer) ((gintptr) g_variant_get_int32 (_tmp31_)));
@@ -895,7 +895,7 @@ _dbus_test_out_mismatch_nothrow (Test* self,
        _ready_data->a = g_variant_get_int32 (_tmp32_);
        g_variant_unref (_tmp32_);
        _tmp33_ = g_variant_iter_next_value (&_arguments_iter);
-       _tmp34_ = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+       _tmp34_ = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, (GDestroyNotify) NULL);
        g_variant_iter_init (&_tmp35_, _tmp33_);
        while (g_variant_iter_loop (&_tmp35_, "{?*}", &_tmp36_, &_tmp37_)) {
                g_hash_table_insert (_tmp34_, g_variant_dup_string (_tmp36_, NULL), (gpointer) ((gintptr) g_variant_get_int32 (_tmp37_)));
index 1964301662c1fdbf1b5ebdf2cb171ce4696e4c93..161efe4293e4cf80e891faf6947f5bb367d202d1 100644 (file)
@@ -445,7 +445,7 @@ _dbus_test_out_mismatch (Test* self,
        a = g_variant_get_int32 (_tmp0_);
        g_variant_unref (_tmp0_);
        _tmp1_ = g_variant_iter_next_value (&_arguments_iter);
-       _tmp2_ = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+       _tmp2_ = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, (GDestroyNotify) NULL);
        g_variant_iter_init (&_tmp3_, _tmp1_);
        while (g_variant_iter_loop (&_tmp3_, "{?*}", &_tmp4_, &_tmp5_)) {
                g_hash_table_insert (_tmp2_, g_variant_dup_string (_tmp4_, NULL), (gpointer) ((gintptr) g_variant_get_int32 (_tmp5_)));
@@ -497,7 +497,7 @@ _dbus_test_in_mismatch (Test* self,
        a = g_variant_get_int64 (_tmp6_);
        g_variant_unref (_tmp6_);
        _tmp7_ = g_variant_iter_next_value (&_arguments_iter);
-       _tmp8_ = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+       _tmp8_ = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, (GDestroyNotify) NULL);
        g_variant_iter_init (&_tmp9_, _tmp7_);
        while (g_variant_iter_loop (&_tmp9_, "{?*}", &_tmp10_, &_tmp11_)) {
                g_hash_table_insert (_tmp8_, g_variant_dup_string (_tmp10_, NULL), (gpointer) ((gintptr) g_variant_get_int32 (_tmp11_)));
@@ -550,7 +550,7 @@ _dbus_test_out_mismatch_nothrow (Test* self,
        a = g_variant_get_int32 (_tmp12_);
        g_variant_unref (_tmp12_);
        _tmp13_ = g_variant_iter_next_value (&_arguments_iter);
-       _tmp14_ = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+       _tmp14_ = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, (GDestroyNotify) NULL);
        g_variant_iter_init (&_tmp15_, _tmp13_);
        while (g_variant_iter_loop (&_tmp15_, "{?*}", &_tmp16_, &_tmp17_)) {
                g_hash_table_insert (_tmp14_, g_variant_dup_string (_tmp16_, NULL), (gpointer) ((gintptr) g_variant_get_int32 (_tmp17_)));