]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix delegate target usage in async methods
authorLuca Bruno <lethalman88@gmail.com>
Wed, 21 Apr 2010 11:32:08 +0000 (13:32 +0200)
committerJürg Billeter <j@bitron.ch>
Wed, 28 Apr 2010 07:21:49 +0000 (09:21 +0200)
Fixes bug 612641.

codegen/valagasyncmodule.vala

index 58ca887e2e92893d86631595296d24e7f4ddb8f2..435dee58fb3552bc36e14e6db71a2fb60699603e 100644 (file)
@@ -51,8 +51,11 @@ public class Vala.GAsyncModule : GSignalModule {
                                        data.add_field ("gint", get_array_length_cname (get_variable_cname (param.name), dim));
                                }
                        } else if (param.parameter_type is DelegateType) {
-                               data.add_field ("gpointer", get_delegate_target_cname (get_variable_cname (param.name)));
-                               data.add_field ("GDestroyNotify", get_delegate_target_destroy_notify_cname (get_variable_cname (param.name)));
+                               var deleg_type = (DelegateType) param.parameter_type;
+                               if (deleg_type.delegate_symbol.has_target) {
+                                       data.add_field ("gpointer", get_delegate_target_cname (get_variable_cname (param.name)));
+                                       data.add_field ("GDestroyNotify", get_delegate_target_destroy_notify_cname (get_variable_cname (param.name)));
+                               }
                        }
                }
 
@@ -64,8 +67,11 @@ public class Vala.GAsyncModule : GSignalModule {
                                        data.add_field ("gint", get_array_length_cname ("result", dim));
                                }
                        } else if (m.return_type is DelegateType) {
-                               data.add_field ("gpointer", get_delegate_target_cname ("result"));
-                               data.add_field ("GDestroyNotify", get_delegate_target_destroy_notify_cname ("result"));
+                               var deleg_type = (DelegateType) m.return_type;
+                               if (deleg_type.delegate_symbol.has_target) {
+                                       data.add_field ("gpointer", get_delegate_target_cname ("result"));
+                                       data.add_field ("GDestroyNotify", get_delegate_target_destroy_notify_cname ("result"));
+                               }
                        }
                }
 
@@ -240,9 +246,11 @@ public class Vala.GAsyncModule : GSignalModule {
                                        }
                                } else if (param.parameter_type is DelegateType) {
                                        var deleg_type = (DelegateType) param.parameter_type;
-                                       asyncblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (data_var, get_delegate_target_cname (get_variable_cname (param.name))), new CCodeIdentifier (get_delegate_target_cname (get_variable_cname (param.name))))));
-                                       if (deleg_type.value_owned) {
-                                               asyncblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (data_var, get_delegate_target_destroy_notify_cname (get_variable_cname (param.name))), new CCodeIdentifier (get_delegate_target_destroy_notify_cname (get_variable_cname (param.name))))));
+                                       if (deleg_type.delegate_symbol.has_target) {
+                                               asyncblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (data_var, get_delegate_target_cname (get_variable_cname (param.name))), new CCodeIdentifier (get_delegate_target_cname (get_variable_cname (param.name))))));
+                                               if (deleg_type.value_owned) {
+                                                       asyncblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (data_var, get_delegate_target_destroy_notify_cname (get_variable_cname (param.name))), new CCodeIdentifier (get_delegate_target_destroy_notify_cname (get_variable_cname (param.name))))));
+                                               }
                                        }
                                }
                        }
@@ -434,7 +442,7 @@ public class Vala.GAsyncModule : GSignalModule {
                                for (int dim = 1; dim <= array_type.rank; dim++) {
                                        finishblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier (get_array_length_cname ("result", dim))), new CCodeMemberAccess.pointer (data_var, get_array_length_cname ("result", dim)))));
                                }
-                       } else if (return_type is DelegateType) {
+                       } else if (return_type is DelegateType && ((DelegateType) return_type).delegate_symbol.has_target) {
                                finishblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier (get_delegate_target_cname ("result"))), new CCodeMemberAccess.pointer (data_var, get_delegate_target_cname ("result")))));
                        }
                        if (!(return_type is ValueType) || return_type.nullable) {