vala r1544 - in trunk: . gobject



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]