vala r2137 - in trunk: . gobject



Author: juergbi
Date: Fri Dec 12 10:54:47 2008
New Revision: 2137
URL: http://svn.gnome.org/viewvc/vala?rev=2137&view=rev

Log:
2008-12-12  JÃrg Billeter  <j bitron ch>

	* gobject/valadbusclientmodule.vala:
	* gobject/valadbusmodule.vala:

	Support reading multi-dimensional arrays in static D-Bus clients


Modified:
   trunk/ChangeLog
   trunk/gobject/valadbusclientmodule.vala
   trunk/gobject/valadbusmodule.vala

Modified: trunk/gobject/valadbusclientmodule.vala
==============================================================================
--- trunk/gobject/valadbusclientmodule.vala	(original)
+++ trunk/gobject/valadbusclientmodule.vala	Fri Dec 12 10:54:47 2008
@@ -1038,19 +1038,25 @@
 			cdecl.add_declarator (new CCodeVariableDeclarator ("_result"));
 			postfragment.append (cdecl);
 
-			if (m.return_type is ArrayType) {
-				cdecl = new CCodeDeclaration ("int");
-				cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer ("_result_length1", new CCodeConstant ("0")));
-				postfragment.append (cdecl);
+			var array_type = m.return_type as ArrayType;
+
+			if (array_type != null) {
+				for (int dim = 1; dim <= array_type.rank; dim++) {
+					cdecl = new CCodeDeclaration ("int");
+					cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer ("_result_length%d".printf (dim), new CCodeConstant ("0")));
+					postfragment.append (cdecl);
+				}
 			}
 
 			var target = new CCodeIdentifier ("_result");
 			var expr = read_expression (postfragment, m.return_type, new CCodeIdentifier ("_iter"), target);
 			postfragment.append (new CCodeExpressionStatement (new CCodeAssignment (target, expr)));
 
-			if (m.return_type is ArrayType) {
-				// TODO check that parameter is not NULL (out parameters are optional)
-				postfragment.append (new CCodeExpressionStatement (new CCodeAssignment (new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier ("result_length1")), new CCodeIdentifier ("_result_length1"))));
+			if (array_type != null) {
+				for (int dim = 1; dim <= array_type.rank; dim++) {
+					// TODO check that parameter is not NULL (out parameters are optional)
+					postfragment.append (new CCodeExpressionStatement (new CCodeAssignment (new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier ("result_length%d".printf (dim))), new CCodeIdentifier ("_result_length%d".printf (dim)))));
+				}
 			}
 		}
 	}

Modified: trunk/gobject/valadbusmodule.vala
==============================================================================
--- trunk/gobject/valadbusmodule.vala	(original)
+++ trunk/gobject/valadbusmodule.vala	Fri Dec 12 10:54:47 2008
@@ -59,13 +59,13 @@
 		return false;
 	}
 
-	CCodeExpression? get_array_length (CCodeExpression expr) {
+	CCodeExpression? get_array_length (CCodeExpression expr, int dim) {
 		var id = expr as CCodeIdentifier;
 		var ma = expr as CCodeMemberAccess;
 		if (id != null) {
-			return new CCodeIdentifier (id.name + "_length1");
+			return new CCodeIdentifier ("%s_length%d".printf (id.name, dim));
 		} else if (ma != null) {
-			return new CCodeMemberAccess.pointer (ma.inner, ma.member_name + "_length1");
+			return new CCodeMemberAccess.pointer (ma.inner, "%s_length%d".printf (ma.member_name, dim));
 		}
 		return null;
 	}
@@ -97,20 +97,31 @@
 
 	CCodeExpression read_array (CCodeFragment fragment, ArrayType array_type, CCodeExpression iter_expr, CCodeExpression? expr) {
 		string temp_name = "_tmp%d".printf (next_temp_var_id++);
-		string subiter_name = "_tmp%d".printf (next_temp_var_id++);
 
 		var cdecl = new CCodeDeclaration (array_type.get_cname ());
 		cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer (temp_name, new CCodeConstant ("NULL")));
 		fragment.append (cdecl);
 
 		cdecl = new CCodeDeclaration ("int");
-		cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer (temp_name + "_length1", new CCodeConstant ("0")));
+		cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer (temp_name + "_length", new CCodeConstant ("0")));
 		fragment.append (cdecl);
 
 		cdecl = new CCodeDeclaration ("int");
 		cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer (temp_name + "_size", new CCodeConstant ("0")));
 		fragment.append (cdecl);
 
+		read_array_dim (fragment, array_type, 1, temp_name, iter_expr, expr);
+
+		return new CCodeIdentifier (temp_name);
+	}
+
+	void read_array_dim (CCodeFragment fragment, ArrayType array_type, int dim, string temp_name, CCodeExpression iter_expr, CCodeExpression? expr) {
+		string subiter_name = "_tmp%d".printf (next_temp_var_id++);
+
+		var cdecl = new CCodeDeclaration ("int");
+		cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer ("%s_length%d".printf (temp_name, dim), new CCodeConstant ("0")));
+		fragment.append (cdecl);
+
 		cdecl = new CCodeDeclaration ("DBusMessageIter");
 		cdecl.add_declarator (new CCodeVariableDeclarator (subiter_name));
 		fragment.append (cdecl);
@@ -127,36 +138,43 @@
 		var cforfragment = new CCodeFragment ();
 		cforblock.add_statement (cforfragment);
 		var cfor = new CCodeForStatement (iter_call, cforblock);
