From: Marvin W Date: Tue, 14 Mar 2017 17:04:07 +0000 (+0100) Subject: codegen: Properly null-out source on ownership-transfer of delegates X-Git-Tag: 0.36.0~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=89f9390c7d937a618506bb2453afbfc8ef8fb632;p=thirdparty%2Fvala.git codegen: Properly null-out source on ownership-transfer of delegates --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 16b5a014c..2d3ae5eb6 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -5262,6 +5262,11 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { creation_call.add_argument (new CCodeIdentifier ("sizeof (%s)".printf (get_ccode_name (expr.inner.value_type)))); ccode.add_expression (creation_call); } else if (expr.value_type is DelegateType) { + ccode.add_assignment (get_cvalue (expr.inner), new CCodeConstant ("NULL")); + var target = get_delegate_target_cvalue (expr.inner.target_value); + if (target != null) { + ccode.add_assignment (target, new CCodeConstant ("NULL")); + } var target_destroy_notify = get_delegate_target_destroy_notify_cvalue (expr.inner.target_value); if (target_destroy_notify != null) { ccode.add_assignment (target_destroy_notify, new CCodeConstant ("NULL")); diff --git a/tests/Makefile.am b/tests/Makefile.am index 6a50505bb..426570c5a 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -145,6 +145,7 @@ TESTS = \ structs/bug775761.vala \ structs/bug777194.vala \ delegates/delegates.vala \ + delegates/reference_transfer.vala \ delegates/bug539166.vala \ delegates/bug595610.vala \ delegates/bug595639.vala \ diff --git a/tests/delegates/reference_transfer.vala b/tests/delegates/reference_transfer.vala new file mode 100644 index 000000000..6aad6b1f9 --- /dev/null +++ b/tests/delegates/reference_transfer.vala @@ -0,0 +1,14 @@ +delegate void FooFunc (); + +class Foo { + FooFunc f; + + public Foo (owned FooFunc d) { + f = (owned) d; + assert (d == null); + } +} + +void main () { + var foo = new Foo (() => {}); +}