vala r1244 - in trunk: . gobject



Author: juergbi
Date: Wed Apr 16 16:56:27 2008
New Revision: 1244
URL: http://svn.gnome.org/viewvc/vala?rev=1244&view=rev

Log:
2008-04-16  Juerg Billeter  <j bitron ch>

	* gobject/valaccodegenerator.vala,
	  gobject/valaccodegeneratorinvocationexpression.vala:

	  Fix generated C code when passing structs by reference,
	  fixes bug 528414


Modified:
   trunk/ChangeLog
   trunk/gobject/valaccodegenerator.vala
   trunk/gobject/valaccodegeneratorinvocationexpression.vala

Modified: trunk/gobject/valaccodegenerator.vala
==============================================================================
--- trunk/gobject/valaccodegenerator.vala	(original)
+++ trunk/gobject/valaccodegenerator.vala	Wed Apr 16 16:56:27 2008
@@ -2871,7 +2871,20 @@
 						if (param.type_reference.data_type is Struct && !((Struct) param.type_reference.data_type).is_simple_type ()) {
 							// we already use a reference for arguments of ref and out parameters
 							if (param.direction == ParameterDirection.IN) {
-								cexpr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, cexpr);
+								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.static_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;
+								}
 							}
 						}
 					}

Modified: trunk/gobject/valaccodegeneratorinvocationexpression.vala
==============================================================================
--- trunk/gobject/valaccodegeneratorinvocationexpression.vala	(original)
+++ trunk/gobject/valaccodegeneratorinvocationexpression.vala	Wed Apr 16 16:56:27 2008
@@ -255,7 +255,20 @@
 					if (!(arg.static_type is NullType) && param.type_reference.data_type is Struct && !((Struct) param.type_reference.data_type).is_simple_type ()) {
 						// we already use a reference for arguments of ref and out parameters
 						if (param.direction == ParameterDirection.IN) {
-							cexpr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, cexpr);
+							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.static_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;
+							}
 						}
 					}
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]