summaryrefslogtreecommitdiff
path: root/src/lib/eolian
diff options
context:
space:
mode:
authorDaniel Kolesa <d.kolesa@samsung.com>2019-09-25 18:17:48 +0200
committerDaniel Kolesa <d.kolesa@samsung.com>2019-09-25 18:26:07 +0200
commit71cd89c5809e957b42ff76642f34bb5789ad6a78 (patch)
tree0557749e8831496ff6425ac7f372a466ba80fbfa /src/lib/eolian
parent883cb445c68a2ed9033ad7c46f35ccfbc6f00e12 (diff)
eolian: expose most API as stable
There is still some TODO with builtin types, parameter directions and prefixes, which will be resolved in the next commits.
Diffstat (limited to 'src/lib/eolian')
-rw-r--r--src/lib/eolian/Eolian.h84
-rw-r--r--src/lib/eolian/database_class_api.c2
-rw-r--r--src/lib/eolian/database_type_api.c7
-rw-r--r--src/lib/eolian/database_var_api.c2
-rw-r--r--src/lib/eolian/eo_parser.c32
-rw-r--r--src/lib/eolian/eolian_database.h1
6 files changed, 51 insertions, 77 deletions
diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h
index b0d7a4e9ce..33e571c491 100644
--- a/src/lib/eolian/Eolian.h
+++ b/src/lib/eolian/Eolian.h
@@ -34,7 +34,7 @@ extern "C" {
34#include <Eina.h> 34#include <Eina.h>
35 35
36/** 36/**
37 * @page eolian_main Eolian (BETA) 37 * @page eolian_main Eolian
38 * 38 *
39 * @date 2014 (created) 39 * @date 2014 (created)
40 * 40 *
@@ -82,8 +82,6 @@ extern "C" {
82 * @{ 82 * @{
83 */ 83 */
84 84
85#ifdef EFL_BETA_API_SUPPORT
86
87/* The maximum format version supported by this version of Eolian */ 85/* The maximum format version supported by this version of Eolian */
88#define EOLIAN_FILE_FORMAT_VERSION 1 86#define EOLIAN_FILE_FORMAT_VERSION 1
89 87
@@ -284,7 +282,9 @@ typedef enum
284 EOLIAN_TYPE_REGULAR, 282 EOLIAN_TYPE_REGULAR,
285 EOLIAN_TYPE_CLASS, 283 EOLIAN_TYPE_CLASS,
286 EOLIAN_TYPE_ERROR, 284 EOLIAN_TYPE_ERROR,
285#ifdef EFL_BETA_API_SUPPORT
287 EOLIAN_TYPE_UNDEFINED 286 EOLIAN_TYPE_UNDEFINED
287#endif
288} Eolian_Type_Type; 288} Eolian_Type_Type;
289 289
290typedef enum 290typedef enum
@@ -336,7 +336,7 @@ typedef enum
336 EOLIAN_TYPE_BUILTIN_ARRAY, 336 EOLIAN_TYPE_BUILTIN_ARRAY,
337 EOLIAN_TYPE_BUILTIN_FUTURE, 337 EOLIAN_TYPE_BUILTIN_FUTURE,
338 EOLIAN_TYPE_BUILTIN_ITERATOR, 338 EOLIAN_TYPE_BUILTIN_ITERATOR,
339 EOLIAN_TYPE_BUILTIN_HASH, 339 EOLIAN_TYPE_BUILTIN_HASH, /* FIXME: beta */
340 EOLIAN_TYPE_BUILTIN_LIST, 340 EOLIAN_TYPE_BUILTIN_LIST,
341 341
342 EOLIAN_TYPE_BUILTIN_ANY_VALUE, 342 EOLIAN_TYPE_BUILTIN_ANY_VALUE,
@@ -348,7 +348,9 @@ typedef enum
348 EOLIAN_TYPE_BUILTIN_STRINGSHARE, 348 EOLIAN_TYPE_BUILTIN_STRINGSHARE,
349 EOLIAN_TYPE_BUILTIN_STRBUF, 349 EOLIAN_TYPE_BUILTIN_STRBUF,
350 350
351#ifdef EOLIAN_BETA_API_SUPPORT
351 EOLIAN_TYPE_BUILTIN_VOID_PTR 352 EOLIAN_TYPE_BUILTIN_VOID_PTR
353#endif
352} Eolian_Type_Builtin_Type; 354} Eolian_Type_Builtin_Type;
353 355
354typedef enum 356typedef enum
@@ -1498,14 +1500,14 @@ EAPI Eolian_Class_Type eolian_class_type_get(const Eolian_Class *klass);
1498EAPI const Eolian_Documentation *eolian_class_documentation_get(const Eolian_Class *klass); 1500EAPI const Eolian_Documentation *eolian_class_documentation_get(const Eolian_Class *klass);
1499 1501
1500/* 1502/*
1501 * @brief Returns the eo prefix of a class 1503 * @brief Returns the C function prefix of a class
1502 * 1504 *
1503 * @param[in] klass the class 1505 * @param[in] klass the class
1504 * @return the eo prefix 1506 * @return the eo prefix
1505 * 1507 *
1506 * @ingroup Eolian 1508 * @ingroup Eolian
1507 */ 1509 */
1508EAPI Eina_Stringshare* eolian_class_eo_prefix_get(const Eolian_Class *klass); 1510EAPI Eina_Stringshare* eolian_class_c_prefix_get(const Eolian_Class *klass);
1509 1511
1510/* 1512/*
1511 * @brief Returns the event prefix of a class 1513 * @brief Returns the event prefix of a class
@@ -1702,16 +1704,6 @@ eolian_function_is_beta(const Eolian_Function *function_id)
1702EAPI Eina_Bool eolian_function_is_constructor(const Eolian_Function *function_id, const Eolian_Class *klass); 1704EAPI Eina_Bool eolian_function_is_constructor(const Eolian_Function *function_id, const Eolian_Class *klass);
1703 1705
1704/* 1706/*
1705 * @brief Get whether a function is a function pointer.
1706 *
1707 * @param[in] function_id Id of the function
1708 * @return EINA_TRUE and EINA_FALSE respectively
1709 *
1710 * @ingroup Eolian
1711 */
1712EAPI Eina_Bool eolian_function_is_function_pointer(const Eolian_Function *function_id);
1713
1714/*
1715 * @brief Returns an iterator to the parameter handles for a method/ctor/dtor. 1707 * @brief Returns an iterator to the parameter handles for a method/ctor/dtor.
1716 * 1708 *
1717 * @param[in] function_id Id of the function 1709 * @param[in] function_id Id of the function
@@ -2613,17 +2605,6 @@ EAPI const Eolian_Documentation *eolian_typedecl_enum_field_documentation_get(co
2613EAPI const Eolian_Expression *eolian_typedecl_enum_field_value_get(const Eolian_Enum_Type_Field *fl, Eina_Bool force); 2605EAPI const Eolian_Expression *eolian_typedecl_enum_field_value_get(const Eolian_Enum_Type_Field *fl, Eina_Bool force);
2614 2606
2615/* 2607/*
2616 * @brief Get the legacy prefix of enum field names. When not specified,
2617 * enum name is used.
2618 *
2619 * @param[in] tp the type declaration.
2620 * @return the legacy prefix or NULL.
2621 *
2622 * @ingroup Eolian
2623 */
2624EAPI Eina_Stringshare *eolian_typedecl_enum_legacy_prefix_get(const Eolian_Typedecl *tp);
2625
2626/*
2627 * @brief Get the documentation of a struct/alias type. 2608 * @brief Get the documentation of a struct/alias type.
2628 * 2609 *
2629 * @param[in] tp the type declaration. 2610 * @param[in] tp the type declaration.
@@ -2867,18 +2848,6 @@ EAPI const Eolian_Class *eolian_type_class_get(const Eolian_Type *tp);
2867EAPI const Eolian_Error *eolian_type_error_get(const Eolian_Type *tp); 2848EAPI const Eolian_Error *eolian_type_error_get(const Eolian_Type *tp);
2868 2849
2869/* 2850/*
2870 * @brief Get whether the given type is owned.
2871 *
2872 * This is true when a parameter, return or whatever is marked as @owned.
2873 *
2874 * @param[in] tp the type.
2875 * @return EINA_TRUE when the type is marked owned, EINA_FALSE otherwise.
2876 *
2877 * @ingroup Eolian
2878 */
2879EAPI Eina_Bool eolian_type_is_owned(const Eolian_Type *tp);
2880
2881/*
2882 * @brief Get whether the given type is moved with its parent type. 2851 * @brief Get whether the given type is moved with its parent type.
2883 * 2852 *
2884 * This is only used for inner types of complex types, i.e. the types 2853 * This is only used for inner types of complex types, i.e. the types
@@ -2904,16 +2873,6 @@ EAPI Eina_Bool eolian_type_is_move(const Eolian_Type *tp);
2904EAPI Eina_Bool eolian_type_is_const(const Eolian_Type *tp); 2873EAPI Eina_Bool eolian_type_is_const(const Eolian_Type *tp);
2905 2874
2906/* 2875/*
2907 * @brief Get whether the given type is a reference.
2908 *
2909 * @param[in] tp the type.
2910 * @return EINA_TRUE when the type is marked ref, EINA_FALSE otherwise.
2911 *
2912 * @ingroup Eolian
2913 */
2914EAPI Eina_Bool eolian_type_is_ptr(const Eolian_Type *tp);
2915
2916/*
2917 * @brief Get the full C type name of the given type. 2876 * @brief Get the full C type name of the given type.
2918 * 2877 *
2919 * @param[in] tp the type. 2878 * @param[in] tp the type.
@@ -3133,7 +3092,7 @@ EAPI const Eolian_Documentation *eolian_constant_documentation_get(const Eolian_
3133 * 3092 *
3134 * @ingroup Eolian 3093 * @ingroup Eolian
3135 */ 3094 */
3136EAPI const Eolian_Type *eolian_constant_base_type_get(const Eolian_Constant *var); 3095EAPI const Eolian_Type *eolian_constant_type_get(const Eolian_Constant *var);
3137 3096
3138/* 3097/*
3139 * @brief Get the value of a constant. 3098 * @brief Get the value of a constant.
@@ -3439,7 +3398,30 @@ EAPI char *eolian_doc_token_text_get(const Eolian_Doc_Token *tok);
3439 */ 3398 */
3440EAPI Eolian_Object_Type eolian_doc_token_ref_resolve(const Eolian_Doc_Token *tok, const Eolian_State *state, const Eolian_Object **data, const Eolian_Object **data2); 3399EAPI Eolian_Object_Type eolian_doc_token_ref_resolve(const Eolian_Doc_Token *tok, const Eolian_State *state, const Eolian_Object **data, const Eolian_Object **data2);
3441 3400
3442#endif 3401#ifdef EFL_BETA_API_SUPPORT
3402
3403/*
3404 * @brief Get the legacy prefix of enum field names. When not specified,
3405 * enum name is used. (BETA)
3406 *
3407 * @param[in] tp the type declaration.
3408 * @return the legacy prefix or NULL.
3409 *
3410 * @ingroup Eolian
3411 */
3412EAPI Eina_Stringshare *eolian_typedecl_enum_legacy_prefix_get(const Eolian_Typedecl *tp);
3413
3414/*
3415 * @brief Get whether the given type is a reference.
3416 *
3417 * @param[in] tp the type.
3418 * @return EINA_TRUE when the type is marked ref, EINA_FALSE otherwise.
3419 *
3420 * @ingroup Eolian
3421 */
3422EAPI Eina_Bool eolian_type_is_ptr(const Eolian_Type *tp);
3423
3424#endif /* EFL_BETA_API_SUPPORT */
3443 3425
3444/** 3426/**
3445 * @} 3427 * @}
diff --git a/src/lib/eolian/database_class_api.c b/src/lib/eolian/database_class_api.c
index 07e781db7a..74cff1b06b 100644
--- a/src/lib/eolian/database_class_api.c
+++ b/src/lib/eolian/database_class_api.c
@@ -21,7 +21,7 @@ eolian_class_documentation_get(const Eolian_Class *cl)
21} 21}
22 22
23EAPI Eina_Stringshare* 23EAPI Eina_Stringshare*
24eolian_class_eo_prefix_get(const Eolian_Class *cl) 24eolian_class_c_prefix_get(const Eolian_Class *cl)
25{ 25{
26 EINA_SAFETY_ON_NULL_RETURN_VAL(cl, NULL); 26 EINA_SAFETY_ON_NULL_RETURN_VAL(cl, NULL);
27 return cl->c_prefix; 27 return cl->c_prefix;
diff --git a/src/lib/eolian/database_type_api.c b/src/lib/eolian/database_type_api.c
index 59a149337f..675d5471d4 100644
--- a/src/lib/eolian/database_type_api.c
+++ b/src/lib/eolian/database_type_api.c
@@ -232,13 +232,6 @@ eolian_type_error_get(const Eolian_Type *tp)
232} 232}
233 233
234EAPI Eina_Bool 234EAPI Eina_Bool
235eolian_type_is_owned(const Eolian_Type *tp)
236{
237 EINA_SAFETY_ON_NULL_RETURN_VAL(tp, EINA_FALSE);
238 return tp->owned;
239}
240
241EAPI Eina_Bool
242eolian_type_is_move(const Eolian_Type *tp) 235eolian_type_is_move(const Eolian_Type *tp)
243{ 236{
244 EINA_SAFETY_ON_NULL_RETURN_VAL(tp, EINA_FALSE); 237 EINA_SAFETY_ON_NULL_RETURN_VAL(tp, EINA_FALSE);
diff --git a/src/lib/eolian/database_var_api.c b/src/lib/eolian/database_var_api.c
index 260baa638f..b6f2d1f1bc 100644
--- a/src/lib/eolian/database_var_api.c
+++ b/src/lib/eolian/database_var_api.c
@@ -13,7 +13,7 @@ eolian_constant_documentation_get(const Eolian_Constant *var)
13} 13}
14 14
15EAPI const Eolian_Type * 15EAPI const Eolian_Type *
16eolian_constant_base_type_get(const Eolian_Constant *var) 16eolian_constant_type_get(const Eolian_Constant *var)
17{ 17{
18 EINA_SAFETY_ON_NULL_RETURN_VAL(var, NULL); 18 EINA_SAFETY_ON_NULL_RETURN_VAL(var, NULL);
19 return var->base_type; 19 return var->base_type;
diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c
index faaaf4fb3d..d30d285a2c 100644
--- a/src/lib/eolian/eo_parser.c
+++ b/src/lib/eolian/eo_parser.c
@@ -517,7 +517,7 @@ parse_struct(Eo_Lexer *ls, const char *name, Eina_Bool is_extern,
517 FILL_BASE(fdef->base, ls, fline, fcol, STRUCT_FIELD); 517 FILL_BASE(fdef->base, ls, fline, fcol, STRUCT_FIELD);
518 fdef->type = eo_lexer_type_release(ls, tp); 518 fdef->type = eo_lexer_type_release(ls, tp);
519 fdef->base.name = eina_stringshare_ref(fname); 519 fdef->base.name = eina_stringshare_ref(fname);
520 Eina_Bool has_owned = EINA_FALSE, has_by_ref = EINA_FALSE; 520 Eina_Bool has_move = EINA_FALSE, has_by_ref = EINA_FALSE;
521 for (;;) switch (ls->t.kw) 521 for (;;) switch (ls->t.kw)
522 { 522 {
523 case KW_at_by_ref: 523 case KW_at_by_ref:
@@ -526,8 +526,8 @@ parse_struct(Eo_Lexer *ls, const char *name, Eina_Bool is_extern,
526 eo_lexer_get(ls); 526 eo_lexer_get(ls);
527 break; 527 break;
528 case KW_at_move: 528 case KW_at_move:
529 CASE_LOCK(ls, owned, "owned qualifier"); 529 CASE_LOCK(ls, move, "move qualifier");
530 fdef->type->owned = fdef->move = EINA_TRUE; 530 fdef->move = EINA_TRUE;
531 eo_lexer_get(ls); 531 eo_lexer_get(ls);
532 break; 532 break;
533 default: 533 default:
@@ -773,14 +773,14 @@ parse_type_void(Eo_Lexer *ls, Eina_Bool allow_ptr)
773 def->base_type = eo_lexer_type_release(ls, parse_type(ls, EINA_TRUE)); 773 def->base_type = eo_lexer_type_release(ls, parse_type(ls, EINA_TRUE));
774 /* view-only types are not allowed to own the contents */ 774 /* view-only types are not allowed to own the contents */
775 if (tpid == KW_array || tpid == KW_hash || tpid == KW_list || tpid == KW_future) 775 if (tpid == KW_array || tpid == KW_hash || tpid == KW_list || tpid == KW_future)
776 if ((def->base_type->owned = def->base_type->move = ls->t.kw == KW_at_move)) 776 if ((def->base_type->move = ls->t.kw == KW_at_move))
777 eo_lexer_get(ls); 777 eo_lexer_get(ls);
778 if (tpid == KW_hash) 778 if (tpid == KW_hash)
779 { 779 {
780 check_next(ls, ','); 780 check_next(ls, ',');
781 def->base_type->next_type = 781 def->base_type->next_type =
782 eo_lexer_type_release(ls, parse_type(ls, EINA_TRUE)); 782 eo_lexer_type_release(ls, parse_type(ls, EINA_TRUE));
783 if ((def->base_type->next_type->owned = def->base_type->next_type->move = ls->t.kw == KW_at_move)) 783 if ((def->base_type->next_type->move = ls->t.kw == KW_at_move))
784 eo_lexer_get(ls); 784 eo_lexer_get(ls);
785 } 785 }
786 check_match(ls, '>', '<', bline, bcol); 786 check_match(ls, '>', '<', bline, bcol);
@@ -1014,7 +1014,7 @@ typedef struct _Eo_Ret_Def
1014 Eolian_Documentation *doc; 1014 Eolian_Documentation *doc;
1015 Eolian_Expression *default_ret_val; 1015 Eolian_Expression *default_ret_val;
1016 Eina_Bool no_unused: 1; 1016 Eina_Bool no_unused: 1;
1017 Eina_Bool owned: 1; 1017 Eina_Bool move: 1;
1018 Eina_Bool by_ref: 1; 1018 Eina_Bool by_ref: 1;
1019} Eo_Ret_Def; 1019} Eo_Ret_Def;
1020 1020
@@ -1031,7 +1031,7 @@ parse_return(Eo_Lexer *ls, Eo_Ret_Def *ret, Eina_Bool allow_void,
1031 ret->doc = NULL; 1031 ret->doc = NULL;
1032 ret->default_ret_val = NULL; 1032 ret->default_ret_val = NULL;
1033 ret->no_unused = EINA_FALSE; 1033 ret->no_unused = EINA_FALSE;
1034 ret->owned = EINA_FALSE; 1034 ret->move = EINA_FALSE;
1035 ret->by_ref = EINA_FALSE; 1035 ret->by_ref = EINA_FALSE;
1036 if (allow_def && (ls->t.token == '(')) 1036 if (allow_def && (ls->t.token == '('))
1037 { 1037 {
@@ -1042,7 +1042,7 @@ parse_return(Eo_Lexer *ls, Eo_Ret_Def *ret, Eina_Bool allow_void,
1042 ls->expr_mode = EINA_FALSE; 1042 ls->expr_mode = EINA_FALSE;
1043 check_match(ls, ')', '(', line, col); 1043 check_match(ls, ')', '(', line, col);
1044 } 1044 }
1045 Eina_Bool has_no_unused = EINA_FALSE, has_owned = EINA_FALSE, 1045 Eina_Bool has_no_unused = EINA_FALSE, has_move = EINA_FALSE,
1046 has_by_ref = EINA_FALSE; 1046 has_by_ref = EINA_FALSE;
1047 if (!is_funcptr) for (;;) switch (ls->t.kw) 1047 if (!is_funcptr) for (;;) switch (ls->t.kw)
1048 { 1048 {
@@ -1052,8 +1052,8 @@ parse_return(Eo_Lexer *ls, Eo_Ret_Def *ret, Eina_Bool allow_void,
1052 eo_lexer_get(ls); 1052 eo_lexer_get(ls);
1053 break; 1053 break;
1054 case KW_at_move: 1054 case KW_at_move:
1055 CASE_LOCK(ls, owned, "owned qualifier"); 1055 CASE_LOCK(ls, move, "move qualifier");
1056 ret->owned = EINA_TRUE; 1056 ret->move = EINA_TRUE;
1057 eo_lexer_get(ls); 1057 eo_lexer_get(ls);
1058 break; 1058 break;
1059 case KW_at_by_ref: 1059 case KW_at_by_ref:
@@ -1074,7 +1074,7 @@ parse_param(Eo_Lexer *ls, Eina_List **params, Eina_Bool allow_inout,
1074 Eina_Bool is_vals, const Eolian_Function *func) 1074 Eina_Bool is_vals, const Eolian_Function *func)
1075{ 1075{
1076 Eina_Bool has_optional = EINA_FALSE, 1076 Eina_Bool has_optional = EINA_FALSE,
1077 has_owned = EINA_FALSE, 1077 has_move = EINA_FALSE,
1078 has_by_ref = EINA_FALSE; 1078 has_by_ref = EINA_FALSE;
1079 Eolian_Function_Parameter *par = calloc(1, sizeof(Eolian_Function_Parameter)); 1079 Eolian_Function_Parameter *par = calloc(1, sizeof(Eolian_Function_Parameter));
1080 par->param_dir = EOLIAN_IN_PARAM; 1080 par->param_dir = EOLIAN_IN_PARAM;
@@ -1130,8 +1130,8 @@ type_done:
1130 eo_lexer_get(ls); 1130 eo_lexer_get(ls);
1131 break; 1131 break;
1132 case KW_at_move: 1132 case KW_at_move:
1133 CASE_LOCK(ls, owned, "owned qualifier"); 1133 CASE_LOCK(ls, move, "move qualifier");
1134 par->type->owned = par->move = EINA_TRUE; 1134 par->move = EINA_TRUE;
1135 eo_lexer_get(ls); 1135 eo_lexer_get(ls);
1136 break; 1136 break;
1137 case KW_at_by_ref: 1137 case KW_at_by_ref:
@@ -1252,7 +1252,7 @@ parse_accessor:
1252 prop->get_ret_val = ret.default_ret_val; 1252 prop->get_ret_val = ret.default_ret_val;
1253 prop->get_return_no_unused = ret.no_unused; 1253 prop->get_return_no_unused = ret.no_unused;
1254 prop->get_return_by_ref = ret.by_ref; 1254 prop->get_return_by_ref = ret.by_ref;
1255 prop->get_return_move = prop->get_ret_type->owned = ret.owned; 1255 prop->get_return_move = ret.move;
1256 } 1256 }
1257 else 1257 else
1258 { 1258 {
@@ -1261,7 +1261,7 @@ parse_accessor:
1261 prop->set_ret_val = ret.default_ret_val; 1261 prop->set_ret_val = ret.default_ret_val;
1262 prop->set_return_no_unused = ret.no_unused; 1262 prop->set_return_no_unused = ret.no_unused;
1263 prop->set_return_by_ref = ret.by_ref; 1263 prop->set_return_by_ref = ret.by_ref;
1264 prop->set_return_move = prop->set_ret_type->owned = ret.owned; 1264 prop->set_return_move = ret.move;
1265 } 1265 }
1266 break; 1266 break;
1267 case KW_keys: 1267 case KW_keys:
@@ -1573,7 +1573,7 @@ body:
1573 meth->get_ret_val = ret.default_ret_val; 1573 meth->get_ret_val = ret.default_ret_val;
1574 meth->get_return_no_unused = ret.no_unused; 1574 meth->get_return_no_unused = ret.no_unused;
1575 meth->get_return_by_ref = ret.by_ref; 1575 meth->get_return_by_ref = ret.by_ref;
1576 meth->get_return_move = meth->get_ret_type->owned = ret.owned; 1576 meth->get_return_move = ret.move;
1577 break; 1577 break;
1578 case KW_params: 1578 case KW_params:
1579 CASE_LOCK(ls, params, "params definition") 1579 CASE_LOCK(ls, params, "params definition")
diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h
index 3cbf4fbeea..ffe8067e76 100644
--- a/src/lib/eolian/eolian_database.h
+++ b/src/lib/eolian/eolian_database.h
@@ -284,7 +284,6 @@ struct _Eolian_Type
284 Eina_Bool is_const :1; 284 Eina_Bool is_const :1;
285 Eina_Bool is_ptr :1; 285 Eina_Bool is_ptr :1;
286 Eina_Bool move :1; 286 Eina_Bool move :1;
287 Eina_Bool owned :1;
288 Eina_Bool ownable :1; 287 Eina_Bool ownable :1;
289}; 288};
290 289