From: Joakim Sindholt Date: Thu, 3 Mar 2011 01:27:32 +0000 (+0100) Subject: codegen: Copy the delegate target when copying structs X-Git-Tag: 0.12.1~62 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e7c205b5dd907105b8b74dd55bbb7dc309172275;p=thirdparty%2Fvala.git codegen: Copy the delegate target when copying structs Fixes bug 639751. --- diff --git a/codegen/valaccodestructmodule.vala b/codegen/valaccodestructmodule.vala index 553e8218d..b6114dcbf 100644 --- a/codegen/valaccodestructmodule.vala +++ b/codegen/valaccodestructmodule.vala @@ -293,6 +293,15 @@ public abstract class Vala.CCodeStructModule : CCodeBaseModule { } else { ccode.add_assignment (dest, copy); + if (f.variable_type is DelegateType) { + var delegate_type = (DelegateType) f.variable_type; + if (delegate_type.delegate_symbol.has_target) { + // copy field storing delegate target + var target_name = get_delegate_target_cname (f.name); + ccode.add_assignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("dest"), target_name), new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), target_name)); + } + } + if (array_type != null) { for (int dim = 1; dim <= array_type.rank; dim++) { var len_src = new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), get_array_length_cname (f.name, dim)); diff --git a/tests/Makefile.am b/tests/Makefile.am index b643d8a4e..f4bb5c12e 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -54,6 +54,7 @@ TESTS = \ delegates/delegates.vala \ delegates/bug595610.vala \ delegates/bug595639.vala \ + delegates/bug639751.vala \ objects/classes.vala \ objects/fields.vala \ objects/interfaces.vala \ diff --git a/tests/delegates/bug639751.vala b/tests/delegates/bug639751.vala new file mode 100644 index 000000000..055a6deec --- /dev/null +++ b/tests/delegates/bug639751.vala @@ -0,0 +1,10 @@ +struct Foo { + public SourceFunc bar; +} + +void main() { + var foo = Foo (); + foo.bar = () => { foo.bar = null; return false; }; + var baz = foo; + baz.bar (); +}