summaryrefslogtreecommitdiff
path: root/codegen/valaccodebasemodule.vala
diff options
context:
space:
mode:
authorSimon Werbeck <simon.werbeck@gmail.com>2019-12-30 20:19:21 +0100
committerRico Tzschichholz <ricotz@ubuntu.com>2020-01-21 09:40:30 +0100
commit37c1a07f385bfeb48bdba872e3418a54b28744e4 (patch)
treefa546120b0739f9c9a9445a08dc76faafda37131 /codegen/valaccodebasemodule.vala
parent98d3f540b39da1bdfa2819d206ca5cab8dc935f4 (diff)
downloadvala-37c1a07f385bfeb48bdba872e3418a54b28744e4.tar.gz
codegen: Refactor generation of fields for ccode structs
Introduce a common method to add field including its possible composite fields for array and delegate types.
Diffstat (limited to 'codegen/valaccodebasemodule.vala')
-rw-r--r--codegen/valaccodebasemodule.vala31
1 files changed, 31 insertions, 0 deletions
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 668d3cee2..932228eb5 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -1060,6 +1060,37 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
pop_line ();
}
+ public void append_field (CCodeStruct ccode_struct, Field f, CCodeFile decl_space) {
+ generate_type_declaration (f.variable_type, decl_space);
+
+ CCodeModifiers modifiers = (f.is_volatile ? CCodeModifiers.VOLATILE : 0) | (f.version.deprecated ? CCodeModifiers.DEPRECATED : 0);
+ ccode_struct.add_field (get_ccode_name (f.variable_type), get_ccode_name (f), modifiers, get_ccode_declarator_suffix (f.variable_type));
+
+ if (f.variable_type is ArrayType && get_ccode_array_length (f)) {
+ // create fields to store array dimensions
+ var array_type = (ArrayType) f.variable_type;
+ if (!array_type.fixed_length) {
+ var length_ctype = get_ccode_array_length_type (array_type);
+ for (int dim = 1; dim <= array_type.rank; dim++) {
+ string length_cname = get_variable_array_length_cname (f, dim);
+ ccode_struct.add_field (length_ctype, length_cname);
+ }
+ if (array_type.rank == 1 && f.is_internal_symbol ()) {
+ ccode_struct.add_field (length_ctype, get_array_size_cname (get_ccode_name (f)));
+ }
+ }
+ } else if (get_ccode_delegate_target (f)) {
+ var delegate_type = (DelegateType) f.variable_type;
+ if (delegate_type.delegate_symbol.has_target) {
+ // create field to store delegate target
+ ccode_struct.add_field (get_ccode_name (delegate_target_type), get_ccode_delegate_target_name (f));
+ if (delegate_type.is_disposable ()) {
+ ccode_struct.add_field (get_ccode_name (delegate_target_destroy_type), get_ccode_delegate_target_destroy_notify_name (f));
+ }
+ }
+ }
+ }
+
public void generate_field_declaration (Field f, CCodeFile decl_space) {
if (add_symbol_declaration (decl_space, f, get_ccode_name (f))) {
return;