diff options
Diffstat (limited to 'src/bin/eolian_mono/eolian/mono/parameter.hh')
-rw-r--r-- | src/bin/eolian_mono/eolian/mono/parameter.hh | 236 |
1 files changed, 182 insertions, 54 deletions
diff --git a/src/bin/eolian_mono/eolian/mono/parameter.hh b/src/bin/eolian_mono/eolian/mono/parameter.hh index 834ca1248d..55ea6f4115 100644 --- a/src/bin/eolian_mono/eolian/mono/parameter.hh +++ b/src/bin/eolian_mono/eolian/mono/parameter.hh @@ -8,8 +8,9 @@ #include "marshall_type.hh" #include "type.hh" #include "using_decl.hh" -#include "keyword.hh" +#include "name_helpers.hh" +using namespace eolian_mono::name_helpers; namespace eolian_mono { struct parameter_generator; @@ -22,6 +23,8 @@ namespace eolian_mono { struct native_convert_out_variable_generator; struct convert_out_variable_generator; struct convert_out_assign_generator; + struct native_convert_in_ptr_assign_generator; + struct convert_in_ptr_assign_generator; struct native_convert_out_assign_parameterized; struct native_convert_out_assign_generator; struct convert_return_generator; @@ -136,6 +139,26 @@ struct attributes_needed< ::eolian_mono::convert_out_assign_generator> : std::in } template <> +struct is_eager_generator< ::eolian_mono::native_convert_in_ptr_assign_generator> : std::true_type {}; +template <> +struct is_generator< ::eolian_mono::native_convert_in_ptr_assign_generator> : std::true_type {}; + +namespace type_traits { +template <> +struct attributes_needed< ::eolian_mono::native_convert_in_ptr_assign_generator> : std::integral_constant<int, 1> {}; +} + +template <> +struct is_eager_generator< ::eolian_mono::convert_in_ptr_assign_generator> : std::true_type {}; +template <> +struct is_generator< ::eolian_mono::convert_in_ptr_assign_generator> : std::true_type {}; + +namespace type_traits { +template <> +struct attributes_needed< ::eolian_mono::convert_in_ptr_assign_generator> : std::integral_constant<int, 1> {}; +} + +template <> struct is_eager_generator< ::eolian_mono::convert_return_variable_generator> : std::true_type {}; template <> struct is_generator< ::eolian_mono::convert_return_variable_generator> : std::true_type {}; @@ -252,6 +275,10 @@ inline bool param_should_use_out_var(attributes::parameter_def const& param, boo || param_is_acceptable(param, "Eina_Inlist *", WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Inlist *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Inlist *", WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "Eina_Accessor *", !WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "Eina_Accessor *", WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "const Eina_Accessor *", !WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "const Eina_Accessor *", WANT_OWN, WANT_OUT) || param_is_acceptable(param, "Eina_Hash *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "Eina_Hash *", WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Hash *", !WANT_OWN, WANT_OUT) @@ -266,10 +293,10 @@ inline bool param_should_use_out_var(attributes::parameter_def const& param, boo return true; auto regular = efl::eina::get<attributes::regular_type_def>(¶m.type.original_type); - if (need_struct_conversion(regular)) + if (helpers::need_struct_conversion(regular)) return true; - if (param.type.is_ptr && need_pointer_conversion(regular)) + if (param.type.is_ptr && helpers::need_pointer_conversion(regular)) return true; return false; @@ -298,6 +325,10 @@ inline bool param_should_use_in_var(attributes::parameter_def const& param, bool || param_is_acceptable(param, "const Eina_List *", WANT_OWN, !WANT_OUT) || param_is_acceptable(param, "Eina_Inlist *", !WANT_OWN, !WANT_OUT) || param_is_acceptable(param, "Eina_Inlist *", WANT_OWN, !WANT_OUT) + || param_is_acceptable(param, "Eina_Accessor *", !WANT_OWN, !WANT_OUT) + || param_is_acceptable(param, "Eina_Accessor *", WANT_OWN, !WANT_OUT) + || param_is_acceptable(param, "const Eina_Accessor *", !WANT_OWN, !WANT_OUT) + || param_is_acceptable(param, "const Eina_Accessor *", WANT_OWN, !WANT_OUT) || param_is_acceptable(param, "const Eina_Inlist *", !WANT_OWN, !WANT_OUT) || param_is_acceptable(param, "const Eina_Inlist *", WANT_OWN, !WANT_OUT) || param_is_acceptable(param, "Eina_Hash *", !WANT_OWN, !WANT_OUT) @@ -314,10 +345,10 @@ inline bool param_should_use_in_var(attributes::parameter_def const& param, bool return true; auto regular = efl::eina::get<attributes::regular_type_def>(¶m.type.original_type); - if (need_struct_conversion(regular)) + if (helpers::need_struct_conversion(regular)) return true; - if (param.type.is_ptr && need_pointer_conversion(regular)) + if (param.type.is_ptr && helpers::need_pointer_conversion(regular)) return true; return false; @@ -341,16 +372,31 @@ inline std::string direction_modifier(attributes::parameter_def const& param) } else if (param.direction != attributes::parameter_direction::in) { - auto regular = efl::eina::get<attributes::regular_type_def>(¶m.type.original_type); - if (param.type.c_type == "Eina_Slice" || param.type.c_type == "Eina_Rw_Slice" - || need_struct_conversion(regular)) + if (param.type.c_type == "Eina_Slice" || param.type.c_type == "Eina_Rw_Slice") return " ref "; else return " out "; } + else if (param.direction == attributes::parameter_direction::in && param.type.is_ptr) + { + auto regular = efl::eina::get<attributes::regular_type_def>(¶m.type.original_type); + if (helpers::need_struct_conversion(regular)) + return " ref "; // Don't add ref on Marshal if it is ptr + } return " "; } +std::string marshall_direction_modifier(attributes::parameter_def const& param) +{ + if (param.direction == attributes::parameter_direction::in && param.type.is_ptr) + { + auto regular = efl::eina::get<attributes::regular_type_def>(¶m.type.original_type); + if (helpers::need_struct_conversion(regular) && param.type.has_own) + return " "; // Don't add ref on Marshal if it is ptr + } + return direction_modifier(param); +} + struct is_fp_visitor { typedef is_fp_visitor visitor_type; @@ -375,11 +421,7 @@ struct type_name_visitor std::string operator()(grammar::attributes::regular_type_def const &type) const { - std::stringstream type_name; - for (auto&& i : escape_namespace(type.namespaces)) - type_name << i << "."; - type_name << type.base_type; - return type_name.str(); + return name_helpers::type_full_eolian_name(type); } template<typename T> @@ -412,7 +454,7 @@ struct marshall_parameter_generator if (!param.type.original_type.visit(is_fp_visitor{})) return as_generator( - direction_modifier(param) << marshall_type << " " << string + marshall_direction_modifier(param) << marshall_type << " " << string ).generate(sink, std::make_tuple(param, param_name), context); return as_generator( @@ -421,14 +463,15 @@ struct marshall_parameter_generator ).generate(sink, param, context); } } const marshall_parameter {}; - + +// FIXME This seems to be used only in the else branch of the native function definition. Is it really needed? struct argument_generator { template <typename OutputIterator, typename Context> bool generate(OutputIterator sink, attributes::parameter_def const& param, Context const& context) const { std::string param_name = escape_keyword(param.param_name); - std::string direction = direction_modifier(param); + std::string direction = marshall_direction_modifier(param); if (!param.type.original_type.visit(is_fp_visitor{})) return as_generator( @@ -475,7 +518,7 @@ struct argument_invocation_generator template <typename OutputIterator, typename Context> bool generate(OutputIterator sink, attributes::parameter_def const& param, Context const& context) const { - std::string arg = direction_modifier(param); + std::string arg = marshall_direction_modifier(param); if (use_conversion_vars && param_should_use_out_var(param, false)) arg += out_variable_name(param.param_name); @@ -507,16 +550,16 @@ struct native_convert_in_variable_generator return true; auto regular = efl::eina::get<attributes::regular_type_def>(¶m.type.original_type); - if (param.type.is_ptr && need_pointer_conversion(regular)) + if (param.type.is_ptr && helpers::need_pointer_conversion(regular) && !helpers::need_struct_conversion(param, regular)) { return as_generator( "var " << string << " = eina.PrimitiveConversion.PointerToManaged<" << type << ">(" << escape_keyword(param.param_name) << ");\n" ).generate(sink, std::make_tuple(in_variable_name(param.param_name), param.type), context); } - else if (need_struct_conversion(regular)) + else if (helpers::need_struct_conversion(regular)) { return as_generator( - "var " << string << " = " << type << "_StructConvertion.ToExternal(" << escape_keyword(param.param_name) << ");\n" + "var " << string << " = " << type << "_StructConversion.ToExternal(" << escape_keyword(param.param_name) << ");\n" ).generate(sink, std::make_tuple(in_variable_name(param.param_name), param.type), context); } else if (param.type.c_type == "Eina_Binbuf *" || param.type.c_type == "const Eina_Binbuf *") @@ -543,6 +586,7 @@ struct native_convert_in_variable_generator || param.type.c_type == "Eina_List *" || param.type.c_type == "const Eina_List *" || param.type.c_type == "Eina_Inlist *" || param.type.c_type == "const Eina_Inlist *" || param.type.c_type == "Eina_Iterator *" || param.type.c_type == "const Eina_Iterator *" + || param.type.c_type == "Eina_Accessor *" || param.type.c_type == "const Eina_Accessor *" ) { attributes::complex_type_def const* complex = efl::eina::get<attributes::complex_type_def>(¶m.type.original_type); @@ -575,16 +619,16 @@ struct convert_in_variable_generator return true; auto regular = efl::eina::get<attributes::regular_type_def>(¶m.type.original_type); - if (param.type.is_ptr && need_pointer_conversion(regular)) + if (param.type.is_ptr && helpers::need_pointer_conversion(regular) && !helpers::need_struct_conversion(param, regular)) { return as_generator( "var " << string << " = eina.PrimitiveConversion.ManagedToPointerAlloc(" << escape_keyword(param.param_name) << ");\n" ).generate(sink, in_variable_name(param.param_name), context); } - else if (need_struct_conversion(regular)) + else if (helpers::need_struct_conversion(regular)) { return as_generator( - "var " << string << " = " << type << "_StructConvertion.ToInternal(" << escape_keyword(param.param_name) << ");\n" + "var " << string << " = " << type << "_StructConversion.ToInternal(" << escape_keyword(param.param_name) << ");\n" ).generate(sink, std::make_tuple(in_variable_name(param.param_name), param.type), context); } else if (param.type.c_type == "Eina_Binbuf *" || param.type.c_type == "const Eina_Binbuf *") @@ -630,6 +674,7 @@ struct convert_in_variable_generator || param.type.c_type == "Eina_List *" || param.type.c_type == "const Eina_List *" || param.type.c_type == "Eina_Inlist *" || param.type.c_type == "const Eina_Inlist *" || param.type.c_type == "Eina_Iterator *" || param.type.c_type == "const Eina_Iterator *" + || param.type.c_type == "Eina_Accessor *" || param.type.c_type == "const Eina_Accessor *" ) { attributes::complex_type_def const* complex = efl::eina::get<attributes::complex_type_def>(¶m.type.original_type); @@ -659,7 +704,8 @@ struct convert_in_variable_generator } } const convert_in_variable {}; - + +/* Some types require an intermediate variable to be filled as out parameter in the marshalled function */ struct convert_out_variable_generator { template <typename OutputIterator, typename Context> @@ -669,17 +715,17 @@ struct convert_out_variable_generator return true; auto regular = efl::eina::get<attributes::regular_type_def>(¶m.type.original_type); - if (param.type.is_ptr && need_pointer_conversion(regular)) + if (param.type.is_ptr && helpers::need_pointer_conversion(regular) && !helpers::need_struct_conversion(regular)) { return as_generator( "System.IntPtr " << string << " = System.IntPtr.Zero;\n" ).generate(sink, out_variable_name(param.param_name), context); } - else if (need_struct_conversion(regular)) + else if (helpers::need_struct_conversion(regular)) { return as_generator( "var " << string << " = new " << marshall_type << "();\n" - ).generate(sink, std::make_tuple(out_variable_name(param.param_name), param.type), context); + ).generate(sink, std::make_tuple(out_variable_name(param.param_name), param), context); } else if (param_is_acceptable(param, "Eina_Binbuf *", WANT_OWN, WANT_OUT) || param_is_acceptable(param, "Eina_Binbuf *", !WANT_OWN, WANT_OUT) @@ -707,6 +753,10 @@ struct convert_out_variable_generator || param_is_acceptable(param, "Eina_Inlist *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Inlist *", WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Inlist *", !WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "Eina_Accessor *", WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "Eina_Accessor *", !WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "const Eina_Accessor *", WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "const Eina_Accessor *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "Eina_Hash *", WANT_OWN, WANT_OUT) || param_is_acceptable(param, "Eina_Hash *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Hash *", WANT_OWN, WANT_OUT) @@ -742,13 +792,13 @@ struct native_convert_out_variable_generator return true; auto regular = efl::eina::get<attributes::regular_type_def>(¶m.type.original_type); - if (param.type.is_ptr && need_pointer_conversion(regular)) + if (param.type.is_ptr && helpers::need_pointer_conversion(regular) && !helpers::need_struct_conversion(regular)) { return as_generator( type << " " << string << " = default(" << type << ");\n" ).generate(sink, std::make_tuple(param, out_variable_name(param.param_name), param), context); } - else if (need_struct_conversion(regular) + else if (helpers::need_struct_conversion(regular) || param_is_acceptable(param, "const char *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "Eina_Stringshare *", !WANT_OWN, WANT_OUT)) { @@ -782,6 +832,10 @@ struct native_convert_out_variable_generator || param_is_acceptable(param, "Eina_Inlist *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Inlist *", WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Inlist *", !WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "Eina_Accessor *", WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "Eina_Accessor *", !WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "const Eina_Accessor *", WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "const Eina_Accessor *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "Eina_Hash *", WANT_OWN, WANT_OUT) || param_is_acceptable(param, "Eina_Hash *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Hash *", WANT_OWN, WANT_OUT) @@ -819,6 +873,7 @@ struct native_convert_out_variable_generator } const native_convert_out_variable {}; +/* Assign the Managed out variables from the marshalled intermediate ones if needed. */ struct convert_out_assign_generator { template <typename OutputIterator, typename Context> @@ -828,16 +883,22 @@ struct convert_out_assign_generator return true; auto regular = efl::eina::get<attributes::regular_type_def>(¶m.type.original_type); - if (param.type.is_ptr && need_pointer_conversion(regular)) + if (param.type.is_ptr && helpers::need_pointer_conversion(regular) && !helpers::need_struct_conversion_in_return(param.type, param.direction)) { - return as_generator( + bool ret = as_generator( string << " = eina.PrimitiveConversion.PointerToManaged<" << type << ">(" << out_variable_name(param.param_name) << ");\n" ).generate(sink, std::make_tuple(escape_keyword(param.param_name), param.type), context); + + if (param.type.has_own) + ret = ret && as_generator(scope_tab << scope_tab << "Marshal.FreeHGlobal(" << out_variable_name(param.param_name) << ");\n" + ).generate(sink, attributes::unused, context); + + return ret; } - else if (need_struct_conversion(regular)) + else if (helpers::need_struct_conversion(regular)) { return as_generator( - string << " = " << type << "_StructConvertion.ToExternal(" << out_variable_name(param.param_name) << ");\n" + string << " = " << type << "_StructConversion.ToExternal(" << out_variable_name(param.param_name) << ");\n" ).generate(sink, std::make_tuple(escape_keyword(param.param_name), param.type), context); } else if (param_is_acceptable(param, "Eina_Binbuf *", WANT_OWN, WANT_OUT) @@ -883,6 +944,10 @@ struct convert_out_assign_generator || param_is_acceptable(param, "Eina_Inlist *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Inlist *", WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Inlist *", !WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "Eina_Accessor *", WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "Eina_Accessor *", !WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "const Eina_Accessor *", WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "const Eina_Accessor *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "Eina_Iterator *", WANT_OWN, WANT_OUT) || param_is_acceptable(param, "Eina_Iterator *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Iterator *", WANT_OWN, WANT_OUT) @@ -911,6 +976,40 @@ struct convert_out_assign_generator } const convert_out_assign {}; +struct native_convert_in_ptr_assign_generator +{ + template <typename OutputIterator, typename Context> + bool generate(OutputIterator sink, attributes::parameter_def const& param, Context const& context) const + { + auto regular = efl::eina::get<attributes::regular_type_def>(¶m.type.original_type); + if (param_should_use_in_var(param, true) && param.type.is_ptr && !param.type.has_own && helpers::need_struct_conversion(regular)) + { + return as_generator( + string << " = " << type << "_StructConversion.ToInternal(" << in_variable_name(param.param_name) << ");\n" + ).generate(sink, std::make_tuple(escape_keyword(param.param_name), param.type), context); + } + + return true; + } +} const native_convert_in_ptr_assign {}; + +struct convert_in_ptr_assign_generator +{ + template <typename OutputIterator, typename Context> + bool generate(OutputIterator sink, attributes::parameter_def const& param, Context const& context) const + { + auto regular = efl::eina::get<attributes::regular_type_def>(¶m.type.original_type); + if (param_should_use_in_var(param, true) && param.type.is_ptr && !param.type.has_own && helpers::need_struct_conversion(regular)) + { + return as_generator( + string << " = " << type << "_StructConversion.ToExternal(" << in_variable_name(param.param_name) << ");\n" + ).generate(sink, std::make_tuple(escape_keyword(param.param_name), param.type), context); + } + + return true; + } +} const convert_in_ptr_assign {}; + struct convert_return_variable_generator { template <typename OutputIterator, typename Context> @@ -923,23 +1022,25 @@ struct convert_return_variable_generator } const convert_return_variable {}; - +/* Converts the intermediate return variable to the proper API type */ struct convert_return_generator { template <typename OutputIterator, typename Context> bool generate(OutputIterator sink, attributes::type_def const& ret_type, Context const& context) const { auto regular = efl::eina::get<attributes::regular_type_def>(&ret_type.original_type); - if (ret_type.is_ptr && need_pointer_conversion(regular)) + if (ret_type.is_ptr && helpers::need_pointer_conversion(regular) && !helpers::need_struct_conversion_in_return(ret_type, attributes::parameter_direction::unknown)) { return as_generator( - "return eina.PrimitiveConversion.PointerToManaged<" << type << ">(_ret_var);\n" + "var __ret_tmp = eina.PrimitiveConversion.PointerToManaged<" << type << ">(_ret_var);\n" + << scope_tab << scope_tab << (ret_type.has_own ? ("Marshal.FreeHGlobal(_ret_var);\n"): "\n") + << scope_tab << scope_tab << "return __ret_tmp;\n" ).generate(sink, ret_type, context); } - else if (need_struct_conversion(regular)) + else if (helpers::need_struct_conversion(regular)) { return as_generator( - "return " << type << "_StructConvertion.ToExternal(_ret_var);\n" + "return " << type << "_StructConversion.ToExternal(_ret_var);\n" ).generate(sink, ret_type, context); } else if (ret_type.c_type == "Eina_Binbuf *" || ret_type.c_type == "const Eina_Binbuf *") @@ -966,6 +1067,7 @@ struct convert_return_generator || ret_type.c_type == "Eina_List *" || ret_type.c_type == "const Eina_List *" || ret_type.c_type == "Eina_Inlist *" || ret_type.c_type == "const Eina_Inlist *" || ret_type.c_type == "Eina_Iterator *" || ret_type.c_type == "const Eina_Iterator *" + || ret_type.c_type == "Eina_Accessor *" || ret_type.c_type == "const Eina_Accessor *" ) { attributes::complex_type_def const* complex = efl::eina::get<attributes::complex_type_def>(&ret_type.original_type); @@ -994,33 +1096,44 @@ struct native_convert_out_assign_generator template <typename OutputIterator, typename Context> bool generate(OutputIterator sink, attributes::parameter_def const& param, Context const& context) const { + EINA_CXX_DOM_LOG_DBG(eolian_mono::domain) << "native_convert_out_assign_generator: " << param.param_name << std::endl; if (param.direction == attributes::parameter_direction::in) return true; auto regular = efl::eina::get<attributes::regular_type_def>(¶m.type.original_type); - if (param.type.is_ptr && need_pointer_conversion(regular)) + if (param.type.is_ptr && helpers::need_pointer_conversion(regular) && !helpers::need_struct_conversion_in_return(param.type, param.direction)) { return as_generator( string << " = eina.PrimitiveConversion.ManagedToPointerAlloc(" << string << ");\n" ).generate(sink, std::make_tuple(escape_keyword(param.param_name), out_variable_name(param.param_name)), context); } - else if (need_struct_conversion(regular)) + else if (helpers::need_struct_conversion(regular)) { return as_generator( - string << " = " << type << "_StructConvertion.ToInternal(" << string << ");\n" + string << " = " << type << "_StructConversion.ToInternal(" << string << ");\n" ).generate(sink, std::make_tuple(escape_keyword(param.param_name), param.type, out_variable_name(param.param_name)), context); } else if (param_is_acceptable(param, "Eina_Stringshare *", !WANT_OWN, WANT_OUT)) { + if (klass == nullptr) + { + EINA_CXX_DOM_LOG_ERR(eolian_mono::domain) << "Null class found when trying to assign out stringshare from native wrapper." << std::endl; + return false; + } return as_generator( - string << "= efl.eo.Globals.cached_stringshare_to_intptr(((" << string << "Inherit)wrapper).cached_stringshares, " << string << ");\n" - ).generate(sink, std::make_tuple(escape_keyword(param.param_name), klass->cxx_name, out_variable_name(param.param_name)), context); + string << "= efl.eo.Globals.cached_stringshare_to_intptr(((" << name_helpers::klass_inherit_name(*klass) << ")wrapper).cached_stringshares, " << string << ");\n" + ).generate(sink, std::make_tuple(escape_keyword(param.param_name), out_variable_name(param.param_name)), context); } else if (param_is_acceptable(param, "const char *", !WANT_OWN, WANT_OUT)) { + if (klass == nullptr) + { + EINA_CXX_DOM_LOG_ERR(eolian_mono::domain) << "Null class found when trying to assign out string from native wrapper." << std::endl; + return false; + } return as_generator( - string << "= efl.eo.Globals.cached_string_to_intptr(((" << string << "Inherit)wrapper).cached_strings, " << string << ");\n" - ).generate(sink, std::make_tuple(escape_keyword(param.param_name), klass->cxx_name, out_variable_name(param.param_name)), context); + string << "= efl.eo.Globals.cached_string_to_intptr(((" << name_helpers::klass_inherit_name(*klass) << ")wrapper).cached_strings, " << string << ");\n" + ).generate(sink, std::make_tuple(escape_keyword(param.param_name), out_variable_name(param.param_name)), context); } else if (param_is_acceptable(param, "Eina_Binbuf *", WANT_OWN, WANT_OUT) || param_is_acceptable(param, "Eina_Binbuf *", !WANT_OWN, WANT_OUT) @@ -1085,6 +1198,10 @@ struct native_convert_out_assign_generator || param_is_acceptable(param, "Eina_Iterator *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Iterator *", WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Iterator *", !WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "Eina_Accessor *", WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "Eina_Accessor *", !WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "const Eina_Accessor *", WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "const Eina_Accessor *", !WANT_OWN, WANT_OUT) ) { attributes::complex_type_def const* complex = efl::eina::get<attributes::complex_type_def>(¶m.type.original_type); @@ -1131,25 +1248,30 @@ struct native_convert_return_generator bool generate(OutputIterator sink, attributes::type_def const& ret_type, Context const& context) const { auto regular = efl::eina::get<attributes::regular_type_def>(&ret_type.original_type); - if (ret_type.is_ptr && need_pointer_conversion(regular)) + if (ret_type.is_ptr && helpers::need_pointer_conversion(regular) && !helpers::need_struct_conversion_in_return(ret_type, attributes::parameter_direction::unknown) ) { return as_generator( "return eina.PrimitiveConversion.ManagedToPointerAlloc(_ret_var);\n" ).generate(sink, attributes::unused, context); } - else if (need_struct_conversion(regular)) + else if (helpers::need_struct_conversion(regular)) { return as_generator( - "return " << type << "_StructConvertion.ToInternal(_ret_var);\n" + "return " << type << "_StructConversion.ToInternal(_ret_var);\n" ).generate(sink, ret_type, context); } else if (ret_type.c_type == "const char *") { if(!ret_type.has_own) { + if (klass == nullptr) + { + EINA_CXX_DOM_LOG_ERR(eolian_mono::domain) << "Null class found when trying to return string from native wrapper." << std::endl; + return false; + } return as_generator( - "return efl.eo.Globals.cached_string_to_intptr(((" << string << "Inherit)wrapper).cached_strings, _ret_var);\n" - ).generate(sink, klass->cxx_name, context); + "return efl.eo.Globals.cached_string_to_intptr(((" << name_helpers::klass_inherit_name(*klass) << ")wrapper).cached_strings, _ret_var);\n" + ).generate(sink, attributes::unused, context); } else { @@ -1160,9 +1282,14 @@ struct native_convert_return_generator else if (ret_type.c_type == "Eina_Stringshare *") { // Correct check for string? if (!ret_type.has_own) { + if (klass == nullptr) + { + EINA_CXX_DOM_LOG_ERR(eolian_mono::domain) << "Null class found when trying to return stringshare from native wrapper." << std::endl; + return false; + } return as_generator( - "return efl.eo.Globals.cached_stringshare_to_intptr(((" << string << "Inherit)wrapper).cached_stringshares, _ret_var);\n" - ).generate(sink, klass->cxx_name, context); + "return efl.eo.Globals.cached_stringshare_to_intptr(((" << name_helpers::klass_inherit_name(*klass) << ")wrapper).cached_stringshares, _ret_var);\n" + ).generate(sink, attributes::unused, context); } else { @@ -1202,6 +1329,7 @@ struct native_convert_return_generator || ret_type.c_type == "Eina_List *" || ret_type.c_type == "const Eina_List *" || ret_type.c_type == "Eina_Inlist *" || ret_type.c_type == "const Eina_Inlist *" || ret_type.c_type == "Eina_Iterator *" || ret_type.c_type == "const Eina_Iterator *" + || ret_type.c_type == "Eina_Accessor *" || ret_type.c_type == "const Eina_Accessor *" ) { attributes::complex_type_def const* complex = efl::eina::get<attributes::complex_type_def>(&ret_type.original_type); @@ -1277,7 +1405,7 @@ struct native_convert_function_pointer_generator // Getting the type through C api std::string type_name = param.type.original_type.visit(type_name_visitor{}); - const Eolian_Typedecl *tpd = ::eolian_typedecl_alias_get_by_name(param.unit, type_name.c_str()); + const Eolian_Typedecl *tpd = ::eolian_unit_alias_by_name_get(param.unit, type_name.c_str()); if (!tpd) { EINA_LOG_ERR("Failed to get typedecl for c type [%s]", param.type.c_type.c_str()); @@ -1292,7 +1420,7 @@ struct native_convert_function_pointer_generator EINA_LOG_ERR("Failed to get function pointer info for c type [%s]", param.type.c_type.c_str()); return false; } - attributes::function_def f(fd, EOLIAN_FUNCTION_POINTER, param.unit); + attributes::function_def f(fd, EOLIAN_FUNCTION_POINTER, tpd, param.unit); std::string param_name = escape_keyword(param.param_name); // Allocate GCHandle in "param_name"_handle for param; |