vala r1544 - in trunk: . gobject
- From: juergbi svn gnome org
- To: svn-commits-list gnome org
- Subject: vala r1544 - in trunk: . gobject
- Date: Mon, 2 Jun 2008 19:23:34 +0000 (UTC)
Author: juergbi
Date: Mon Jun 2 19:23:34 2008
New Revision: 1544
URL: http://svn.gnome.org/viewvc/vala?rev=1544&view=rev
Log:
2008-06-02 JÃrg Billeter <j bitron ch>
* gobject/valaccodegenerator.vala:
* gobject/valaccodeinvocationexpressionbinding.vala:
* gobject/valaccodemethodbinding.vala:
Add basic support for owned delegates, fixes bug 533484
Modified:
trunk/ChangeLog
trunk/gobject/valaccodegenerator.vala
trunk/gobject/valaccodeinvocationexpressionbinding.vala
trunk/gobject/valaccodemethodbinding.vala
Modified: trunk/gobject/valaccodegenerator.vala
==============================================================================
--- trunk/gobject/valaccodegenerator.vala (original)
+++ trunk/gobject/valaccodegenerator.vala Mon Jun 2 19:23:34 2008
@@ -1274,7 +1274,7 @@
}
}
- private CCodeExpression? get_dup_func_expression (DataType type, SourceReference? source_reference) {
+ public CCodeExpression? get_dup_func_expression (DataType type, SourceReference? source_reference) {
var cl = type.data_type as Class;
if (type.data_type != null) {
string dup_function;
@@ -1349,7 +1349,7 @@
return dup_func;
}
- private CCodeExpression? get_destroy_func_expression (DataType type) {
+ public CCodeExpression? get_destroy_func_expression (DataType type) {
if (type.data_type == glist_type || type.data_type == gslist_type) {
// create wrapper function to free list elements if necessary
@@ -2817,6 +2817,10 @@
return new CCodeConstant ("NULL");
}
+ public string get_delegate_target_destroy_notify_cname (string delegate_cname) {
+ return "%s_target_destroy_notify".printf (delegate_cname);
+ }
+
public override void visit_element_access (ElementAccess expr) {
code_binding (expr).emit ();
}
Modified: trunk/gobject/valaccodeinvocationexpressionbinding.vala
==============================================================================
--- trunk/gobject/valaccodeinvocationexpressionbinding.vala (original)
+++ trunk/gobject/valaccodeinvocationexpressionbinding.vala Mon Jun 2 19:23:34 2008
@@ -170,7 +170,24 @@
var deleg_type = (DelegateType) param.parameter_type;
var d = deleg_type.delegate_symbol;
if (d.has_target) {
- carg_map.set (codegen.get_param_pos (param.cdelegate_target_parameter_position), codegen.get_delegate_target_cexpression (arg));
+ var delegate_target = codegen.get_delegate_target_cexpression (arg);
+ if (deleg_type.value_owned) {
+ CCodeExpression delegate_target_destroy_notify;
+ var delegate_method = arg.symbol_reference as Method;
+ var ma = arg as MemberAccess;
+ if (delegate_method != null && delegate_method.binding == MemberBinding.INSTANCE
+ && ma.inner != null && ma.inner.value_type.data_type != null
+ && ma.inner.value_type.data_type.is_reference_counting ()) {
+ var ref_call = new CCodeFunctionCall (codegen.get_dup_func_expression (ma.inner.value_type, arg.source_reference));
+ ref_call.add_argument (delegate_target);
+ delegate_target = ref_call;
+ delegate_target_destroy_notify = codegen.get_destroy_func_expression (ma.inner.value_type);
+ } else {
+ delegate_target_destroy_notify = new CCodeConstant ("NULL");
+ }
+ carg_map.set (codegen.get_param_pos (param.cdelegate_target_parameter_position + 0.01), delegate_target_destroy_notify);
+ }
+ carg_map.set (codegen.get_param_pos (param.cdelegate_target_parameter_position), delegate_target);
multiple_cargs = true;
}
} else if (param.parameter_type is MethodType) {
Modified: trunk/gobject/valaccodemethodbinding.vala
==============================================================================
--- trunk/gobject/valaccodemethodbinding.vala (original)
+++ trunk/gobject/valaccodemethodbinding.vala Mon Jun 2 19:23:34 2008
@@ -436,6 +436,11 @@
var cparam = new CCodeFormalParameter (codegen.get_delegate_target_cname (param.name), "void*");
cparam_map.set (codegen.get_param_pos (param.cdelegate_target_parameter_position), cparam);
carg_map.set (codegen.get_param_pos (param.cdelegate_target_parameter_position), new CCodeIdentifier (cparam.name));
+ if (deleg_type.value_owned) {
+ cparam = new CCodeFormalParameter (codegen.get_delegate_target_destroy_notify_cname (param.name), "GDestroyNotify");
+ cparam_map.set (codegen.get_param_pos (param.cdelegate_target_parameter_position + 0.01), cparam);
+ carg_map.set (codegen.get_param_pos (param.cdelegate_target_parameter_position + 0.01), new CCodeIdentifier (cparam.name));
+ }
}
}
}
@@ -618,6 +623,10 @@
if (d.has_target) {
var cparam = new CCodeFormalParameter (codegen.get_delegate_target_cname (param.name), "void*");
cparam_map.set (codegen.get_param_pos (param.cdelegate_target_parameter_position), cparam);
+ if (deleg_type.value_owned) {
+ cparam = new CCodeFormalParameter (codegen.get_delegate_target_destroy_notify_cname (param.name), "GDestroyNotify");
+ cparam_map.set (codegen.get_param_pos (param.cdelegate_target_parameter_position + 0.01), cparam);
+ }
}
} else if (param.parameter_type is MethodType) {
var cparam = new CCodeFormalParameter (codegen.get_delegate_target_cname (param.name), "void*");
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]