]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Discourage copying delegates with target
authorJürg Billeter <j@bitron.ch>
Wed, 18 May 2011 20:47:25 +0000 (22:47 +0200)
committerJürg Billeter <j@bitron.ch>
Wed, 18 May 2011 20:59:45 +0000 (22:59 +0200)
Target destroy notify cannot be copied, which means that memory
management will often not work as expected. Use ownership transfer,
unowned target variable, or extra closure instead.

codegen/valaccodebasemodule.vala
tests/asynchronous/bug597294.vala
tests/asynchronous/bug639591.vala
tests/delegates/bug595639.vala
tests/delegates/bug639751.vala

index 09dad443f171dfb46d2c6d4aebc37dcc76d692b8..9fb3ca319be3528af9a9a10f32886bd569b370b2 100644 (file)
@@ -3696,6 +3696,10 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                var result = ((GLibValue) value).copy ();
 
                if (type is DelegateType) {
+                       var delegate_type = (DelegateType) type;
+                       if (delegate_type.delegate_symbol.has_target) {
+                               Report.deprecated (node.source_reference, "copying delegates is discouraged");
+                       }
                        result.delegate_target_destroy_notify_cvalue = new CCodeConstant ("NULL");
                        return result;
                }
index 92a04bf329e3743bae1ac5c2f87a20b5d3d0b401..2558460138de3ff3ac7c3203f407e1e5cbde192e 100644 (file)
@@ -1,6 +1,6 @@
 delegate void Foo ();
 
-async void do_foo (Foo f) {
+async void do_foo (owned Foo f) {
        f ();
 }
 
index 1c92edba81d150ec8653a7dacbf40a7d1fc1a7ee..89504ff4d1dc33e4087a77cb8cae331cea979cb9 100644 (file)
@@ -1,6 +1,6 @@
 delegate void Deleg ();
 
-async void foo (Deleg deleg)
+async void foo (owned Deleg deleg)
 {
        Deleg d = () => { deleg (); };
        d = null;
index 3278dfe1514a8605d3e951af7ea2d1053cfea3e0..55ba11b5e0b10efee677cc9ebdf512827348e0f3 100644 (file)
@@ -1,7 +1,7 @@
 delegate void Foo ();
 
-void do_foo (Foo foo) {
-       Foo bar = foo;
+void do_foo (owned Foo foo) {
+       Foo bar = (owned) foo;
 }
 
 void main () {
index 055a6deec5143bc81a8a59fcde0308454362d3c9..8c69a81eeb8a9c79f9da3620e887a97ec6e384ea 100644 (file)
@@ -1,5 +1,5 @@
 struct Foo {
-       public SourceFunc bar;
+       public unowned SourceFunc bar;
 }
 
 void main() {