]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Avoid use of temp-var for some callables returning ValueType a94a28141e1f222d1da7e72bea4cd2d1e5242f41
authorRico Tzschichholz <ricotz@ubuntu.com>
Thu, 9 Mar 2017 15:52:37 +0000 (16:52 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Wed, 22 Nov 2017 20:50:42 +0000 (21:50 +0100)
It is safe to do for callables which don't have out/ref parameters without
breaking the control-flow.

https://bugzilla.gnome.org/show_bug.cgi?id=789071

codegen/valaccodemethodcallmodule.vala

index cf2a3f53589ca85d5abdb70e833aaea89d42423a..82a0574c60ceb74d433ae0788744ae3174ece154 100644 (file)
@@ -805,6 +805,10 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                                set_cvalue (expr, ccall_expr);
                        } else if (m != null && m.get_attribute_bool ("CCode", "use_inplace", false)) {
                                set_cvalue (expr, ccall_expr);
+                       } else if (!return_result_via_out_param
+                           && ((m != null && !has_ref_out_param (m)) || (deleg != null && !has_ref_out_param (deleg)))
+                           && (result_type is ValueType && !result_type.is_disposable ())) {
+                               set_cvalue (expr, ccall_expr);
                        } else if (!return_result_via_out_param) {
                                var temp_var = get_temp_variable (result_type, result_type.value_owned, null, false);
                                var temp_ref = get_variable_cexpression (temp_var.name);
@@ -896,5 +900,14 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
 
                return to_string_func;
        }
+
+       bool has_ref_out_param (Callable c) {
+               foreach (var param in c.get_parameters ()) {
+                       if (param.direction != ParameterDirection.IN) {
+                               return true;
+                       }
+               }
+               return false;
+       }
 }