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 --
