[vala] codegen: Support ownership transfer of non-null struct types



commit e7a45b8239d35e81d49bf60b95e2dcb47bcf5bd5
Author: Luca Bruno <lucabru src gnome org>
Date:   Sat Jul 9 10:48:44 2011 +0200

    codegen: Support ownership transfer of non-null struct types
    
    Fixes bug 596144.

 codegen/valaccodebasemodule.vala |   14 +++++++++++---
 tests/Makefile.am                |    1 +
 tests/structs/bug596144.vala     |   11 +++++++++++
 3 files changed, 23 insertions(+), 3 deletions(-)
---
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 16e3856..92f0274 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 eca8dd2..9a2c4e2 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 0000000..67468de
--- /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);
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]