Avoid code duplication for handling struct arguments
authorJürg Billeter <j@bitron.ch>
Fri, 26 Sep 2008 21:13:36 +0000 (21:13 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Fri, 26 Sep 2008 21:13:36 +0000 (21:13 +0000)
2008-09-26  Jürg Billeter  <j@bitron.ch>

* gobject/valaccodegenerator.vala:
* gobject/valaccodeinvocationexpressionbinding.vala:

Avoid code duplication for handling struct arguments

svn path=/trunk/; revision=1788

ChangeLog
gobject/valaccodegenerator.vala
gobject/valaccodeinvocationexpressionbinding.vala

index 32b9cc6..bf98e65 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2008-09-26  Jürg Billeter  <j@bitron.ch>
 
+       * gobject/valaccodegenerator.vala:
+       * gobject/valaccodeinvocationexpressionbinding.vala:
+
+       Avoid code duplication for handling struct arguments
+
+2008-09-26  Jürg Billeter  <j@bitron.ch>
+
        * gobject/valaccodeclassbinding.vala:
 
        Use correct accessor cname for interface implementations of
index 995cb47..cdcd654 100644 (file)
@@ -3178,26 +3178,7 @@ public class Vala.CCodeGenerator : CodeGenerator {
                                        param = params_it.get ();
                                        ellipsis = param.ellipsis;
                                        if (!param.ellipsis) {
-                                               // pass non-simple struct instances always by reference
-                                               if (param.parameter_type.data_type is Struct && !((Struct) param.parameter_type.data_type).is_simple_type ()) {
-                                                       // we already use a reference for arguments of ref and out parameters
-                                                       if (param.direction == ParameterDirection.IN) {
-                                                               if (cexpr is CCodeIdentifier) {
-                                                                       cexpr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, cexpr);
-                                                               } else {
-                                                                       // if cexpr is e.g. a function call, we can't take the address of the expression
-                                                                       // (tmp = expr, &tmp)
-                                                                       var ccomma = new CCodeCommaExpression ();
-
-                                                                       var temp_var = get_temp_variable (arg.value_type);
-                                                                       temp_vars.insert (0, temp_var);
-                                                                       ccomma.append_expression (new CCodeAssignment (new CCodeIdentifier (temp_var.name), cexpr));
-                                                                       ccomma.append_expression (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (temp_var.name)));
-
-                                                                       cexpr = ccomma;
-                                                               }
-                                                       }
-                                               }
+                                               cexpr = handle_struct_argument (param, arg, cexpr);
                                        }
                                }
                        
@@ -3314,6 +3295,35 @@ public class Vala.CCodeGenerator : CodeGenerator {
                }
        }
 
+       public CCodeExpression? handle_struct_argument (FormalParameter param, Expression arg, CCodeExpression? cexpr) {
+               // pass non-simple struct instances always by reference
+               if (!(arg.value_type is NullType) && param.parameter_type.data_type is Struct && !((Struct) param.parameter_type.data_type).is_simple_type ()) {
+                       // we already use a reference for arguments of ref, out, and nullable parameters
+                       if (param.direction == ParameterDirection.IN && !param.parameter_type.nullable) {
+                               var unary = cexpr as CCodeUnaryExpression;
+                               if (unary != null && unary.operator == CCodeUnaryOperator.POINTER_INDIRECTION) {
+                                       // *expr => expr
+                                       return unary.inner;
+                               } else if (cexpr is CCodeIdentifier || cexpr is CCodeMemberAccess) {
+                                       return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, cexpr);
+                               } else {
+                                       // if cexpr is e.g. a function call, we can't take the address of the expression
+                                       // (tmp = expr, &tmp)
+                                       var ccomma = new CCodeCommaExpression ();
+
+                                       var temp_var = get_temp_variable (arg.value_type);
+                                       temp_vars.insert (0, temp_var);
+                                       ccomma.append_expression (new CCodeAssignment (new CCodeIdentifier (temp_var.name), cexpr));
+                                       ccomma.append_expression (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (temp_var.name)));
+
+                                       return ccomma;
+                               }
+                       }
+               }
+
+               return cexpr;
+       }
+
        public override void visit_sizeof_expression (SizeofExpression expr) {
                var csizeof = new CCodeFunctionCall (new CCodeIdentifier ("sizeof"));
                csizeof.add_argument (new CCodeIdentifier (expr.type_reference.data_type.get_cname ()));
index 744216a..79d9ab2 100644 (file)
@@ -208,30 +208,7 @@ public class Vala.CCodeInvocationExpressionBinding : CCodeExpressionBinding {
                                                multiple_cargs = true;
                                        }
 
-                                       // pass non-simple struct instances always by reference
-                                       if (!(arg.value_type is NullType) && param.parameter_type.data_type is Struct && !((Struct) param.parameter_type.data_type).is_simple_type ()) {
-                                               // we already use a reference for arguments of ref, out, and nullable parameters
-                                               if (param.direction == ParameterDirection.IN && !param.parameter_type.nullable) {
-                                                       var unary = cexpr as CCodeUnaryExpression;
-                                                       if (unary != null && unary.operator == CCodeUnaryOperator.POINTER_INDIRECTION) {
-                                                               // *expr => expr
-                                                               cexpr = unary.inner;
-                                                       } else if (cexpr is CCodeIdentifier || cexpr is CCodeMemberAccess) {
-                                                               cexpr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, cexpr);
-                                                       } else {
-                                                               // if cexpr is e.g. a function call, we can't take the address of the expression
-                                                               // (tmp = expr, &tmp)
-                                                               var ccomma = new CCodeCommaExpression ();
-
-                                                               var temp_var = codegen.get_temp_variable (arg.value_type);
-                                                               codegen.temp_vars.insert (0, temp_var);
-                                                               ccomma.append_expression (new CCodeAssignment (new CCodeIdentifier (temp_var.name), cexpr));
-                                                               ccomma.append_expression (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (temp_var.name)));
-
-                                                               cexpr = ccomma;
-                                                       }
-                                               }
-                                       }
+                                       cexpr = codegen.handle_struct_argument (param, arg, cexpr);
 
                                        if (multiple_cargs && arg is InvocationExpression) {
                                                // if vala argument is invocation expression