]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Fix critical on delegate cast
authorJürg Billeter <j@bitron.ch>
Thu, 21 Oct 2010 20:13:55 +0000 (22:13 +0200)
committerJürg Billeter <j@bitron.ch>
Thu, 21 Oct 2010 20:29:14 +0000 (22:29 +0200)
codegen/valaccodebasemodule.vala
codegen/valaccodememberaccessmodule.vala

index 267a6f4f7df945b77c155c10260b73cc6594cf11..9a53fc21f85e8625eb5d2f357e3ac974e1f0ba9c 100644 (file)
@@ -4634,6 +4634,19 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                innercexpr = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, innercexpr);
                        }
                        set_cvalue (expr, new CCodeCastExpression (innercexpr, expr.type_reference.get_cname ()));
+
+                       if (expr.type_reference is DelegateType) {
+                               if (get_delegate_target (expr.inner) != null) {
+                                       set_delegate_target (expr, get_delegate_target (expr.inner));
+                               } else {
+                                       set_delegate_target (expr, new CCodeConstant ("NULL"));
+                               }
+                               if (get_delegate_target_destroy_notify (expr.inner) != null) {
+                                       set_delegate_target_destroy_notify (expr, get_delegate_target_destroy_notify (expr.inner));
+                               } else {
+                                       set_delegate_target_destroy_notify (expr, new CCodeConstant ("NULL"));
+                               }
+                       }
                }
        }
        
@@ -5868,7 +5881,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                return glib_value.delegate_target_destroy_notify_cvalue;
        }
 
-       public void set_delegate_target_destroy_notify (Expression expr, CCodeExpression destroy_notify) {
+       public void set_delegate_target_destroy_notify (Expression expr, CCodeExpression? destroy_notify) {
                var glib_value = (GLibValue) expr.target_value;
                if (glib_value == null) {
                        glib_value = new GLibValue (expr.value_type);
index 6f57813cd12b39ae1ea386046c062d5b8ab32eda..499819a4586cdd7fd0a6b10d222a29948b3044f0 100644 (file)
@@ -91,29 +91,27 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                set_cvalue (expr, new CCodeIdentifier (m.get_cname ()));
                        }
 
-                       if (expr.target_type is DelegateType) {
-                               set_delegate_target_destroy_notify (expr, new CCodeConstant ("NULL"));
-                               if (m.binding == MemberBinding.STATIC) {
-                                       set_delegate_target (expr, new CCodeConstant ("NULL"));
-                               } else if (m.is_async_callback) {
-                                       if (current_method.closure) {
-                                               var block = ((Method) m.parent_symbol).body;
-                                               set_delegate_target (expr, new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), "_async_data_"));
-                                       } else {
-                                               set_delegate_target (expr, new CCodeIdentifier ("data"));
-                                       }
-                               } else if (expr.inner != null) {
-                                       // expr.inner is null in the special case of referencing the method in a constant initializer
-                                       var delegate_target = (CCodeExpression) get_ccodenode (expr.inner);
-                                       var delegate_type = expr.target_type as DelegateType;
-                                       if ((expr.value_type.value_owned || (delegate_type != null && delegate_type.is_called_once)) && expr.inner.value_type.data_type != null && expr.inner.value_type.data_type.is_reference_counting ()) {
-                                               var ref_call = new CCodeFunctionCall (get_dup_func_expression (expr.inner.value_type, expr.source_reference));
-                                               ref_call.add_argument (delegate_target);
-                                               delegate_target = ref_call;
-                                               set_delegate_target_destroy_notify (expr, get_destroy_func_expression (expr.inner.value_type));
-                                       }
-                                       set_delegate_target (expr, delegate_target);
+                       set_delegate_target_destroy_notify (expr, new CCodeConstant ("NULL"));
+                       if (m.binding == MemberBinding.STATIC) {
+                               set_delegate_target (expr, new CCodeConstant ("NULL"));
+                       } else if (m.is_async_callback) {
+                               if (current_method.closure) {
+                                       var block = ((Method) m.parent_symbol).body;
+                                       set_delegate_target (expr, new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), "_async_data_"));
+                               } else {
+                                       set_delegate_target (expr, new CCodeIdentifier ("data"));
+                               }
+                       } else if (expr.inner != null) {
+                               // expr.inner is null in the special case of referencing the method in a constant initializer
+                               var delegate_target = (CCodeExpression) get_ccodenode (expr.inner);
+                               var delegate_type = expr.target_type as DelegateType;
+                               if ((expr.value_type.value_owned || (delegate_type != null && delegate_type.is_called_once)) && expr.inner.value_type.data_type != null && expr.inner.value_type.data_type.is_reference_counting ()) {
+                                       var ref_call = new CCodeFunctionCall (get_dup_func_expression (expr.inner.value_type, expr.source_reference));
+                                       ref_call.add_argument (delegate_target);
+                                       delegate_target = ref_call;
+                                       set_delegate_target_destroy_notify (expr, get_destroy_func_expression (expr.inner.value_type));
                                }
+                               set_delegate_target (expr, delegate_target);
                        }
                } else if (expr.symbol_reference is ArrayLengthField) {
                        if (expr.value_type is ArrayType && !(expr.parent_node is ElementAccess)) {