From: Luca Bruno Date: Sat, 9 Jul 2011 08:48:44 +0000 (+0200) Subject: codegen: Support ownership transfer of non-null struct types X-Git-Tag: 0.13.2~164 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e7a45b8239d35e81d49bf60b95e2dcb47bcf5bd5;p=thirdparty%2Fvala.git codegen: Support ownership transfer of non-null struct types Fixes bug 596144. --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 16e3856fd..92f0274c9 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -4597,13 +4597,21 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { /* tmp = expr.inner; expr.inner = NULL; expr = tmp; */ expr.target_value = store_temp_value (expr.inner.target_value, expr); - if (!(expr.value_type is DelegateType)) { - ccode.add_assignment (get_cvalue (expr.inner), new CCodeConstant ("NULL")); - } else { + if (expr.inner.value_type is StructValueType && !expr.inner.value_type.nullable) { + // memset needs string.h + cfile.add_include ("string.h"); + var creation_call = new CCodeFunctionCall (new CCodeIdentifier ("memset")); + creation_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_cvalue (expr.inner))); + creation_call.add_argument (new CCodeConstant ("0")); + creation_call.add_argument (new CCodeIdentifier ("sizeof (%s)".printf (expr.inner.value_type.get_cname ()))); + ccode.add_expression (creation_call); + } else if (expr.value_type is DelegateType) { var target_destroy_notify = get_delegate_target_destroy_notify_cvalue (expr.inner.target_value); if (target_destroy_notify != null) { ccode.add_assignment (target_destroy_notify, new CCodeConstant ("NULL")); } + } else { + ccode.add_assignment (get_cvalue (expr.inner), new CCodeConstant ("NULL")); } } diff --git a/tests/Makefile.am b/tests/Makefile.am index eca8dd27b..9a2c4e251 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -58,6 +58,7 @@ TESTS = \ structs/bug572091.vala \ structs/bug583603.vala \ structs/bug595587.vala \ + structs/bug596144.vala \ structs/bug606202.vala \ structs/bug609642.vala \ structs/bug613513.vala \ diff --git a/tests/structs/bug596144.vala b/tests/structs/bug596144.vala new file mode 100644 index 000000000..67468deec --- /dev/null +++ b/tests/structs/bug596144.vala @@ -0,0 +1,11 @@ +struct Foo { + Object o; +} + +void main () { + var o = new Object (); + var foo = Foo () { o=o }; + var bar = (owned) foo; + assert (foo.o == null); + assert (bar.o == o); +}