From 0fcee227aa9269b3767d6f6046d4b18389c0533d Mon Sep 17 00:00:00 2001 From: Felipe Magno de Almeida Date: Sun, 18 Jun 2017 11:30:00 -0300 Subject: [PATCH] eolian-cxx: Fix C++ generation errors with handle opaque types --- src/bindings/cxx/eo_cxx/eo_cxx_interop.hh | 12 +++++++++++- src/lib/efl/Efl.h | 3 +++ src/lib/efl/interfaces/efl_text_types.eot | 4 ++-- src/lib/eolian_cxx/grammar/klass_def.hpp | 14 +++++++++++++- src/lib/eolian_cxx/grammar/type_impl.hpp | 4 ++-- 5 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/bindings/cxx/eo_cxx/eo_cxx_interop.hh b/src/bindings/cxx/eo_cxx/eo_cxx_interop.hh index 7a2f8fb765..f8444ddc64 100644 --- a/src/bindings/cxx/eo_cxx/eo_cxx_interop.hh +++ b/src/bindings/cxx/eo_cxx/eo_cxx_interop.hh @@ -84,6 +84,11 @@ struct tag typedef std::integral_constant own; }; +template +void assign_out_impl(T*& lhs, T* rhs, tag) +{ + lhs = rhs; +} template void assign_out_impl(T& lhs, T*& rhs, tag, typename std::enable_if::value>::type* = 0) { @@ -535,8 +540,13 @@ Eina_Array** convert_to_c_impl(efl::eina::range_array& /*c*/, tag +T* convert_to_c_impl(T const* p, tag) // needed for property_get +{ + return const_cast(p); } - +} + template T convert_to_c(V&& object) { diff --git a/src/lib/efl/Efl.h b/src/lib/efl/Efl.h index 4e7fbd6810..66e9a978bc 100644 --- a/src/lib/efl/Efl.h +++ b/src/lib/efl/Efl.h @@ -52,6 +52,9 @@ extern "C" { */ typedef struct tm Efl_Time; +typedef struct _Efl_Text_Cursor_Cursor_Data Efl_Text_Cursor_Cursor_Data; +typedef struct _Efl_Canvas_Text_Annotation Efl_Canvas_Text_Annotation; + #ifdef EFL_BETA_API_SUPPORT #include "interfaces/efl_types.eot.h" diff --git a/src/lib/efl/interfaces/efl_text_types.eot b/src/lib/efl/interfaces/efl_text_types.eot index 08bdb3a8f9..3fe14a2021 100644 --- a/src/lib/efl/interfaces/efl_text_types.eot +++ b/src/lib/efl/interfaces/efl_text_types.eot @@ -20,9 +20,9 @@ enum Efl.Text.Cursor.Cursor_Get_Type { user_extra [[User extra cursor state]] } -struct Efl.Canvas.Text.Annotation; [[EFL text annotations data structure]] +type @extern Efl.Canvas.Text.Annotation: __undefined_type; [[EFL text annotations data structure]] -struct Efl.Text.Cursor.Cursor_Data; [[Text cursor data structure]] +type @extern Efl.Text.Cursor.Cursor_Data: __undefined_type; [[Text cursor data structure]] enum Efl.Text.Cursor.Cursor_Type { diff --git a/src/lib/eolian_cxx/grammar/klass_def.hpp b/src/lib/eolian_cxx/grammar/klass_def.hpp index 9629c70715..583744b503 100644 --- a/src/lib/eolian_cxx/grammar/klass_def.hpp +++ b/src/lib/eolian_cxx/grammar/klass_def.hpp @@ -174,6 +174,7 @@ struct regular_type_def std::string base_type; qualifier_def base_qualifier; std::vector namespaces; + bool is_undefined = false; }; inline bool operator==(regular_type_def const& rhs, regular_type_def const& lhs) @@ -253,13 +254,24 @@ inline void type_def::set(Eolian_Type const* eolian_type, Eolian_Unit const* uni break; case EOLIAN_TYPE_REGULAR: { + bool is_undefined = false; + Eolian_Typedecl const* decl = eolian_type_typedecl_get(eolian_type); + if(decl && eolian_typedecl_type_get(decl) == EOLIAN_TYPEDECL_ALIAS) + { + Eolian_Type const* aliased = eolian_typedecl_base_type_get(decl); + if(aliased && eolian_type_type_get(aliased) == EOLIAN_TYPE_UNDEFINED) + { + is_undefined = true; + } + } + if(c_type == "va_list *") throw std::runtime_error(""); std::vector namespaces; for(efl::eina::iterator namespace_iterator( ::eolian_type_namespaces_get(eolian_type)) , namespace_last; namespace_iterator != namespace_last; ++namespace_iterator) namespaces.push_back(&*namespace_iterator); - original_type = {regular_type_def{ ::eolian_type_name_get(eolian_type), {qualifiers(eolian_type), {}}, namespaces}}; + original_type = {regular_type_def{ ::eolian_type_name_get(eolian_type), {qualifiers(eolian_type), {}}, namespaces, is_undefined}}; } break; case EOLIAN_TYPE_CLASS: diff --git a/src/lib/eolian_cxx/grammar/type_impl.hpp b/src/lib/eolian_cxx/grammar/type_impl.hpp index a6bd0a9158..38d0bb3bb5 100644 --- a/src/lib/eolian_cxx/grammar/type_impl.hpp +++ b/src/lib/eolian_cxx/grammar/type_impl.hpp @@ -132,7 +132,7 @@ struct visitor_generate ( lit("void") << (regular.base_qualifier & qualifier_info::is_const ? " const" : "") << "*" - << (is_out ? "&" : "") + << (is_out ? "*" : "") ) .generate(sink, attributes::unused, *context); } @@ -220,7 +220,7 @@ struct visitor_generate || (regular.base_qualifier & qualifier_info::is_ref && !is_return && !is_out) ? " const" : "") - << (regular.base_qualifier & qualifier_info::is_ref? "&" : "") + << (regular.base_qualifier & qualifier_info::is_ref ? (regular.is_undefined ? "*" : "&") : "") ) .generate(sink, std::make_tuple(regular.namespaces, regular.base_type), *context)) return true;