[vala] codegen: Support ownership transfer of non-null struct types
- From: Luca Bruno <lucabru src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala] codegen: Support ownership transfer of non-null struct types
- Date: Sat, 9 Jul 2011 09:07:54 +0000 (UTC)
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]