]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Fix property access inside opaque compact class
authorPrinceton Ferro <princetonferro@gmail.com>
Mon, 30 Aug 2021 02:02:26 +0000 (22:02 -0400)
committerRico Tzschichholz <ricotz@ubuntu.com>
Mon, 30 Aug 2021 06:56:52 +0000 (08:56 +0200)
Avoid using "priv" when accessing a private or internal field backing a
property of a compact class.

codegen/valaccodememberaccessmodule.vala
tests/semantic/class-opaque-automatic-property.c-expected
tests/semantic/class-opaque-automatic-property.vala

index 88a3d74c9e0f56cbda0e8a8ec55944729c65ee3a..4e411c73e0cc64a737c0de7561353f6ab89c78c7 100644 (file)
@@ -248,8 +248,10 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                            prop.base_property == null &&
                            prop.base_interface_property == null &&
                            !(prop.property_type is ArrayType || prop.property_type is DelegateType)) {
-                               CCodeExpression inst;
-                               inst = new CCodeMemberAccess.pointer (pub_inst, "priv");
+                               CCodeExpression inst = pub_inst;
+                               if (!((Class) current_type_symbol).is_compact) {
+                                       inst = new CCodeMemberAccess.pointer (inst, "priv");
+                               }
                                set_cvalue (expr, new CCodeMemberAccess.pointer (inst, get_ccode_name (prop.field)));
                        } else if (!get_ccode_no_accessor_method (prop)) {
                                string getter_cname;
index a60070aeb0b00656bcbacd2de47df6862caf5c6b..fbb7cb85c6310b8eb36bbd074e3e19fbb900e1d3 100644 (file)
@@ -27,12 +27,23 @@ struct _Foo {
 VALA_EXTERN void foo_free (Foo * self);
 G_DEFINE_AUTOPTR_CLEANUP_FUNC (Foo, foo_free)
 static void foo_instance_init (Foo * self);
-VALA_EXTERN Foo* foo_new (void);
-VALA_EXTERN gint foo_get_bar (Foo* self);
+VALA_EXTERN void foo_manam (Foo* self);
 VALA_EXTERN void foo_set_bar (Foo* self,
                   gint value);
+VALA_EXTERN gint foo_get_bar (Foo* self);
+VALA_EXTERN Foo* foo_new (void);
 static void _vala_main (void);
 
+void
+foo_manam (Foo* self)
+{
+       gint _tmp0_;
+       g_return_if_fail (self != NULL);
+       foo_set_bar (self, 23);
+       _tmp0_ = self->_bar;
+       _vala_assert (_tmp0_ == 23, "bar == 23");
+}
+
 Foo*
 foo_new (void)
 {
@@ -79,6 +90,7 @@ _vala_main (void)
        gint _tmp2_;
        _tmp0_ = foo_new ();
        foo = _tmp0_;
+       foo_manam (foo);
        foo_set_bar (foo, 42);
        _tmp1_ = foo_get_bar (foo);
        _tmp2_ = _tmp1_;
index 8400a78b53111fc4a589ae23d1f8c63966060110..893d03f42ad37f08545637a479744f6cb2b7ad97 100644 (file)
@@ -1,10 +1,16 @@
 [Compact (opaque = true)]
 public class Foo {
        public int bar { get; set; }
+
+       public void manam () {
+               bar = 23;
+               assert (bar == 23);
+       }
 }
 
 void main () {
        var foo = new Foo ();
+       foo.manam ();
        foo.bar = 42;
        assert (foo.bar == 42);
 }