From: Jürg Billeter Date: Fri, 29 Jan 2010 20:24:03 +0000 (+0100) Subject: Report error for instance methods used as delegates without target X-Git-Tag: 0.7.10~31 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d20e60748429c8c1b14c85cd880ab7c8e1e8f54c;p=thirdparty%2Fvala.git Report error for instance methods used as delegates without target --- diff --git a/codegen/valaccodedelegatemodule.vala b/codegen/valaccodedelegatemodule.vala index d8cad9d70..5e4dd46cf 100644 --- a/codegen/valaccodedelegatemodule.vala +++ b/codegen/valaccodedelegatemodule.vala @@ -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); }