From a94a28141e1f222d1da7e72bea4cd2d1e5242f41 Mon Sep 17 00:00:00 2001 From: Rico Tzschichholz Date: Thu, 9 Mar 2017 16:52:37 +0100 Subject: [PATCH] codegen: Avoid use of temp-var for some callables returning ValueType 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 | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/codegen/valaccodemethodcallmodule.vala b/codegen/valaccodemethodcallmodule.vala index cf2a3f535..82a0574c6 100644 --- a/codegen/valaccodemethodcallmodule.vala +++ b/codegen/valaccodemethodcallmodule.vala @@ -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; + } } -- 2.47.2