From 1ce8f25165fd50c41368a8cf7b9dae2e642cdca1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=BCrg=20Billeter?= Date: Fri, 6 Aug 2010 10:43:03 +0200 Subject: [PATCH] Fix passing real non null struct arguments to vararg methods Based on patch by Luca Bruno, fixes bug 625758. --- codegen/valaccodebasemodule.vala | 19 +++++++++++++++---- codegen/valaccodemethodcallmodule.vala | 3 +++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 520e098ce..0356c540a 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -4311,11 +4311,14 @@ public class Vala.CCodeBaseModule : CodeGenerator { if (param.ctype != null) { cexpr = new CCodeCastExpression (cexpr, param.ctype); } + } else { + cexpr = handle_struct_argument (null, arg, cexpr); } arg_pos = get_param_pos (param.cparameter_position, ellipsis); } else { // default argument position + cexpr = handle_struct_argument (null, arg, cexpr); arg_pos = get_param_pos (i, ellipsis); } @@ -4482,11 +4485,19 @@ public class Vala.CCodeBaseModule : CodeGenerator { } } - public CCodeExpression? handle_struct_argument (FormalParameter param, Expression arg, CCodeExpression? cexpr) { + public CCodeExpression? handle_struct_argument (FormalParameter? param, Expression arg, CCodeExpression? cexpr) { + DataType type; + if (param != null) { + type = param.variable_type; + } else { + // varargs + type = arg.value_type; + } + // pass non-simple struct instances always by reference - if (!(arg.value_type is NullType) && param.variable_type.data_type is Struct && !((Struct) param.variable_type.data_type).is_simple_type ()) { + if (!(arg.value_type is NullType) && type.is_real_struct_type ()) { // we already use a reference for arguments of ref, out, and nullable parameters - if (param.direction == ParameterDirection.IN && !param.variable_type.nullable) { + if ((param == null || param.direction == ParameterDirection.IN) && !type.nullable) { var unary = cexpr as CCodeUnaryExpression; if (unary != null && unary.operator == CCodeUnaryOperator.POINTER_INDIRECTION) { // *expr => expr @@ -4498,7 +4509,7 @@ public class Vala.CCodeBaseModule : CodeGenerator { // (tmp = expr, &tmp) var ccomma = new CCodeCommaExpression (); - var temp_var = get_temp_variable (param.variable_type, true, null, false); + var temp_var = get_temp_variable (type, true, null, false); temp_vars.add (temp_var); ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_var.name), cexpr)); ccomma.append_expression (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_variable_cexpression (temp_var.name))); diff --git a/codegen/valaccodemethodcallmodule.vala b/codegen/valaccodemethodcallmodule.vala index c3a03e78c..ad262fa9f 100644 --- a/codegen/valaccodemethodcallmodule.vala +++ b/codegen/valaccodemethodcallmodule.vala @@ -493,10 +493,13 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule { if (param.ctype != null) { cexpr = new CCodeCastExpression (cexpr, param.ctype); } + } else { + cexpr = handle_struct_argument (null, arg, cexpr); } arg_pos = get_param_pos (param.cparameter_position, ellipsis); } else { // default argument position + cexpr = handle_struct_argument (null, arg, cexpr); arg_pos = get_param_pos (i, ellipsis); } -- 2.47.2