void append_struct(CCodeStruct structure) { var typename = new CCodeVariableDeclarator(structure.name.Substring(1)); var typedef = new CCodeTypeDefinition("struct " + structure.name, typename); cfile.add_type_declaration(typedef); cfile.add_type_definition(structure); }
public override void generate_struct_declaration(Struct st, CCodeFile decl_space) { if (add_symbol_declaration(decl_space, st, get_ccode_name(st))) { return; } if (st.is_boolean_type() || st.is_integer_type() || st.is_floating_type()) { if (st.base_struct != null) { generate_struct_declaration(st.base_struct, decl_space); decl_space.add_type_declaration(new CCodeTypeDefinition(get_ccode_name(st.base_struct), new CCodeVariableDeclarator(get_ccode_name(st)))); } else { string typename = null; if (st.is_boolean_type()) { // typedef for boolean types decl_space.add_include("stdbool.h"); typename = "bool"; } else if (st.is_integer_type()) { // typedef for integral types decl_space.add_include("stdint.h"); typename = "%sint%d_t".printf(st.signed ? "" : "u", st.width); } else if (st.is_floating_type()) { // typedef for floating types typename = (st.width == 64 ? "double" : "float"); } decl_space.add_type_declaration(new CCodeTypeDefinition(typename, new CCodeVariableDeclarator(get_ccode_name(st)))); } return; } if (get_ccode_has_type_id(st)) { decl_space.add_include("glib-object.h"); decl_space.add_type_declaration(new CCodeNewline()); var macro = "(%s_get_type ())".printf(get_ccode_lower_case_name(st, null)); decl_space.add_type_declaration(new CCodeMacroReplacement(get_ccode_type_id(st), macro)); var type_fun = new StructRegisterFunction(st, context); type_fun.init_from_type(false, true); decl_space.add_type_member_declaration(type_fun.get_declaration()); } var instance_struct = new CCodeStruct("_%s".printf(get_ccode_name(st))); instance_struct.modifiers |= (st.version.deprecated ? CCodeModifiers.DEPRECATED : 0); foreach (Field f in st.get_fields()) { if (f.binding == MemberBinding.INSTANCE) { generate_type_declaration(f.variable_type, decl_space); CCodeModifiers modifiers = (f.is_volatile ? CCodeModifiers.VOLATILE : 0) | (f.version.deprecated ? CCodeModifiers.DEPRECATED : 0); instance_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 len_type = int_type.copy(); for (int dim = 1; dim <= array_type.rank; dim++) { string length_cname; if (get_ccode_array_length_name(f) != null) { length_cname = get_ccode_array_length_name(f); } else { length_cname = get_array_length_cname(get_ccode_name(f), dim); } instance_struct.add_field(get_ccode_name(len_type), length_cname); } if (array_type.rank == 1 && f.is_internal_symbol()) { instance_struct.add_field(get_ccode_name(len_type), get_array_size_cname(get_ccode_name(f))); } } } else if (f.variable_type is DelegateType) { var delegate_type = (DelegateType)f.variable_type; if (delegate_type.delegate_symbol.has_target) { // create field to store delegate target instance_struct.add_field("gpointer", get_ccode_delegate_target_name(f)); if (delegate_type.is_disposable()) { instance_struct.add_field("GDestroyNotify", get_delegate_target_destroy_notify_cname(get_ccode_name(f))); } } } } } if (st.base_struct == null) { decl_space.add_type_declaration(new CCodeTypeDefinition("struct _%s".printf(get_ccode_name(st)), new CCodeVariableDeclarator(get_ccode_name(st)))); decl_space.add_type_definition(instance_struct); } else { decl_space.add_type_declaration(new CCodeTypeDefinition(get_ccode_name(st.base_struct), new CCodeVariableDeclarator(get_ccode_name(st)))); } var function = new CCodeFunction(get_ccode_dup_function(st), get_ccode_name(st) + "*"); if (st.is_private_symbol()) { function.modifiers = CCodeModifiers.STATIC; } else if (context.hide_internal && st.is_internal_symbol()) { function.modifiers = CCodeModifiers.INTERNAL; } function.add_parameter(new CCodeParameter("self", "const " + get_ccode_name(st) + "*")); decl_space.add_function_declaration(function); function = new CCodeFunction(get_ccode_free_function(st), "void"); if (st.is_private_symbol()) { function.modifiers = CCodeModifiers.STATIC; } else if (context.hide_internal && st.is_internal_symbol()) { function.modifiers = CCodeModifiers.INTERNAL; } function.add_parameter(new CCodeParameter("self", get_ccode_name(st) + "*")); decl_space.add_function_declaration(function); if (st.is_disposable()) { function = new CCodeFunction(get_ccode_copy_function(st), "void"); if (st.is_private_symbol()) { function.modifiers = CCodeModifiers.STATIC; } else if (context.hide_internal && st.is_internal_symbol()) { function.modifiers = CCodeModifiers.INTERNAL; } function.add_parameter(new CCodeParameter("self", "const " + get_ccode_name(st) + "*")); function.add_parameter(new CCodeParameter("dest", get_ccode_name(st) + "*")); decl_space.add_function_declaration(function); function = new CCodeFunction(get_ccode_destroy_function(st), "void"); if (st.is_private_symbol()) { function.modifiers = CCodeModifiers.STATIC; } else if (context.hide_internal && st.is_internal_symbol()) { function.modifiers = CCodeModifiers.INTERNAL; } function.add_parameter(new CCodeParameter("self", get_ccode_name(st) + "*")); decl_space.add_function_declaration(function); } }
public override void generate_virtual_method_declaration(Method m, CCodeFile decl_space, CCodeStruct type_struct) { if (!m.coroutine) { base.generate_virtual_method_declaration(m, decl_space, type_struct); return; } if (!m.is_abstract && !m.is_virtual) { return; } var creturn_type = m.return_type; if (m.return_type.is_real_non_null_struct_type()) { // structs are returned via out parameter creturn_type = new VoidType(); } // add vfunc field to the type struct var vdeclarator = new CCodeFunctionDeclarator(get_ccode_vfunc_name(m)); var cparam_map = new Dictionary <int, CCodeParameter>(); generate_cparameters(m, decl_space, cparam_map, new CCodeFunction("fake"), vdeclarator, null, null, 1); var vdecl = new CCodeDeclaration("void"); vdecl.add_declarator(vdeclarator); type_struct.add_declaration(vdecl); // add vfunc field to the type struct vdeclarator = new CCodeFunctionDeclarator(get_ccode_finish_vfunc_name(m)); cparam_map = new Dictionary <int, CCodeParameter>(); generate_cparameters(m, decl_space, cparam_map, new CCodeFunction("fake"), vdeclarator, null, null, 2); vdecl = new CCodeDeclaration(get_ccode_name(creturn_type)); vdecl.add_declarator(vdeclarator); type_struct.add_declaration(vdecl); }
CCodeStruct generate_data_struct(Method m) { string dataname = Symbol.lower_case_to_camel_case(get_ccode_name(m)) + "Data"; var data = new CCodeStruct("_" + dataname); data.add_field("int", "_state_"); data.add_field("GObject*", "_source_object_"); data.add_field("GAsyncResult*", "_res_"); data.add_field("GTask*", "_async_result"); if (!context.require_glib_version(2, 44)) { data.add_field("GAsyncReadyCallback", "_callback_"); data.add_field("gboolean", "_task_complete_"); } if (m is CreationMethod) { data.add_field("GType", "object_type"); } if (m.binding == MemberBinding.INSTANCE) { var type_sym = (TypeSymbol)m.parent_symbol; if (type_sym is ObjectTypeSymbol) { data.add_field(get_ccode_name(type_sym) + "*", "self"); } else { data.add_field(get_ccode_name(type_sym), "self"); } } foreach (Parameter param in m.get_parameters()) { bool is_unowned_delegate = param.variable_type is DelegateType && !param.variable_type.value_owned; var param_type = param.variable_type.copy(); param_type.value_owned = true; data.add_field(get_ccode_name(param_type), get_variable_cname(param.name)); if (param.variable_type is ArrayType) { var array_type = (ArrayType)param.variable_type; if (get_ccode_array_length(param)) { for (int dim = 1; dim <= array_type.rank; dim++) { data.add_field("gint", get_parameter_array_length_cname(param, dim)); } } } else if (param.variable_type is DelegateType) { var deleg_type = (DelegateType)param.variable_type; if (deleg_type.delegate_symbol.has_target) { data.add_field("gpointer", get_ccode_delegate_target_name(param)); if (!is_unowned_delegate) { data.add_field("GDestroyNotify", get_delegate_target_destroy_notify_cname(get_variable_cname(param.name))); } } } } foreach (var type_param in m.get_type_parameters()) { data.add_field("GType", "%s_type".printf(type_param.name.ToLower())); data.add_field("GBoxedCopyFunc", "%s_dup_func".printf(type_param.name.ToLower())); data.add_field("GDestroyNotify", "%s_destroy_func".printf(type_param.name.ToLower())); } if (!(m.return_type is VoidType)) { data.add_field(get_ccode_name(m.return_type), "result"); if (m.return_type is ArrayType) { var array_type = (ArrayType)m.return_type; if (get_ccode_array_length(m)) { for (int dim = 1; dim <= array_type.rank; dim++) { data.add_field("gint", get_array_length_cname("result", dim)); } } } else if (m.return_type is DelegateType) { var deleg_type = (DelegateType)m.return_type; if (deleg_type.delegate_symbol.has_target) { data.add_field("gpointer", get_delegate_target_cname("result")); data.add_field("GDestroyNotify", get_delegate_target_destroy_notify_cname("result")); } } } return(data); }