eolian: allow value types in view containers (iterators etc.)
authorDaniel Kolesa <d.kolesa@samsung.com>
Wed, 26 Jun 2019 11:54:12 +0000 (13:54 +0200)
committerWooHyun Jung <wh0705.jung@samsung.com>
Wed, 3 Jul 2019 00:50:51 +0000 (09:50 +0900)
This restricts disallowing value types to containers that can own
them.

It also disallows usage of @owned on those view-only containers,
as that makes no sense.

src/lib/eolian/database_validate.c
src/lib/eolian/eo_parser.c
src/tests/eolian/data/owning.eo
src/tests/eolian/data/owning_ref.c

index 8deea6d..c7254ed 100644 (file)
@@ -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))
                             {
index f33db75..6b5d920 100644 (file)
@@ -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, ',');
index f74d683..ae926a5 100644 (file)
@@ -15,9 +15,7 @@ class Owning {
      test2 {
        params {
          test1 : list<ptr(Test.A) @owned> @owned;
-         test2 : iterator<ptr(Test.A) @owned> @owned;
-         test3 : hash<string, ptr(Test.A) @owned> @owned;
-         test4 : accessor<ptr(Test.A) @owned> @owned;
+         test2 : hash<string, ptr(Test.A) @owned> @owned;
        }
      }
 
index 3df14c9..10a7f10 100644 (file)
@@ -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)