From: Rico Tzschichholz Date: Thu, 9 Mar 2017 15:52:37 +0000 (+0100) Subject: codegen: Avoid use of temp-var for some callables returning ValueType X-Git-Tag: 0.39.1~15 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=refs%2Fkeep-around%2Fa94a28141e1f222d1da7e72bea4cd2d1e5242f41;p=thirdparty%2Fvala.git 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 --- 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; + } }