vala r1583 - in trunk: . gobject
- From: juergbi svn gnome org
- To: svn-commits-list gnome org
- Subject: vala r1583 - in trunk: . gobject
- Date: Sun, 15 Jun 2008 19:39:26 +0000 (UTC)
Author: juergbi
Date: Sun Jun 15 19:39:26 2008
New Revision: 1583
URL: http://svn.gnome.org/viewvc/vala?rev=1583&view=rev
Log:
2008-06-15 JÃrg Billeter <j bitron ch>
* gobject/valaccodegeneratorsignal.vala:
* gobject/valaccodetypesymbolbinding.vala:
Fix crash when using signals with array parameters,
fixes bug 538212
Modified:
trunk/ChangeLog
trunk/gobject/valaccodegeneratorsignal.vala
trunk/gobject/valaccodetypesymbolbinding.vala
Modified: trunk/gobject/valaccodegeneratorsignal.vala
==============================================================================
--- trunk/gobject/valaccodegeneratorsignal.vala (original)
+++ trunk/gobject/valaccodegeneratorsignal.vala Sun Jun 15 19:39:26 2008
@@ -30,10 +30,18 @@
} else if (t is ErrorType) {
return ("POINTER");
} else if (t is ArrayType) {
- if (((ArrayType) t).element_type.data_type == string_type.data_type) {
- return ("BOXED");
+ if (dbus) {
+ if (((ArrayType) t).element_type.data_type == string_type.data_type) {
+ return ("BOXED");
+ } else {
+ return ("POINTER");
+ }
} else {
- return ("POINTER");
+ if (((ArrayType) t).element_type.data_type == string_type.data_type) {
+ return ("BOXED_INT");
+ } else {
+ return ("POINTER_INT");
+ }
}
} else if (t is VoidType) {
return ("VOID");
@@ -179,6 +187,10 @@
foreach (FormalParameter p in params) {
callback_decl.add_parameter (new CCodeFormalParameter ("arg_%d".printf (n_params), get_value_type_name_from_parameter (p)));
n_params++;
+ if (p.parameter_type.is_array () && !dbus) {
+ callback_decl.add_parameter (new CCodeFormalParameter ("arg_%d".printf (n_params), "gint"));
+ n_params++;
+ }
}
callback_decl.add_parameter (new CCodeFormalParameter ("data2", "gpointer"));
marshaller_body.add_statement (new CCodeTypeDefinition (get_value_type_name_from_type_reference (return_type), callback_decl));
@@ -235,7 +247,14 @@
i = 1;
foreach (FormalParameter p in params) {
string get_value_function;
- if (p.parameter_type is PointerType || p.parameter_type.type_parameter != null || p.direction != ParameterDirection.IN) {
+ bool is_array = p.parameter_type.is_array ();
+ if (is_array) {
+ if (((ArrayType) p.parameter_type).element_type.data_type == string_type.data_type) {
+ get_value_function = "g_value_get_boxed";
+ } else {
+ get_value_function = "g_value_get_pointer";
+ }
+ } else if (p.parameter_type is PointerType || p.parameter_type.type_parameter != null || p.direction != ParameterDirection.IN) {
get_value_function = "g_value_get_pointer";
} else if (p.parameter_type is ErrorType) {
get_value_function = "g_value_get_pointer";
@@ -248,6 +267,12 @@
inner_fc.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, new CCodeIdentifier ("param_values"), new CCodeIdentifier (i.to_string ())));
fc.add_argument (inner_fc);
i++;
+ if (is_array && !dbus) {
+ inner_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_get_int"));
+ inner_fc.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, new CCodeIdentifier ("param_values"), new CCodeIdentifier (i.to_string ())));
+ fc.add_argument (inner_fc);
+ i++;
+ }
}
fc.add_argument (new CCodeIdentifier ("data2"));
@@ -256,7 +281,7 @@
CCodeFunctionCall set_fc;
if (return_type.is_array ()) {
- if (((ArrayType)return_type).element_type.data_type == string_type.data_type) {
+ if (((ArrayType) return_type).element_type.data_type == string_type.data_type) {
set_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_take_boxed"));
} else {
set_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_set_pointer"));
Modified: trunk/gobject/valaccodetypesymbolbinding.vala
==============================================================================
--- trunk/gobject/valaccodetypesymbolbinding.vala (original)
+++ trunk/gobject/valaccodetypesymbolbinding.vala Sun Jun 15 19:39:26 2008
@@ -181,7 +181,6 @@
csignew.add_argument (marshal_arg);
var params = sig.get_parameters ();
- var params_len = params.size;
if (sig.return_type is PointerType || sig.return_type.type_parameter != null) {
csignew.add_argument (new CCodeConstant ("G_TYPE_POINTER"));
} else if (sig.return_type is ErrorType) {
@@ -191,9 +190,25 @@
} else {
csignew.add_argument (new CCodeConstant (sig.return_type.data_type.get_type_id ()));
}
+
+ int params_len = 0;
+ foreach (FormalParameter param in params) {
+ params_len++;
+ if (param.parameter_type.is_array ()) {
+ params_len++;
+ }
+ }
+
csignew.add_argument (new CCodeConstant ("%d".printf (params_len)));
foreach (FormalParameter param in params) {
- if (param.parameter_type is PointerType || param.parameter_type.type_parameter != null || param.direction != ParameterDirection.IN) {
+ if (param.parameter_type.is_array ()) {
+ if (((ArrayType) param.parameter_type).element_type.data_type == codegen.string_type.data_type) {
+ csignew.add_argument (new CCodeConstant ("G_TYPE_STRV"));
+ } else {
+ csignew.add_argument (new CCodeConstant ("G_TYPE_POINTER"));
+ }
+ csignew.add_argument (new CCodeConstant ("G_TYPE_INT"));
+ } else if (param.parameter_type is PointerType || param.parameter_type.type_parameter != null || param.direction != ParameterDirection.IN) {
csignew.add_argument (new CCodeConstant ("G_TYPE_POINTER"));
} else if (param.parameter_type is ErrorType) {
csignew.add_argument (new CCodeConstant ("G_TYPE_POINTER"));
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]