diff options
author | Simon Werbeck <simon.werbeck@gmail.com> | 2019-12-30 20:19:21 +0100 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2020-01-21 09:40:30 +0100 |
commit | 37c1a07f385bfeb48bdba872e3418a54b28744e4 (patch) | |
tree | fa546120b0739f9c9a9445a08dc76faafda37131 /codegen/valaccodebasemodule.vala | |
parent | 98d3f540b39da1bdfa2819d206ca5cab8dc935f4 (diff) | |
download | vala-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.vala | 31 |
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; |