[vala/0.50] codegen: Don't free unowned heap allocated struct
- From: Rico Tzschichholz <ricotz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/0.50] codegen: Don't free unowned heap allocated struct
- Date: Mon, 12 Apr 2021 10:48:01 +0000 (UTC)
commit ab02c6e1d606856baf1d94b8df5f102f3d5ce574
Author: Rico Tzschichholz <ricotz ubuntu com>
Date: Mon Apr 12 09:21:48 2021 +0200
codegen: Don't free unowned heap allocated struct
Regression of 63551acaf0d83fac8b50904c2759c1098fbfaa71
codegen/valaccodebasemodule.vala | 3 ++-
tests/structs/cast-struct-boxed.vala | 46 ++++++++++++++++++++++++++++++++++++
2 files changed, 48 insertions(+), 1 deletion(-)
---
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 7466d5cec..985b005c7 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -5423,7 +5423,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
while (inner_expr is CastExpression) {
inner_expr = ((CastExpression) inner_expr).inner;
}
- if (!(inner_expr.symbol_reference is Variable || inner_expr is ElementAccess)) {
+ if (inner_expr.value_type.value_owned
+ && !(inner_expr.symbol_reference is Variable || inner_expr is ElementAccess)) {
// heap allocated struct leaked, destroy it
var value = new GLibValue (new PointerType (new VoidType ()), innercexpr);
temp_ref_values.insert (0, value);
diff --git a/tests/structs/cast-struct-boxed.vala b/tests/structs/cast-struct-boxed.vala
index 97ccd1d7d..86fff4064 100644
--- a/tests/structs/cast-struct-boxed.vala
+++ b/tests/structs/cast-struct-boxed.vala
@@ -9,6 +9,11 @@ Foo? foo_heap_owned () {
return foo;
}
+unowned Foo? foo_heap_unowned () {
+ foo = { 42 };
+ return foo;
+}
+
void test_without_destroy () {
{
Foo f = foo_heap_owned ();
@@ -22,6 +27,18 @@ void test_without_destroy () {
Foo f = (!) foo_heap_owned ();
assert (f.i == 23);
}
+ {
+ Foo f = foo_heap_unowned ();
+ assert (f.i == 42);
+ }
+ {
+ Foo f = (Foo) foo_heap_unowned ();
+ assert (f.i == 42);
+ }
+ {
+ Foo f = (!) foo_heap_unowned ();
+ assert (f.i == 42);
+ }
}
struct Bar {
@@ -35,6 +52,11 @@ Bar? bar_heap_owned () {
return bar;
}
+unowned Bar? bar_heap_unowned () {
+ bar = { "manam" };
+ return bar;
+}
+
void test_with_destroy () {
{
Bar b = bar_heap_owned ();
@@ -48,6 +70,30 @@ void test_with_destroy () {
Bar b = (!) bar_heap_owned ();
assert (b.s == "bar");
}
+ {
+ Bar b = bar_heap_unowned ();
+ assert (b.s == "manam");
+ }
+ {
+ Bar b = (Bar) bar_heap_unowned ();
+ assert (b.s == "manam");
+ }
+ {
+ Bar b = (!) bar_heap_unowned ();
+ assert (b.s == "manam");
+ }
+ {
+ unowned Bar b = bar_heap_unowned ();
+ assert (b.s == "manam");
+ }
+ {
+ unowned Bar b = (Bar) bar_heap_unowned ();
+ assert (b.s == "manam");
+ }
+ {
+ unowned Bar b = (!) bar_heap_unowned ();
+ assert (b.s == "manam");
+ }
}
void main () {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]