diff options
author | Daniel Kolesa <d.kolesa@osg.samsung.com> | 2018-04-18 15:04:04 +0200 |
---|---|---|
committer | Daniel Kolesa <d.kolesa@osg.samsung.com> | 2018-04-18 16:38:14 +0200 |
commit | 311fada0d2f54d46d3656ad64fe22bea2f58b93c (patch) | |
tree | 872290e45fa20fd28078c252297044675254d332 | |
parent | 50a9b49acca943754f603bd45aa4fa5b9f5020b6 (diff) | |
download | efl-311fada0d2f54d46d3656ad64fe22bea2f58b93c.tar.gz |
eolian: simpler and more efficient defer parsing
-rw-r--r-- | src/lib/eolian/eolian_database.c | 37 |
1 files 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 |