]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Report error for instance methods used as delegates without target
authorJürg Billeter <j@bitron.ch>
Fri, 29 Jan 2010 20:24:03 +0000 (21:24 +0100)
committerJürg Billeter <j@bitron.ch>
Fri, 29 Jan 2010 20:29:21 +0000 (21:29 +0100)
codegen/valaccodedelegatemodule.vala

index d8cad9d7050209689c0b7938956fbcdf16741786..5e4dd46cf4af4e9b4b0330aa9d58b86665f49e3d 100644 (file)
@@ -331,13 +331,13 @@ internal class Vala.CCodeDelegateModule : CCodeArrayModule {
                                method = method.base_interface_method;
                        }
 
-                       return new CCodeIdentifier (generate_delegate_wrapper (method, dt.delegate_symbol));
+                       return new CCodeIdentifier (generate_delegate_wrapper (method, dt.delegate_symbol, expr));
                }
 
                return base.get_implicit_cast_expression (source_cexpr, expression_type, target_type, expr);
        }
 
-       private string generate_delegate_wrapper (Method m, Delegate d) {
+       private string generate_delegate_wrapper (Method m, Delegate d, CodeNode? node) {
                string delegate_name;
                var sig = d.parent_symbol as Signal;
                var dynamic_sig = sig as DynamicSignal;
@@ -448,8 +448,13 @@ internal class Vala.CCodeDelegateModule : CCodeArrayModule {
                                arg = new CCodeIdentifier ("self");
                        } else {
                                // use first delegate parameter as instance
-                               arg = new CCodeIdentifier ((d_params.get (0).ccodenode as CCodeFormalParameter).name);
-                               i = 1;
+                               if (d_params.size == 0) {
+                                       Report.error (node != null ? node.source_reference : null, "Cannot create delegate without target for instance method or closure");
+                                       arg = new CCodeConstant ("NULL");
+                               } else {
+                                       arg = new CCodeIdentifier ((d_params.get (0).ccodenode as CCodeFormalParameter).name);
+                                       i = 1;
+                               }
                        }
                        carg_map.set (get_param_pos (m.cinstance_parameter_position), arg);
                }