]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
girwriter: Write implicit fields for arrays and delegates
authorRico Tzschichholz <ricotz@ubuntu.com>
Fri, 3 May 2019 13:32:04 +0000 (15:32 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Tue, 6 Aug 2019 11:49:45 +0000 (13:49 +0200)
codegen/valagirwriter.vala

index 7c843e6af342f39cc1bb222caa8b63423483c1b8..25800212e16dfebe44839dc1807d3ba44e9a1f06 100644 (file)
@@ -939,6 +939,50 @@ public class Vala.GIRWriter : CodeVisitor {
                indent--;
                write_indent ();
                buffer.append_printf ("</field>\n");
+
+               if (f.variable_type is ArrayType && CCodeBaseModule.get_ccode_array_length (f)) {
+                       var array_type = (ArrayType) f.variable_type;
+                       if (!array_type.fixed_length) {
+                               var int_type = new IntegerType (context.root.scope.lookup ("int") as Struct);
+                               for (var i = 0; i < array_type.rank; i++) {
+                                       write_indent ();
+                                       buffer.append_printf ("<field name=\"%s_length%i\"", CCodeBaseModule.get_ccode_name (f), i + 1);
+                                       write_symbol_attributes (f);
+                                       buffer.append_printf (">\n");
+                                       indent++;
+                                       write_type (int_type);
+                                       indent--;
+                                       write_indent ();
+                                       buffer.append_printf ("</field>\n");
+                               }
+                       }
+               } else if (f.variable_type is DelegateType) {
+                       var deleg_type = (DelegateType) f.variable_type;
+                       if (deleg_type.delegate_symbol.has_target) {
+                               write_indent ();
+                               buffer.append_printf ("<field name=\"%s\"", CCodeBaseModule.get_ccode_delegate_target_name (f));
+                               write_symbol_attributes (f);
+                               buffer.append_printf (">\n");
+                               indent++;
+                               write_indent ();
+                               buffer.append_printf ("<type name=\"gpointer\" c:type=\"gpointer\"/>\n");
+                               indent--;
+                               write_indent ();
+                               buffer.append_printf ("</field>\n");
+                               if (deleg_type.is_disposable ()) {
+                                       write_indent ();
+                                       buffer.append_printf ("<field name=\"%s\"", ((CCodeBaseModule) context.codegen).get_delegate_target_destroy_notify_cname (CCodeBaseModule.get_ccode_name (f)));
+                                       write_symbol_attributes (f);
+                                       buffer.append_printf (">\n");
+                                       indent++;
+                                       write_indent ();
+                                       buffer.append_printf ("<type name=\"GLib.DestroyNotify\" c:type=\"GDestroyNotify\"/>\n");
+                                       indent--;
+                                       write_indent ();
+                                       buffer.append_printf ("</field>\n");
+                               }
+                       }
+               }
        }
 
        private void write_implicit_params (DataType? type, ref int index, bool has_array_length, string? name, ParameterDirection direction) {