diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2019-11-06 21:03:51 +0100 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2019-11-07 08:10:49 +0100 |
commit | 6ede8e0df57e000134350a014f80ea13a7e1a936 (patch) | |
tree | 7729ee79fb93eceab42e4a1c0dc863719a17c4c5 | |
parent | 6040c10e41f874b4140a5efb2b41dbe3023f054e (diff) | |
download | vala-6ede8e0df57e000134350a014f80ea13a7e1a936.tar.gz |
vala: Restore DestroysInstance behaviour for non-compact classes
Although this attribute is not meant to be applied on methods of reference
counted classes, the original behaviour should not be changed silently.
Regression of 3d83f31a659bd179e8a867dd054126ac6f22e82b
Fixes https://gitlab.gnome.org/GNOME/vala/issues/873
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/objects/class-destroysinstance.vala | 15 | ||||
-rw-r--r-- | vala/valamemberaccess.vala | 3 |
3 files changed, 18 insertions, 1 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am index e13579755..2923d4cc5 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -304,6 +304,7 @@ TESTS = \ delegates/bug792077.vala \ objects/chainup.vala \ objects/class_only.vala \ + objects/class-destroysinstance.vala \ objects/classes.vala \ objects/classes-interfaces.vala \ objects/classes-interfaces-virtuals.vala \ diff --git a/tests/objects/class-destroysinstance.vala b/tests/objects/class-destroysinstance.vala new file mode 100644 index 000000000..d5de16b62 --- /dev/null +++ b/tests/objects/class-destroysinstance.vala @@ -0,0 +1,15 @@ +class Foo : Object { + [DestroysInstance] + public void free () { + assert (this.ref_count == 2); + this.unref (); + } +} + +void main () { + var foo = new Foo (); + { + foo.free (); + } + assert (foo.ref_count == 1); +} diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala index cbf251771..a1b0fe84c 100644 --- a/vala/valamemberaccess.vala +++ b/vala/valamemberaccess.vala @@ -916,7 +916,8 @@ public class Vala.MemberAccess : Expression { } if (symbol_reference is Method && ((Method) symbol_reference).get_attribute ("DestroysInstance") != null) { - if (ma != null) { + unowned Class? cl = ((Method) symbol_reference).parent_symbol as Class; + if (cl != null && cl.is_compact && ma != null) { ma.lvalue = true; ma.check_lvalue_access (); } |