diff options
author | Daniel Kolesa <d.kolesa@samsung.com> | 2019-01-29 19:36:46 +0100 |
---|---|---|
committer | Daniel Kolesa <d.kolesa@samsung.com> | 2019-01-29 19:36:46 +0100 |
commit | b8b096c19705bf6cccb60e46c1e964de8214eb3a (patch) | |
tree | 07668660067f3eeb13e28b59fd5b38a1d3a07071 | |
parent | d76b839e28d09583d43c952b9cb7e4e4da6afc2f (diff) | |
download | efl-b8b096c19705bf6cccb60e46c1e964de8214eb3a.tar.gz |
eolian: remove free function builtins and rework ownability checks
Eolian will not provide any builtin free functions anymore, with
the exception of mstring for which it defaults to 'free'.
-rw-r--r-- | src/lib/eolian/database_validate.c | 92 |
1 files changed, 32 insertions, 60 deletions
diff --git a/src/lib/eolian/database_validate.c b/src/lib/eolian/database_validate.c index 1eb97f9b92..99269d1f78 100644 --- a/src/lib/eolian/database_validate.c +++ b/src/lib/eolian/database_validate.c @@ -197,32 +197,6 @@ _validate_typedecl(Validate_State *vals, Eolian_Typedecl *tp) return _validate(&tp->base); } -static const char * const eo_complex_frees[] = -{ - "eina_accessor_free", "eina_array_free", "(void)", /* future */ - "eina_iterator_free", "eina_hash_free", - "eina_list_free", "eina_inarray_free", "(void)" -}; - -static const char *eo_obj_free = "efl_del"; -static const char *eo_str_free = "free"; -static const char *eo_strshare_free = "eina_stringshare_del"; -static const char *eo_value_free = "eina_value_flush"; -static const char *eo_value_ptr_free = "eina_value_free"; - -static Eina_Bool -_validate_ownable(Eolian_Type *tp) -{ - if (tp->btype == EOLIAN_TYPE_BUILTIN_FUTURE) - return EINA_TRUE; - if (tp->owned && !tp->freefunc) - { - _eo_parser_log(&tp->base, "type '%s' is not ownable", tp->base.name); - return EINA_FALSE; - } - return _validate(&tp->base); -} - static Eina_Bool _validate_type(Validate_State *vals, Eolian_Type *tp) { @@ -250,7 +224,7 @@ _validate_type(Validate_State *vals, Eolian_Type *tp) { case EOLIAN_TYPE_VOID: case EOLIAN_TYPE_UNDEFINED: - return _validate_ownable(tp); + return _validate(&tp->base); case EOLIAN_TYPE_REGULAR: { if (tp->base_type) @@ -267,7 +241,7 @@ _validate_type(Validate_State *vals, Eolian_Type *tp) } if (!_validate_type(vals, tp->base_type)) return EINA_FALSE; - return _validate_ownable(tp); + return _validate(&tp->base); } else if (kwid == KW_inlist) { @@ -288,12 +262,12 @@ _validate_type(Validate_State *vals, Eolian_Type *tp) */ if (tp->base_type->tdecl->freefunc && !tp->freefunc) tp->freefunc = eina_stringshare_ref(tp->base_type->tdecl->freefunc); - return _validate_ownable(tp); - } - if (!tp->freefunc) - { - tp->freefunc = eina_stringshare_add(eo_complex_frees[ - kwid - KW_accessor]); + if (!tp->freefunc) + { + _eo_parser_log(&tp->base, "inlists must have a free function"); + return EINA_FALSE; + } + return _validate(&tp->base); } Eolian_Type *itp = tp->base_type; /* validate types in brackets so freefuncs get written... */ @@ -313,33 +287,17 @@ _validate_type(Validate_State *vals, Eolian_Type *tp) } itp = itp->next_type; } - return _validate_ownable(tp); + return _validate(&tp->base); } /* builtins */ int id = eo_lexer_keyword_str_to_id(tp->base.name); if (id) { if (!eo_lexer_is_type_keyword(id)) - return EINA_FALSE; - if (!tp->freefunc) - switch (id) - { - case KW_mstring: - tp->freefunc = eina_stringshare_add(eo_str_free); - break; - case KW_stringshare: - tp->freefunc = eina_stringshare_add(eo_strshare_free); - break; - case KW_any_value: - tp->freefunc = eina_stringshare_add(eo_value_free); - break; - case KW_any_value_ptr: - tp->freefunc = eina_stringshare_add(eo_value_ptr_free); - break; - default: - break; - } - return _validate_ownable(tp); + return EINA_FALSE;; + if (!tp->freefunc && (id == KW_mstring)) + tp->freefunc = eina_stringshare_add("free"); + return _validate(&tp->base); } /* user defined */ tp->tdecl = database_type_decl_find(src, tp); @@ -352,7 +310,23 @@ _validate_type(Validate_State *vals, Eolian_Type *tp) return EINA_FALSE; if (tp->tdecl->freefunc && !tp->freefunc) tp->freefunc = eina_stringshare_ref(tp->tdecl->freefunc); - return _validate_ownable(tp); + + /* to leave out slow checks if possible */ + if (!tp->owned) + return _validate(&tp->base); + + /* builtins are not required to have freefuncs, and + * potential ownability has already been validated before + */ + if (eolian_type_aliased_base_get(tp)->btype) + return _validate(&tp->base); + + if (!tp->freefunc) + { + _eo_parser_log(&tp->base, "type '%s' is not ownable", tp->base.name); + return EINA_FALSE; + } + return _validate(&tp->base); } case EOLIAN_TYPE_CLASS: { @@ -363,14 +337,12 @@ _validate_type(Validate_State *vals, Eolian_Type *tp) "(likely wrong namespacing)", tp->base.name); return EINA_FALSE; } - if (!tp->freefunc) - tp->freefunc = eina_stringshare_add(eo_obj_free); - return _validate_ownable(tp); + return _validate(&tp->base); } default: return EINA_FALSE; } - return _validate_ownable(tp); + return _validate(&tp->base); } static Eina_Bool |