q66 pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=311fada0d2f54d46d3656ad64fe22bea2f58b93c

commit 311fada0d2f54d46d3656ad64fe22bea2f58b93c
Author: Daniel Kolesa <[email protected]>
Date:   Wed Apr 18 15:04:04 2018 +0200

    eolian: simpler and more efficient defer parsing
---
 src/lib/eolian/eolian_database.c | 37 ++++++++++++++++++++++---------------
 1 file changed, 22 insertions(+), 15 deletions(-)

diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c
index 307c6bc65e..a23a1bde84 100644
--- a/src/lib/eolian/eolian_database.c
+++ b/src/lib/eolian/eolian_database.c
@@ -845,6 +845,23 @@ _state_clean(Eolian_State *state)
    _hashlist_free_buckets(st->objects_f);
 }
 
+static Eina_Bool _parse_deferred(Eolian_Unit *parent);
+
+typedef struct _Defer_Data
+{
+   Eolian_Unit *parent;
+   Eina_Bool succ;
+} Defer_Data;
+
+static Eina_Bool
+_defer_hash_cb(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED,
+               void *data, void *fdata)
+{
+   Defer_Data *d = fdata;
+   Eolian_Unit *pdep = _eolian_file_parse_nodep(d->parent, data);
+   return (d->succ = (pdep && _parse_deferred(pdep)));
+}
+
 static Eina_Bool
 _parse_deferred(Eolian_Unit *parent)
 {
@@ -853,22 +870,12 @@ _parse_deferred(Eolian_Unit *parent)
      return EINA_TRUE;
    /* clean room for more deps for later parsing */
    parent->state->defer = eina_hash_string_small_new(NULL);
-   Eina_Iterator *itr = eina_hash_iterator_data_new(defer);
-   const char *dep;
-   EINA_ITERATOR_FOREACH(itr, dep)
-     {
-        Eolian_Unit *pdep = _eolian_file_parse_nodep(parent, dep);
-        if (!pdep || !_parse_deferred(pdep))
-          {
-             eina_iterator_free(itr);
-             eina_hash_free_buckets(parent->state->defer);
-             eina_hash_free(defer);
-             return EINA_FALSE;
-          }
-     }
-   eina_iterator_free(itr);
+   Defer_Data d = { parent, EINA_FALSE };
+   eina_hash_foreach(defer, _defer_hash_cb, &d);
+   if (!d.succ)
+     eina_hash_free_buckets(parent->state->defer);
    eina_hash_free(defer);
-   return EINA_TRUE;
+   return d.succ;
 }
 
 static Eina_Bool

-- 


Reply via email to