]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Support calling methods that return modified pointer on properties
authorLuca Bruno <lucabru@src.gnome.org>
Mon, 27 Jun 2011 12:25:54 +0000 (14:25 +0200)
committerLuca Bruno <lucabru@src.gnome.org>
Mon, 27 Jun 2011 12:26:59 +0000 (14:26 +0200)
Fixes bug 589928.

codegen/valaccodemethodcallmodule.vala
tests/Makefile.am
tests/objects/bug589928.vala [new file with mode: 0644]

index 4f8ce1611bed2491dfd6abbc38358b05878c3d22..845d928a4b2a9c0aea0f3ccbfa2b7730da7b6867 100644 (file)
@@ -688,7 +688,13 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                }
 
                if (m != null && m.binding == MemberBinding.INSTANCE && m.returns_modified_pointer) {
-                       ccall_expr = new CCodeAssignment (instance, ccall_expr);
+                       if (ma != null && ma.inner.symbol_reference is Property && ma.inner is MemberAccess) {
+                               var prop = (Property) ma.inner.symbol_reference;
+                               store_property (prop, ((MemberAccess) ma.inner).inner, new GLibValue (expr.value_type, ccall_expr));
+                               ccall_expr = null;
+                       } else {
+                               ccall_expr = new CCodeAssignment (instance, ccall_expr);
+                       }
                }
 
                if (m is ArrayResizeMethod) {
index 1ba9c9cc31015e056b69bad4729915703d3fa2c8..e3d6a5a55eef8ac178d51fdcc83ff67a24fca7a5 100644 (file)
@@ -81,6 +81,7 @@ TESTS = \
        objects/test-034.vala \
        objects/bug566909.vala \
        objects/bug588203.vala \
+       objects/bug589928.vala \
        objects/bug593260.vala \
        objects/bug596621.vala \
        objects/bug597155.vala \
diff --git a/tests/objects/bug589928.vala b/tests/objects/bug589928.vala
new file mode 100644 (file)
index 0000000..f235ba7
--- /dev/null
@@ -0,0 +1,9 @@
+class Foo {
+       public List<string> bar { get; owned set; default = new List<string> (); }
+}
+
+void main () {
+       Foo foo = new Foo ();
+       foo.bar.append ("1");
+       assert (foo.bar.nth_data (0) == "1");
+}