diff --git a/src/lib/eolian/database_validate.c b/src/lib/eolian/database_validate.c index 8deea6d595..c7254ed220 100644 --- a/src/lib/eolian/database_validate.c +++ b/src/lib/eolian/database_validate.c @@ -273,7 +273,7 @@ _validate_type(Validate_State *vals, Eolian_Type *tp) { if (!_validate_type(vals, itp)) return EINA_FALSE; - if ((kwid >= KW_accessor) && (kwid <= KW_list) && (kwid != KW_future)) + if (kwid == KW_array || kwid == KW_hash || kwid == KW_list) { if (!database_type_is_ownable(src, itp, EINA_TRUE)) { diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c index f33db75f67..6b5d920409 100644 --- a/src/lib/eolian/eo_parser.c +++ b/src/lib/eolian/eo_parser.c @@ -768,8 +768,10 @@ parse_type_void(Eo_Lexer *ls, Eina_Bool allow_ptr) def->base_type = eo_lexer_type_release(ls, parse_type_void(ls, EINA_TRUE)); else def->base_type = eo_lexer_type_release(ls, parse_type(ls, EINA_TRUE)); - if ((def->base_type->owned = (ls->t.kw == KW_at_owned))) - eo_lexer_get(ls); + /* view-only types are not allowed to own the contents */ + if (tpid == KW_array || tpid == KW_hash || tpid == KW_list || tpid == KW_future) + if ((def->base_type->owned = (ls->t.kw == KW_at_owned))) + eo_lexer_get(ls); if (tpid == KW_hash) { check_next(ls, ','); diff --git a/src/tests/eolian/data/owning.eo b/src/tests/eolian/data/owning.eo index f74d683b78..ae926a5e35 100644 --- a/src/tests/eolian/data/owning.eo +++ b/src/tests/eolian/data/owning.eo @@ -15,9 +15,7 @@ class Owning { test2 { params { test1 : list @owned; - test2 : iterator @owned; - test3 : hash @owned; - test4 : accessor @owned; + test2 : hash @owned; } } diff --git a/src/tests/eolian/data/owning_ref.c b/src/tests/eolian/data/owning_ref.c index 3df14c9098..10a7f10a13 100644 --- a/src/tests/eolian/data/owning_ref.c +++ b/src/tests/eolian/data/owning_ref.c @@ -13,32 +13,21 @@ _owning_test1_ownership_fallback(Eina_List *test1, Eina_Iterator *test2, Eina_Ha EOAPI EFL_VOID_FUNC_BODYV_FALLBACK(owning_test1, _owning_test1_ownership_fallback(test1, test2, test3, test4);, EFL_FUNC_CALL(test1, test2, test3, test4), Eina_List *test1, Eina_Iterator *test2, Eina_Hash *test3, Eina_Accessor *test4); -void _owning_test2(Eo *obj, Owning_Data *pd, Eina_List *test1, Eina_Iterator *test2, Eina_Hash *test3, Eina_Accessor *test4); +void _owning_test2(Eo *obj, Owning_Data *pd, Eina_List *test1, Eina_Hash *test2); static void -_owning_test2_ownership_fallback(Eina_List *test1, Eina_Iterator *test2, Eina_Hash *test3, Eina_Accessor *test4) +_owning_test2_ownership_fallback(Eina_List *test1, Eina_Hash *test2) { Test_A *test1_iter; EINA_LIST_FREE(test1,test1_iter) { free_a(test1_iter); } - Test_A *test2_iter; - EINA_ITERATOR_FOREACH(test2,test2_iter) - { - free_a(test2_iter); - } - eina_hash_free_cb_set(test3,NULL); - eina_hash_free(test3); - Test_A *test4_iter; - unsigned int test4_i = 0; - EINA_ACCESSOR_FOREACH(test4,test4_i,test4_iter) - { - free_a(test4_iter); - } + eina_hash_free_cb_set(test2,NULL); + eina_hash_free(test2); } -EOAPI EFL_VOID_FUNC_BODYV_FALLBACK(owning_test2, _owning_test2_ownership_fallback(test1, test2, test3, test4);, EFL_FUNC_CALL(test1, test2, test3, test4), Eina_List *test1, Eina_Iterator *test2, Eina_Hash *test3, Eina_Accessor *test4); +EOAPI EFL_VOID_FUNC_BODYV_FALLBACK(owning_test2, _owning_test2_ownership_fallback(test1, test2);, EFL_FUNC_CALL(test1, test2), Eina_List *test1, Eina_Hash *test2); static Eina_Bool _owning_class_initializer(Efl_Class *klass)