From 2bfa55582cb2286dced2b97be6b80d96ae8f5a91 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Wed, 3 Jul 2019 15:03:59 +0200 Subject: [PATCH] eolian: remove builtin freefuncs For now this does not alter API behavior, so freefuncs are still transitive to aliases etc., this will get removed later. --- src/lib/eolian/database_validate.c | 63 +++++++++++------------------- src/lib/eolian/eo_parser.c | 10 ++++- src/lib/eolian/eolian_database.h | 2 + 3 files changed, 33 insertions(+), 42 deletions(-) diff --git a/src/lib/eolian/database_validate.c b/src/lib/eolian/database_validate.c index c7254ed220..7e73347f2d 100644 --- a/src/lib/eolian/database_validate.c +++ b/src/lib/eolian/database_validate.c @@ -167,6 +167,8 @@ _validate_typedecl(Validate_State *vals, Eolian_Typedecl *tp) return _reset_stable(vals, was_stable, EINA_FALSE); if (!tp->freefunc && tp->base_type->freefunc) tp->freefunc = eina_stringshare_ref(tp->base_type->freefunc); + if (tp->base_type->ownable) + tp->ownable = EINA_TRUE; _reset_stable(vals, was_stable, EINA_TRUE); return _validate(&tp->base); case EOLIAN_TYPEDECL_STRUCT: @@ -203,25 +205,12 @@ _validate_typedecl(Validate_State *vals, Eolian_Typedecl *tp) return EINA_FALSE; } -static const char * const eo_complex_frees[] = -{ - "eina_accessor_free", "eina_array_free", "(void)", /* future */ - "eina_iterator_free", "eina_hash_free", - "eina_list_free" -}; - -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) + if (tp->owned && !tp->ownable) { _eo_parser_log(&tp->base, "type '%s' is not ownable", tp->base.name); return EINA_FALSE; @@ -262,13 +251,10 @@ _validate_type(Validate_State *vals, Eolian_Type *tp) if (tp->base_type) { int kwid = eo_lexer_keyword_str_to_id(tp->base.name); - if (!tp->freefunc && kwid > KW_void) - { - tp->freefunc = eina_stringshare_add(eo_complex_frees[ - kwid - KW_accessor]); - } + if (kwid > KW_void) + tp->ownable = EINA_TRUE; Eolian_Type *itp = tp->base_type; - /* validate types in brackets so freefuncs get written... */ + /* validate types in brackets so transitive fields get written */ while (itp) { if (!_validate_type(vals, itp)) @@ -293,24 +279,20 @@ _validate_type(Validate_State *vals, Eolian_Type *tp) { 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; - } + switch (id) + { + case KW_mstring: + case KW_stringshare: + case KW_any_value: + case KW_any_value_ptr: + tp->ownable = EINA_TRUE; + break; + default: + break; + } + /* FIXME: remove this after c++/c# has fixed their stuff */ + if (tp->freefunc) + tp->ownable = EINA_TRUE; return _validate_ownable(tp); } /* user defined */ @@ -331,6 +313,8 @@ _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); + if (tp->tdecl->ownable || tp->freefunc) + tp->ownable = EINA_TRUE; tp->base.c_name = eina_stringshare_ref(tp->tdecl->base.c_name); return _validate_ownable(tp); } @@ -349,8 +333,7 @@ _validate_type(Validate_State *vals, Eolian_Type *tp) tp->klass->base.name); return EINA_FALSE; } - if (!tp->freefunc) - tp->freefunc = eina_stringshare_add(eo_obj_free); + tp->ownable = EINA_TRUE; tp->base.c_name = eina_stringshare_ref(tp->klass->base.c_name); return _validate_ownable(tp); } diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c index 6b5d920409..90920924b0 100644 --- a/src/lib/eolian/eo_parser.c +++ b/src/lib/eolian/eo_parser.c @@ -475,7 +475,10 @@ parse_struct(Eo_Lexer *ls, const char *name, Eina_Bool is_extern, def->type = EOLIAN_TYPEDECL_STRUCT; def->fields = eina_hash_string_small_new(EINA_FREE_CB(_struct_field_free)); if (freefunc) - def->freefunc = eina_stringshare_ref(freefunc); + { + def->freefunc = eina_stringshare_ref(freefunc); + def->ownable = EINA_TRUE; + } if (cname) { def->base.c_name = cname; @@ -2449,7 +2452,10 @@ postparams: def->base.is_beta = has_beta; def->type = EOLIAN_TYPEDECL_STRUCT_OPAQUE; if (freefunc) - def->freefunc = eina_stringshare_ref(freefunc); + { + def->freefunc = eina_stringshare_ref(freefunc); + def->ownable = EINA_TRUE; + } def->base.name = name; if (cname) def->base.c_name = cname; diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index 950e4114d4..d1902655d1 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -274,6 +274,7 @@ struct _Eolian_Type Eina_Bool is_const :1; Eina_Bool is_ptr :1; Eina_Bool owned :1; + Eina_Bool ownable :1; }; struct _Eolian_Typedecl @@ -288,6 +289,7 @@ struct _Eolian_Typedecl Eina_Stringshare *legacy; Eina_Stringshare *freefunc; Eina_Bool is_extern :1; + Eina_Bool ownable :1; }; struct _Eolian_Implement