]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Copy the delegate target when copying structs
authorJoakim Sindholt <opensource@zhasha.com>
Thu, 3 Mar 2011 01:27:32 +0000 (02:27 +0100)
committerJürg Billeter <j@bitron.ch>
Sun, 29 May 2011 08:35:26 +0000 (10:35 +0200)
Fixes bug 639751.

codegen/valaccodestructmodule.vala
tests/Makefile.am
tests/delegates/bug639751.vala [new file with mode: 0644]

index 553e8218da3137d052bfb818439091eea7707337..b6114dcbfae5e1ecc8d8b84a661a89a3fc58a029 100644 (file)
@@ -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));
index b643d8a4ef98d5605a2f11778ab961956826b25a..f4bb5c12ed1ba7899cb221a0ad3b8eb98e86a6ff 100644 (file)
@@ -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 (file)
index 0000000..055a6de
--- /dev/null
@@ -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 ();
+}