summaryrefslogtreecommitdiff
path: root/codegen/valaccodearraymodule.vala
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2020-07-27 13:36:56 +0200
committerRico Tzschichholz <ricotz@ubuntu.com>2020-07-27 13:46:11 +0200
commit12d8ae6fa93395b29af8c92ce9d744be2aea7fd0 (patch)
tree3f72e8979bcc0dfd4745f2eca5e6466497d15a19 /codegen/valaccodearraymodule.vala
parent1d220258059543cd9f4ff31027702fb4e6b8186a (diff)
downloadvala-12d8ae6fa93395b29af8c92ce9d744be2aea7fd0.tar.gz
codegen: Properly destroy elements of an inline struct array
Fixes https://gitlab.gnome.org/GNOME/vala/issues/365
Diffstat (limited to 'codegen/valaccodearraymodule.vala')
-rw-r--r--codegen/valaccodearraymodule.vala48
1 files changed, 39 insertions, 9 deletions
diff --git a/codegen/valaccodearraymodule.vala b/codegen/valaccodearraymodule.vala
index 0192f2cc9..68e77a15e 100644
--- a/codegen/valaccodearraymodule.vala
+++ b/codegen/valaccodearraymodule.vala
@@ -269,6 +269,36 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
return cname;
}
+ public override string? append_struct_array_destroy (Struct st) {
+ string cname = "_vala_%s_array_destroy".printf (get_ccode_name (st));
+
+ if (cfile.add_declaration (cname)) {
+ return cname;
+ }
+
+ var fun = new CCodeFunction (cname, "void");
+ fun.modifiers = CCodeModifiers.STATIC;
+ fun.add_parameter (new CCodeParameter ("array", "%s *".printf (get_ccode_name (st))));
+ fun.add_parameter (new CCodeParameter ("array_length", get_ccode_name (int_type)));
+
+ push_function (fun);
+
+ var ccondarr = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, new CCodeIdentifier ("array"), new CCodeConstant ("NULL"));
+ ccode.open_if (ccondarr);
+
+ ccode.add_declaration (get_ccode_name (int_type), new CCodeVariableDeclarator ("i"));
+ append_struct_array_free_loop (st);
+
+ ccode.close ();
+
+ pop_function ();
+
+ cfile.add_function_declaration (fun);
+ cfile.add_function (fun);
+
+ return cname;
+ }
+
void append_vala_array_free_loop () {
var cforinit = new CCodeAssignment (new CCodeIdentifier ("i"), new CCodeConstant ("0"));
var cforcond = new CCodeBinaryExpression (CCodeBinaryOperator.LESS_THAN, new CCodeIdentifier ("i"), new CCodeIdentifier ("array_length"));
@@ -477,21 +507,21 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
}
public override CCodeExpression destroy_value (TargetValue value, bool is_macro_definition = false) {
- var type = value.value_type;
-
- if (type is ArrayType) {
- var array_type = (ArrayType) type;
+ unowned ArrayType? array_type = value.value_type as ArrayType;
- if (!array_type.fixed_length) {
- return base.destroy_value (value, is_macro_definition);
+ if (array_type != null && array_type.fixed_length) {
+ unowned Struct? st = array_type.element_type.type_symbol as Struct;
+ if (st != null && !array_type.element_type.nullable) {
+ var ccall = new CCodeFunctionCall (new CCodeIdentifier (append_struct_array_destroy (st)));
+ ccall.add_argument (get_cvalue_ (value));
+ ccall.add_argument (get_ccodenode (array_type.length));
+ return ccall;
}
requires_array_free = true;
generate_type_declaration (delegate_target_destroy_type, cfile);
- var ccall = new CCodeFunctionCall (get_destroy_func_expression (type));
-
- ccall = new CCodeFunctionCall (new CCodeIdentifier ("_vala_array_destroy"));
+ var ccall = new CCodeFunctionCall (new CCodeIdentifier ("_vala_array_destroy"));
ccall.add_argument (get_cvalue_ (value));
ccall.add_argument (get_ccodenode (array_type.length));
ccall.add_argument (new CCodeCastExpression (get_destroy_func_expression (array_type.element_type), get_ccode_name (delegate_target_destroy_type)));