vala r2137 - in trunk: . gobject
- From: juergbi svn gnome org
- To: svn-commits-list gnome org
- Subject: vala r2137 - in trunk: . gobject
- Date: Fri, 12 Dec 2008 10:54:47 +0000 (UTC)
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]