vala r1571 - in trunk: . gobject
- From: juergbi svn gnome org
- To: svn-commits-list gnome org
- Subject: vala r1571 - in trunk: . gobject
- Date: Thu, 12 Jun 2008 14:30:08 +0000 (UTC)
Author: juergbi
Date: Thu Jun 12 14:30:08 2008
New Revision: 1571
URL: http://svn.gnome.org/viewvc/vala?rev=1571&view=rev
Log:
2008-06-12 JÃrg Billeter <j bitron ch>
* gobject/valaccodedynamicmethodbinding.vala:
Use GPtrArray in D-Bus client methods for boxed types
Modified:
trunk/ChangeLog
trunk/gobject/valaccodedynamicmethodbinding.vala
Modified: trunk/gobject/valaccodedynamicmethodbinding.vala
==============================================================================
--- trunk/gobject/valaccodedynamicmethodbinding.vala (original)
+++ trunk/gobject/valaccodedynamicmethodbinding.vala Thu Jun 12 14:30:08 2008
@@ -133,12 +133,17 @@
}
if (param.parameter_type is ArrayType && ((ArrayType) param.parameter_type).element_type.data_type != codegen.string_type.data_type) {
var array_type = (ArrayType) param.parameter_type;
- var cdecl = new CCodeDeclaration ("GArray*");
+ CCodeDeclaration cdecl;
+ if (dbus_use_ptr_array (array_type)) {
+ cdecl = new CCodeDeclaration ("GPtrArray*");
+ } else {
+ cdecl = new CCodeDeclaration ("GArray*");
+ }
cdecl.add_declarator (new CCodeVariableDeclarator (param.name));
cb_fun.block.add_statement (cdecl);
cend_call.add_argument (get_dbus_g_type (array_type));
cend_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (param.name)));
- creply_call.add_argument (new CCodeMemberAccess.pointer (new CCodeIdentifier (param.name), "data"));
+ creply_call.add_argument (new CCodeMemberAccess.pointer (new CCodeIdentifier (param.name), dbus_use_ptr_array (array_type) ? "pdata" : "data"));
creply_call.add_argument (new CCodeMemberAccess.pointer (new CCodeIdentifier (param.name), "len"));
} else {
var cdecl = new CCodeDeclaration (param.parameter_type.get_cname ());
@@ -195,22 +200,44 @@
// non-string arrays (use GArray)
ccall.add_argument (get_dbus_g_type (array_type));
- var array_construct = new CCodeFunctionCall (new CCodeIdentifier ("g_array_new"));
- array_construct.add_argument (new CCodeConstant ("TRUE"));
- array_construct.add_argument (new CCodeConstant ("TRUE"));
var sizeof_call = new CCodeFunctionCall (new CCodeIdentifier ("sizeof"));
sizeof_call.add_argument (new CCodeIdentifier (array_type.element_type.get_cname ()));
- array_construct.add_argument (sizeof_call);
- var cdecl = new CCodeDeclaration ("GArray*");
+ CCodeDeclaration cdecl;
+ CCodeFunctionCall array_construct;
+ if (dbus_use_ptr_array (array_type)) {
+ cdecl = new CCodeDeclaration ("GPtrArray*");
+
+ array_construct = new CCodeFunctionCall (new CCodeIdentifier ("g_ptr_array_sized_new"));
+ array_construct.add_argument (new CCodeIdentifier (codegen.get_array_length_cname (param.name, 1)));
+ } else {
+ cdecl = new CCodeDeclaration ("GArray*");
+
+ array_construct = new CCodeFunctionCall (new CCodeIdentifier ("g_array_new"));
+ array_construct.add_argument (new CCodeConstant ("TRUE"));
+ array_construct.add_argument (new CCodeConstant ("TRUE"));
+ array_construct.add_argument (sizeof_call);
+ }
+
cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer ("dbus_%s".printf (param.name), array_construct));
block.add_statement (cdecl);
- var cappend_call = new CCodeFunctionCall (new CCodeIdentifier ("g_array_append_vals"));
- cappend_call.add_argument (new CCodeIdentifier ("dbus_%s".printf (param.name)));
- cappend_call.add_argument (new CCodeIdentifier (param.name));
- cappend_call.add_argument (new CCodeIdentifier (codegen.get_array_length_cname (param.name, 1)));
- block.add_statement (new CCodeExpressionStatement (cappend_call));
+ if (dbus_use_ptr_array (array_type)) {
+ var memcpy_call = new CCodeFunctionCall (new CCodeIdentifier ("memcpy"));
+ memcpy_call.add_argument (new CCodeMemberAccess.pointer (new CCodeIdentifier ("dbus_%s".printf (param.name)), "pdata"));
+ memcpy_call.add_argument (new CCodeIdentifier (param.name));
+ memcpy_call.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.MUL, new CCodeIdentifier (codegen.get_array_length_cname (param.name, 1)), sizeof_call));
+ block.add_statement (new CCodeExpressionStatement (memcpy_call));
+
+ var len_assignment = new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("dbus_%s".printf (param.name)), "len"), new CCodeIdentifier (codegen.get_array_length_cname (param.name, 1)));
+ block.add_statement (new CCodeExpressionStatement (len_assignment));
+ } else {
+ var cappend_call = new CCodeFunctionCall (new CCodeIdentifier ("g_array_append_vals"));
+ cappend_call.add_argument (new CCodeIdentifier ("dbus_%s".printf (param.name)));
+ cappend_call.add_argument (new CCodeIdentifier (param.name));
+ cappend_call.add_argument (new CCodeIdentifier (codegen.get_array_length_cname (param.name, 1)));
+ block.add_statement (new CCodeExpressionStatement (cappend_call));
+ }
ccall.add_argument (new CCodeIdentifier ("dbus_%s".printf (param.name)));
} else {
@@ -334,8 +361,12 @@
// non-string arrays (use GArray)
ccall.add_argument (get_dbus_g_type (array_type));
- var garray_type_reference = codegen.get_data_type_for_symbol (codegen.garray_type);
- var cdecl = new CCodeDeclaration (garray_type_reference.get_cname ());
+ CCodeDeclaration cdecl;
+ if (dbus_use_ptr_array (array_type)) {
+ cdecl = new CCodeDeclaration ("GPtrArray*");
+ } else {
+ cdecl = new CCodeDeclaration ("GArray*");
+ }
cdecl.add_declarator (new CCodeVariableDeclarator ("result"));
block.add_statement (cdecl);
@@ -359,7 +390,7 @@
block.add_statement (new CCodeExpressionStatement (assign));
// return result->data;
- block.add_statement (new CCodeReturnStatement (new CCodeCastExpression (new CCodeMemberAccess.pointer (new CCodeIdentifier ("result"), "data"), method.return_type.get_cname ())));
+ block.add_statement (new CCodeReturnStatement (new CCodeCastExpression (new CCodeMemberAccess.pointer (new CCodeIdentifier ("result"), dbus_use_ptr_array (array_type) ? "pdata" : "data"), method.return_type.get_cname ())));
} else {
// string arrays or other datatypes
@@ -414,6 +445,26 @@
}
}
+ bool dbus_use_ptr_array (ArrayType array_type) {
+ if (array_type.element_type.data_type == codegen.string_type.data_type) {
+ // use char**
+ return false;
+ } else if (array_type.element_type.data_type == codegen.bool_type.data_type
+ || array_type.element_type.data_type == codegen.int_type.data_type
+ || array_type.element_type.data_type == codegen.uint_type.data_type
+ || array_type.element_type.data_type == codegen.long_type.data_type
+ || array_type.element_type.data_type == codegen.ulong_type.data_type
+ || array_type.element_type.data_type == codegen.int64_type.data_type
+ || array_type.element_type.data_type == codegen.uint64_type.data_type
+ || array_type.element_type.data_type == codegen.double_type.data_type) {
+ // use GArray
+ return false;
+ } else {
+ // use GPtrArray
+ return true;
+ }
+ }
+
CCodeExpression get_dbus_g_type (DataType data_type) {
var array_type = data_type as ArrayType;
if (array_type != null) {
@@ -422,7 +473,11 @@
}
var carray_type = new CCodeFunctionCall (new CCodeIdentifier ("dbus_g_type_get_collection"));
- carray_type.add_argument (new CCodeConstant ("\"GArray\""));
+ if (dbus_use_ptr_array (array_type)) {
+ carray_type.add_argument (new CCodeConstant ("\"GPtrArray\""));
+ } else {
+ carray_type.add_argument (new CCodeConstant ("\"GArray\""));
+ }
carray_type.add_argument (get_dbus_g_type (array_type.element_type));
return carray_type;
} else {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]