change run to use meson/ninja and then exec. - remove libvala code from application...
[roobuilder] / src / codegen / valaclassregisterfunction.vala
1 /* valaclassregisterfunction.vala
2  *
3  * Copyright (C) 2006-2008  Jürg Billeter
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
18  *
19  * Author:
20  *      Jürg Billeter <j@bitron.ch>
21  */
22
23 using GLib;
24
25 /**
26  * C function to register a class at runtime.
27  */
28 public class Vala.ClassRegisterFunction : TypeRegisterFunction {
29         /**
30          * Specifies the class to be registered.
31          */
32         public weak Class class_reference { get; set; }
33
34         /**
35          * Creates a new C function to register the specified class at runtime.
36          *
37          * @param cl a class
38          * @return   newly created class register function
39          */
40         public ClassRegisterFunction (Class cl) {
41                 class_reference = cl;
42         }
43
44         public override TypeSymbol get_type_declaration () {
45                 return class_reference;
46         }
47
48         public override string get_type_struct_name () {
49                 return get_ccode_type_name (class_reference);
50         }
51
52         public override string get_base_init_func_name () {
53                 if (class_reference.class_constructor != null) {
54                         return "%s_base_init".printf (get_ccode_lower_case_name (class_reference, null));
55                 } else {
56                         return "NULL";
57                 }
58         }
59
60         public override string get_class_finalize_func_name () {
61                 if (class_reference.static_destructor != null) {
62                         return "%s_class_finalize".printf (get_ccode_lower_case_name (class_reference, null));
63                 } else {
64                         return "NULL";
65                 }
66         }
67
68         public override string get_base_finalize_func_name () {
69                 if (class_reference.class_destructor != null) {
70                         return "%s_base_finalize".printf (get_ccode_lower_case_name (class_reference, null));
71                 } else {
72                         return "NULL";
73                 }
74         }
75
76         public override string get_class_init_func_name () {
77                 return "%s_class_init".printf (get_ccode_lower_case_name (class_reference, null));
78         }
79
80         public override string get_instance_struct_size () {
81                 return "sizeof (%s)".printf (get_ccode_name (class_reference));
82         }
83
84         public override string get_instance_init_func_name () {
85                 return "%s_instance_init".printf (get_ccode_lower_case_name (class_reference, null));
86         }
87
88         public override string get_parent_type_name () {
89                 return get_ccode_type_id (class_reference.base_class);
90         }
91
92         public override string get_type_flags () {
93                 if (class_reference.is_abstract) {
94                         return "G_TYPE_FLAG_ABSTRACT";
95                 } else if (CodeContext.get ().require_glib_version (2, 70) && class_reference.is_sealed) {
96                         return "G_TYPE_FLAG_FINAL";
97                 } else {
98                         return "0";
99                 }
100         }
101
102         public override SymbolAccessibility get_accessibility () {
103                 return class_reference.access;
104         }
105
106         public override string? get_gtype_value_table_init_function_name () {
107                 bool is_fundamental = !class_reference.is_compact && class_reference.base_class == null;
108                 if ( is_fundamental )
109                         return "%s_init".printf (get_ccode_lower_case_name (class_reference, "value_"));
110
111                 return null;
112         }
113
114         public override string? get_gtype_value_table_free_function_name () {
115                 bool is_fundamental = !class_reference.is_compact && class_reference.base_class == null;
116                 if ( is_fundamental )
117                         return "%s_free_value".printf (get_ccode_lower_case_name (class_reference, "value_"));
118
119                 return null;
120         }
121
122         public override string? get_gtype_value_table_copy_function_name () {
123                 bool is_fundamental = !class_reference.is_compact && class_reference.base_class == null;
124                 if ( is_fundamental )
125                         return "%s_copy_value".printf (get_ccode_lower_case_name (class_reference, "value_"));
126
127                 return null;
128         }
129
130         public override string? get_gtype_value_table_peek_pointer_function_name () {
131                 bool is_fundamental = !class_reference.is_compact && class_reference.base_class == null;
132                 if ( is_fundamental )
133                         return "%s_peek_pointer".printf (get_ccode_lower_case_name (class_reference, "value_"));
134
135                 return null;
136         }
137
138         public override string? get_gtype_value_table_collect_value_function_name () {
139                 bool is_fundamental = !class_reference.is_compact && class_reference.base_class == null;
140                 if ( is_fundamental )
141                         return "%s_collect_value".printf (get_ccode_lower_case_name (class_reference, "value_"));
142
143                 return null;
144         }
145
146         public override string? get_gtype_value_table_lcopy_value_function_name () {
147                 bool is_fundamental = !class_reference.is_compact && class_reference.base_class == null;
148                 if ( is_fundamental )
149                         return "%s_lcopy_value".printf (get_ccode_lower_case_name (class_reference, "value_"));
150
151                 return null;
152         }
153
154         public override CCodeFragment get_type_interface_init_declaration () {
155                 var frag = new CCodeFragment ();
156
157                 foreach (DataType base_type in class_reference.get_base_types ()) {
158                         if (!(base_type.type_symbol is Interface)) {
159                                 continue;
160                         }
161
162                         unowned Interface iface = (Interface) base_type.type_symbol;
163
164                         var iface_info_name = "%s_info".printf (get_ccode_lower_case_name (iface, null));
165
166                         var ctypedecl = new CCodeDeclaration ("const GInterfaceInfo");
167                         ctypedecl.modifiers = CCodeModifiers.STATIC;
168                         ctypedecl.add_declarator (new CCodeVariableDeclarator (iface_info_name, new CCodeConstant ("{ (GInterfaceInitFunc) %s_%s_interface_init, (GInterfaceFinalizeFunc) NULL, NULL}".printf (get_ccode_lower_case_name (class_reference), get_ccode_lower_case_name (iface)))));
169                         frag.append (ctypedecl);
170                 }
171
172                 return frag;
173         }
174
175         public override void get_type_interface_init_statements (CodeContext context, CCodeBlock block, bool plugin) {
176                 foreach (DataType base_type in class_reference.get_base_types ()) {
177                         if (!(base_type.type_symbol is Interface)) {
178                                 continue;
179                         }
180
181                         unowned Interface iface = (Interface) base_type.type_symbol;
182
183                         var iface_info_name = "%s_info".printf (get_ccode_lower_case_name (iface, null));
184                         if (!plugin) {
185                                 var reg_call = new CCodeFunctionCall (new CCodeIdentifier ("g_type_add_interface_static"));
186                                 reg_call.add_argument (new CCodeIdentifier ("%s_type_id".printf (get_ccode_lower_case_name (class_reference, null))));
187                                 reg_call.add_argument (new CCodeIdentifier (get_ccode_type_id (iface)));
188                                 reg_call.add_argument (new CCodeIdentifier ("&%s".printf (iface_info_name)));
189                                 block.add_statement (new CCodeExpressionStatement (reg_call));
190                         } else {
191                                 var reg_call = new CCodeFunctionCall (new CCodeIdentifier ("g_type_module_add_interface"));
192                                 reg_call.add_argument (new CCodeIdentifier ("module"));
193                                 reg_call.add_argument (new CCodeIdentifier ("%s_type_id".printf (get_ccode_lower_case_name (class_reference, null))));
194                                 reg_call.add_argument (new CCodeIdentifier (get_ccode_type_id (iface)));
195                                 reg_call.add_argument (new CCodeIdentifier ("&%s".printf (iface_info_name)));
196                                 block.add_statement (new CCodeExpressionStatement (reg_call));
197                         }
198                 }
199
200                 ((CCodeBaseModule) context.codegen).register_dbus_info (block, class_reference);
201         }
202 }