From: Rico Tzschichholz Date: Wed, 22 Mar 2017 15:04:00 +0000 (+0100) Subject: codegen: Fix delegate initializer for instance fields X-Git-Tag: 0.36.1~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=db6f68f365a168f1fcc8f46e4f7674acd84e2266;p=thirdparty%2Fvala.git codegen: Fix delegate initializer for instance fields Set delegate-target to "self" which is available in *_instance_init(). https://bugzilla.gnome.org/show_bug.cgi?id=683925 --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 2d3ae5eb6..8a95c6431 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -1130,6 +1130,16 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { var rhs_array_len = get_array_length_cvalue (field_value, 1); ccode.add_assignment (lhs_array_size, rhs_array_len); } + } else if (f.variable_type is DelegateType) { + var delegate_type = (DelegateType) f.variable_type; + if (delegate_type.delegate_symbol.has_target) { + var field_value = get_field_cvalue (f, load_this_parameter ((TypeSymbol) f.parent_symbol)); + + ccode.add_assignment (get_delegate_target_cvalue (field_value), new CCodeIdentifier ("self")); + if (delegate_type.is_disposable ()) { + ccode.add_assignment (get_delegate_target_destroy_notify_cvalue (field_value), new CCodeIdentifier ("NULL")); + } + } } } diff --git a/tests/Makefile.am b/tests/Makefile.am index add13c5a8..829df93be 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -153,6 +153,7 @@ TESTS = \ delegates/bug638415.vala \ delegates/bug639751.vala \ delegates/bug659778.vala \ + delegates/bug683925.vala \ delegates/bug703804.vala \ delegates/bug761360.vala \ delegates/bug772204.test \ diff --git a/tests/delegates/bug683925.vala b/tests/delegates/bug683925.vala new file mode 100644 index 000000000..5c0ba3636 --- /dev/null +++ b/tests/delegates/bug683925.vala @@ -0,0 +1,24 @@ +delegate void FooFunc (); + +class Foo : Object { + bool check = false; + + FooFunc func = default_func; + + public Foo () { + } + + void default_func () { + check = true; + } + + public void run () { + func (); + assert (check); + } +} + +void main(){ + var foo = new Foo (); + foo.run (); +}