-		cfor.add_iterator (new CCodeUnaryExpression (CCodeUnaryOperator.POSTFIX_INCREMENT, new CCodeIdentifier (temp_name + "_length1")));
-
-		var size_check = new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, new CCodeIdentifier (temp_name + "_size"), new CCodeIdentifier (temp_name + "_length1"));
-		var renew_block = new CCodeBlock ();
+		cfor.add_iterator (new CCodeUnaryExpression (CCodeUnaryOperator.POSTFIX_INCREMENT, new CCodeIdentifier ("%s_length%d".printf (temp_name, dim))));
 
-		// tmp_size = (tmp_size > 0) ? (2 * tmp_size) : 4;
-		var init_check = new CCodeBinaryExpression (CCodeBinaryOperator.GREATER_THAN, new CCodeIdentifier (temp_name + "_size"), new CCodeConstant ("0"));
-		var new_size = new CCodeConditionalExpression (init_check, new CCodeBinaryExpression (CCodeBinaryOperator.MUL, new CCodeConstant ("2"), new CCodeIdentifier (temp_name + "_size")), new CCodeConstant ("4"));
-		renew_block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier (temp_name + "_size"), new_size)));
-
-		var renew_call = new CCodeFunctionCall (new CCodeIdentifier ("g_renew"));
-		renew_call.add_argument (new CCodeIdentifier (array_type.element_type.get_cname ()));
-		renew_call.add_argument (new CCodeIdentifier (temp_name));
-		renew_call.add_argument (new CCodeIdentifier (temp_name + "_size"));
-		var renew_stmt = new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier (temp_name), renew_call));
-		renew_block.add_statement (renew_stmt);
+		if (dim < array_type.rank) {
+			read_array_dim (cforfragment, array_type, dim + 1, temp_name, new CCodeIdentifier (subiter_name), expr);
 
-		var cif = new CCodeIfStatement (size_check, renew_block);
-		cforfragment.append (cif);
+			iter_call = new CCodeFunctionCall (new CCodeIdentifier ("dbus_message_iter_next"));
+			iter_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (subiter_name)));
+			cforfragment.append (new CCodeExpressionStatement (iter_call));
+		} else {
+			var size_check = new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, new CCodeIdentifier (temp_name + "_size"), new CCodeIdentifier (temp_name + "_length"));
+			var renew_block = new CCodeBlock ();
 
-		var element_expr = read_expression (cforfragment, array_type.element_type, new CCodeIdentifier (subiter_name), null);
-		cforfragment.append (new CCodeExpressionStatement (new CCodeAssignment (new CCodeElementAccess (new CCodeIdentifier (temp_name), new CCodeIdentifier (temp_name + "_length1")), element_expr)));
+			// tmp_size = (tmp_size > 0) ? (2 * tmp_size) : 4;
+			var init_check = new CCodeBinaryExpression (CCodeBinaryOperator.GREATER_THAN, new CCodeIdentifier (temp_name + "_size"), new CCodeConstant ("0"));
+			var new_size = new CCodeConditionalExpression (init_check, new CCodeBinaryExpression (CCodeBinaryOperator.MUL, new CCodeConstant ("2"), new CCodeIdentifier (temp_name + "_size")), new CCodeConstant ("4"));
+			renew_block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier (temp_name + "_size"), new_size)));
+
+			var renew_call = new CCodeFunctionCall (new CCodeIdentifier ("g_renew"));
+			renew_call.add_argument (new CCodeIdentifier (array_type.element_type.get_cname ()));
+			renew_call.add_argument (new CCodeIdentifier (temp_name));
+			renew_call.add_argument (new CCodeIdentifier (temp_name + "_size"));
+			var renew_stmt = new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier (temp_name), renew_call));
+			renew_block.add_statement (renew_stmt);
+
+			var cif = new CCodeIfStatement (size_check, renew_block);
+			cforfragment.append (cif);
+
+			var element_access = new CCodeElementAccess (new CCodeIdentifier (temp_name), new CCodeUnaryExpression (CCodeUnaryOperator.POSTFIX_INCREMENT, new CCodeIdentifier (temp_name + "_length")));
+			var element_expr = read_expression (cforfragment, array_type.element_type, new CCodeIdentifier (subiter_name), null);
+			cforfragment.append (new CCodeExpressionStatement (new CCodeAssignment (element_access, element_expr)));
+		}
 
 		fragment.append (cfor);
 
 		if (expr != null) {
-			fragment.append (new CCodeExpressionStatement (new CCodeAssignment (get_array_length (expr), new CCodeIdentifier (temp_name + "_length1"))));
+			fragment.append (new CCodeExpressionStatement (new CCodeAssignment (get_array_length (expr, dim), new CCodeIdentifier ("%s_length%d".printf (temp_name, dim)))));
 		}
-
-		return new CCodeIdentifier (temp_name);
 	}
 
 	CCodeExpression read_struct (CCodeFragment fragment, Struct st, CCodeExpression iter_expr) {
@@ -400,7 +418,7 @@
 		var cforblock = new CCodeBlock ();
 		var cforfragment = new CCodeFragment ();
 		cforblock.add_statement (cforfragment);
-		var cfor = new CCodeForStatement (new CCodeBinaryExpression (CCodeBinaryOperator.LESS_THAN, new CCodeIdentifier (index_name), get_array_length (array_expr)), cforblock);
+		var cfor = new CCodeForStatement (new CCodeBinaryExpression (CCodeBinaryOperator.LESS_THAN, new CCodeIdentifier (index_name), get_array_length (array_expr, 1)), cforblock);
 		cfor.add_initializer (new CCodeAssignment (new CCodeIdentifier (index_name), new CCodeConstant ("0")));
 		cfor.add_iterator (new CCodeUnaryExpression (CCodeUnaryOperator.POSTFIX_INCREMENT, new CCodeIdentifier (index_name)));
 



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