]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Use g_enum/flags_to_string while targeting glib >= 2.54
authorRico Tzschichholz <ricotz@ubuntu.com>
Wed, 3 Jan 2018 19:44:08 +0000 (20:44 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Wed, 3 Jan 2018 19:44:08 +0000 (20:44 +0100)
codegen/valagtypemodule.vala

index c282f2c3a53e98aa8111ceda060cb793e6329a8c..0d7b0603c2688fcefa5a9b18088660e9cce3b14b 100644 (file)
@@ -2246,18 +2246,26 @@ public class Vala.GTypeModule : GErrorModule {
                bool is_flags = ((Enum) ((EnumValueType) ma.inner.value_type).type_symbol).is_flags;
 
                push_line (expr.source_reference);
-               var temp_var = get_temp_variable (new CType (is_flags ? "GFlagsValue*" : "GEnumValue*"), false, expr, false);
-               emit_temp_var (temp_var);
-
-               var class_ref = new CCodeFunctionCall (new CCodeIdentifier ("g_type_class_ref"));
-               class_ref.add_argument (new CCodeIdentifier (get_ccode_type_id (ma.inner.value_type)));
-               var get_value = new CCodeFunctionCall (new CCodeIdentifier (is_flags ? "g_flags_get_first_value" : "g_enum_get_value"));
-               get_value.add_argument (class_ref);
-               get_value.add_argument ((CCodeExpression) get_ccodenode (((MemberAccess) expr.call).inner));
-
-               ccode.add_assignment (get_variable_cexpression (temp_var.name), get_value);
-               var is_null_value = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, get_variable_cexpression (temp_var.name), new CCodeIdentifier ("NULL"));
-               set_cvalue (expr, new CCodeConditionalExpression (is_null_value, new CCodeMemberAccess.pointer (get_variable_cexpression (temp_var.name), "value_name"), new CCodeIdentifier ("NULL")));
+               if (context.require_glib_version (2, 54)) {
+                       var to_string = new CCodeFunctionCall (new CCodeIdentifier ((is_flags ? "g_flags_to_string" : "g_enum_to_string")));
+                       to_string.add_argument (new CCodeIdentifier (get_ccode_type_id (ma.inner.value_type)));
+                       to_string.add_argument ((CCodeExpression) get_ccodenode (((MemberAccess) expr.call).inner));
+                       expr.value_type.value_owned = true;
+                       set_cvalue (expr, to_string);
+               } else {
+                       var temp_var = get_temp_variable (new CType (is_flags ? "GFlagsValue*" : "GEnumValue*"), false, expr, false);
+                       emit_temp_var (temp_var);
+
+                       var class_ref = new CCodeFunctionCall (new CCodeIdentifier ("g_type_class_ref"));
+                       class_ref.add_argument (new CCodeIdentifier (get_ccode_type_id (ma.inner.value_type)));
+                       var get_value = new CCodeFunctionCall (new CCodeIdentifier (is_flags ? "g_flags_get_first_value" : "g_enum_get_value"));
+                       get_value.add_argument (class_ref);
+                       get_value.add_argument ((CCodeExpression) get_ccodenode (((MemberAccess) expr.call).inner));
+
+                       ccode.add_assignment (get_variable_cexpression (temp_var.name), get_value);
+                       var is_null_value = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, get_variable_cexpression (temp_var.name), new CCodeIdentifier ("NULL"));
+                       set_cvalue (expr, new CCodeConditionalExpression (is_null_value, new CCodeMemberAccess.pointer (get_variable_cexpression (temp_var.name), "value_name"), new CCodeIdentifier ("NULL")));
+               }
                pop_line ();
        }