From: Nikolay Orlyuk Date: Tue, 19 Feb 2013 00:35:29 +0000 (+0200) Subject: codegen: Fix instance parameter for property setter in SimpleType structs X-Git-Tag: 0.35.6~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f4182fc69849eb735c8dd1083bd2322071aaa79b;p=thirdparty%2Fvala.git codegen: Fix instance parameter for property setter in SimpleType structs Add test-case and fix code generator for call to the setter to pass instance as a value rather than as a pointer to value. Based on patches by Nathan Summers. https://bugzilla.gnome.org/show_bug.cgi?id=657346 --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 6a18b881b..880e8a2d0 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -5921,8 +5921,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { /* target instance is first argument */ var cinstance = (CCodeExpression) get_ccodenode (instance); - if (prop.parent_symbol is Struct) { - // we need to pass struct instance by reference + if (prop.parent_symbol is Struct && !((Struct) prop.parent_symbol).is_simple_type ()) { + // we need to pass struct instance by reference if it isn't a simple-type var instance_value = instance.target_value; if (!get_lvalue (instance_value)) { instance_value = store_temp_value (instance_value, instance); diff --git a/tests/Makefile.am b/tests/Makefile.am index 268409bc0..666f11011 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -130,6 +130,7 @@ TESTS = \ structs/bug685177.vala \ structs/bug686190.vala \ structs/bug690380.vala \ + structs/bug694140.vala \ structs/bug749952.vala \ structs/bug775761.vala \ structs/bug777194.vala \ diff --git a/tests/structs/bug694140.vala b/tests/structs/bug694140.vala new file mode 100644 index 000000000..18368a979 --- /dev/null +++ b/tests/structs/bug694140.vala @@ -0,0 +1,23 @@ +string[] colors; + +[SimpleType] +[CCode (has_type_id = false)] +struct Foo : int { + public string bar { + get { + return colors[(int) this]; + } + set { + colors[(int) this] = value; + } + } +} + +void main () { + colors = { "black", "red", "green", "blue" }; + + Foo foo = 1; + assert (foo.bar == "red"); + foo.bar = "white"; + assert (foo.bar == "white"); +}