eolian: make inherits_get return a list of classes, not strings
authorDaniel Kolesa <d.kolesa@osg.samsung.com>
Wed, 25 Oct 2017 14:23:57 +0000 (16:23 +0200)
committerDaniel Kolesa <d.kolesa@osg.samsung.com>
Wed, 25 Oct 2017 14:25:41 +0000 (16:25 +0200)
Most of the time you need to retrieve the class from the string
anyway, so remove this relic of old Eolian and gain some small
performance benefits and extra convenience.

Subtly breaks API but everything should be updated.

12 files changed:
src/bin/eolian/sources.c
src/bin/eolian_cxx/eolian_cxx.cc
src/bindings/luajit/eolian.lua
src/lib/eolian/Eolian.h
src/lib/eolian/database_class.c
src/lib/eolian/database_validate.c
src/lib/eolian/eo_parser.c
src/lib/eolian/eolian_database.h
src/lib/eolian_cxx/grammar/klass_def.hpp
src/scripts/elua/apps/docgen/doctree.lua
src/scripts/elua/modules/lualian.lua
src/tests/eolian/eolian_parsing.c

index 473342a..2ba900c 100644 (file)
@@ -965,14 +965,13 @@ eo_gen_source_gen(const Eolian_Unit *src,
 
    /* inherits in EFL_DEFINE_CLASS */
    {
-      const char *iname;
+      const Eolian_Class *icl;
       Eina_Iterator *itr = eolian_class_inherits_get(cl);
       /* no inherits, NULL parent */
       if (!itr)
         eina_strbuf_append(buf, ", NULL");
-      EINA_ITERATOR_FOREACH(itr, iname)
+      EINA_ITERATOR_FOREACH(itr, icl)
         {
-           const Eolian_Class *icl = eolian_class_get_by_name(src, iname);
            Eina_Stringshare *mname = eolian_class_c_name_get(icl);
            eina_strbuf_append_printf(buf, ", %s", mname);
            eina_stringshare_del(mname);
index c98412a..34b8bbc 100644 (file)
@@ -114,10 +114,10 @@ generate(const Eolian_Class* klass, eolian_cxx::options_type const& opts)
    std::function<void(Eolian_Class const*)> klass_function
      = [&] (Eolian_Class const* klass)
      {
-       for(efl::eina::iterator<const char> inherit_iterator ( ::eolian_class_inherits_get(klass))
+       for(efl::eina::iterator<Eolian_Class const> inherit_iterator ( ::eolian_class_inherits_get(klass))
              , inherit_last; inherit_iterator != inherit_last; ++inherit_iterator)
          {
-           Eolian_Class const* inherit = ::eolian_class_get_by_name(opts.unit, &*inherit_iterator);
+           Eolian_Class const* inherit = &*inherit_iterator;
            c_headers.insert(eolian_class_file_get(inherit) + std::string(".h"));
            cpp_headers.insert(eolian_class_file_get(inherit) + std::string(".hh"));
            efl::eolian::grammar::attributes::klass_def klass{inherit, opts.unit};
index 8982ef4..b0c0f7c 100644 (file)
@@ -1239,7 +1239,7 @@ M.Class = ffi.metatype("Eolian_Class", {
         end,
 
         inherits_get = function(self)
-            return iterator.String_Iterator(
+            return Ptr_Iterator("const Eolian_Class*",
                 eolian.eolian_class_inherits_get(self))
         end,
 
index bc8bbb4..b69f2c5 100644 (file)
@@ -709,7 +709,7 @@ EAPI Eina_Stringshare* eolian_class_event_prefix_get(const Eolian_Class *klass);
 EAPI Eina_Stringshare *eolian_class_data_type_get(const Eolian_Class *klass);
 
 /*
- * @brief Returns an iterator to the names of inherit classes of a class
+ * @brief Returns an iterator to the inherited classes.
  *
  * @param[in] klass the class
  * @return the iterator
index f3faa9b..fc56325 100644 (file)
@@ -18,9 +18,6 @@ database_class_del(Eolian_Class *cl)
 
    if (cl->base.file) eina_stringshare_del(cl->base.file);
 
-   EINA_LIST_FREE(cl->inherits, s)
-     if (s) eina_stringshare_del(s);
-
    EINA_LIST_FREE(cl->implements, impl)
      database_implement_del(impl);
 
index 0b1dd0e..28ffd5f 100644 (file)
@@ -373,7 +373,7 @@ _validate_class(Eolian_Class *cl, Eina_Hash *nhash)
    Eolian_Function *func;
    Eolian_Event *event;
    Eolian_Implement *impl;
-   const char *iname;
+   Eolian_Class *icl;
    Eina_Bool res = EINA_TRUE;
 
    if (!cl)
@@ -386,9 +386,9 @@ _validate_class(Eolian_Class *cl, Eina_Hash *nhash)
    if (ahash)
      nhash = eina_hash_string_small_new(NULL);
 
-   EINA_LIST_FOREACH(cl->inherits, l, iname)
+   EINA_LIST_FOREACH(cl->inherits, l, icl)
      {
-        if (!(res = _validate_class(eina_hash_find(_classes, iname), nhash)))
+        if (!(res = _validate_class(icl, nhash)))
           goto freehash;
      }
 
index a7649e0..e6d8b6b 100644 (file)
@@ -2021,8 +2021,7 @@ _inherit_dep(Eo_Lexer *ls, Eina_Strbuf *buf, Eina_Bool check_inherit,
       default:
         break;
      }
-   ls->tmp.kls->inherits = eina_list_append(ls->tmp.kls->inherits,
-                                            eina_stringshare_add(iname));
+   ls->tmp.kls->inherits = eina_list_append(ls->tmp.kls->inherits, dep);
    dep->toplevel = EINA_FALSE;
    eo_lexer_context_pop(ls);
 }
@@ -2245,14 +2244,13 @@ _get_impl_class(const Eolian_Class *cl, const char *cln)
    if (!cl || !strcmp(cl->full_name, cln))
      return cl;
    Eina_List *l;
-   const char *s;
-   EINA_LIST_FOREACH(cl->inherits, l, s)
+   Eolian_Class *icl;
+   EINA_LIST_FOREACH(cl->inherits, l, icl)
      {
         /* we can do a depth first search, it's easier and doesn't matter
          * which part of the inheritance tree we find the class in
          */
-        /* FIXME: pass unit properly */
-        const Eolian_Class *fcl = _get_impl_class(eolian_class_get_by_name(NULL, s), cln);
+        const Eolian_Class *fcl = _get_impl_class(icl, cln);
         if (fcl)
           return fcl;
      }
index c99a474..ae53ff9 100644 (file)
@@ -91,7 +91,7 @@ struct _Eolian_Class
    Eina_Stringshare *eo_prefix;
    Eina_Stringshare *ev_prefix;
    Eina_Stringshare *data_type;
-   Eina_List *inherits; /* List Eina_Stringshare * */
+   Eina_List *inherits; /* List Eolian_Class * */
    Eina_List *properties; /* List prop_name -> Eolian_Function */
    Eina_List *methods; /* List meth_name -> Eolian_Function */
    Eina_List *implements; /* List implements name -> Eolian_Implement */
index 3de453e..146bfbe 100644 (file)
@@ -687,10 +687,10 @@ struct klass_def
      std::function<void(Eolian_Class const*)> inherit_algo = 
        [&] (Eolian_Class const* klass)
        {
-         for(efl::eina::iterator<const char> inherit_iterator ( ::eolian_class_inherits_get(klass))
+         for(efl::eina::iterator<Eolian_Class const> inherit_iterator ( ::eolian_class_inherits_get(klass))
                , inherit_last; inherit_iterator != inherit_last; ++inherit_iterator)
            {
-             Eolian_Class const* inherit = ::eolian_class_get_by_name(unit, &*inherit_iterator);
+             Eolian_Class const* inherit = &*inherit_iterator;
              inherits.insert({inherit, {}});
              inherit_algo(inherit);
            }
index 146479f..f4f55af 100644 (file)
@@ -223,9 +223,7 @@ M.Class = Node:clone {
             return ret
         end
         ret = {}
-        for cln in self.class:inherits_get() do
-            local cl = self.by_name_get(cln)
-            assert(cl)
+        for cl in self.class:inherits_get() do
             ret[#ret + 1] = cl
         end
         self._cache_inhc = ret
index 1253252..035c24d 100644 (file)
@@ -670,8 +670,7 @@ local gen_class = function(klass)
     local parents = {}
     local mixins  = {} -- also includes ifaces, they're separated later
     for i = 1, #inherits do
-        local v = inherits[i]
-        local tp = eolian.class_get_by_name(gen_unit, v):type_get()
+        local tp = inherits[i]:type_get()
         if tp == class_type.REGULAR or tp == class_type.ABSTRACT then
             parents[#parents + 1] = v
         elseif tp == class_type.INTERFACE or tp == class_type.MIXIN then
index 86c0798..c9d07ba 100644 (file)
 
 START_TEST(eolian_namespaces)
 {
-   const Eolian_Class *class11, *class112, *class21, *class_no, *impl_class;
+   const Eolian_Class *class11, *class112, *class21, *class_no, *impl_class,
+                      *iclass;
    const Eolian_Function *fid;
    Eina_Iterator *iter;
    Eolian_Function_Type func_type;
-   const char *class_name, *val1, *val2;
+   const char *val1, *val2;
    const Eolian_Implement *impl;
    const Eolian_Unit *unit;
    void *dummy;
@@ -61,12 +62,12 @@ START_TEST(eolian_namespaces)
 
    /* Inherits */
    fail_if(!(iter = eolian_class_inherits_get(class11)));
-   fail_if(!(eina_iterator_next(iter, (void**)&class_name)));
-   fail_if(eolian_class_get_by_name(unit, class_name) != class112);
-   fail_if(!(eina_iterator_next(iter, (void**)&class_name)));
-   fail_if(eolian_class_get_by_name(unit, class_name) != class21);
-   fail_if(!(eina_iterator_next(iter, (void**)&class_name)));
-   fail_if(eolian_class_get_by_name(unit, class_name) != class_no);
+   fail_if(!(eina_iterator_next(iter, (void**)&iclass)));
+   fail_if(iclass != class112);
+   fail_if(!(eina_iterator_next(iter, (void**)&iclass)));
+   fail_if(iclass != class21);
+   fail_if(!(eina_iterator_next(iter, (void**)&iclass)));
+   fail_if(iclass != class_no);
    fail_if(eina_iterator_next(iter, &dummy));
    eina_iterator_free(iter);