]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Support reading multi-dimensional arrays in static D-Bus clients
authorJürg Billeter <j@bitron.ch>
Fri, 12 Dec 2008 10:54:47 +0000 (10:54 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Fri, 12 Dec 2008 10:54:47 +0000 (10:54 +0000)
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

svn path=/trunk/; revision=2137

ChangeLog
gobject/valadbusclientmodule.vala
gobject/valadbusmodule.vala

index c7e81b5c9888f5b01410e11e83ee81847044f249..8e2b16fdbc0bf4fb0e24714bb69d71edd53e8583 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+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
+
 2008-12-12  Jürg Billeter  <j@bitron.ch>
 
        * gobject/valadbusclientmodule.vala:
index c3e0e8f02a2400ec8ebe9d9e7aeb5997950ae2aa..87a2d02e407ffab3bdb0262855bcc5139bf25031 100644 (file)
@@ -1038,19 +1038,25 @@ public class Vala.DBusClientModule : DBusModule {
                        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)))));
+                               }
                        }
                }
        }
index 4470815d9184ae07e59a77d50ba2da079ce13111..1e96ddb091528568dd9f640ec2020b642d28fef4 100644 (file)
@@ -59,13 +59,13 @@ public class Vala.DBusModule : GAsyncModule {
                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 @@ public class Vala.DBusModule : GAsyncModule {
 
        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 @@ public class Vala.DBusModule : GAsyncModule {
                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")));
+               cfor.add_iterator (new CCodeUnaryExpression (CCodeUnaryOperator.POSTFIX_INCREMENT, new CCodeIdentifier ("%s_length%d".printf (temp_name, dim))));
 
-               var size_check = new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, new CCodeIdentifier (temp_name + "_size"), new CCodeIdentifier (temp_name + "_length1"));
-               var renew_block = new CCodeBlock ();
+               if (dim < array_type.rank) {
+                       read_array_dim (cforfragment, array_type, dim + 1, temp_name, new CCodeIdentifier (subiter_name), 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_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)));
+                       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 ();
+
+                       // 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 @@ public class Vala.DBusModule : GAsyncModule {
                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)));