summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Kolesa <d.kolesa@osg.samsung.com>2018-04-18 15:04:04 +0200
committerDaniel Kolesa <d.kolesa@osg.samsung.com>2018-04-18 16:38:14 +0200
commit311fada0d2f54d46d3656ad64fe22bea2f58b93c (patch)
tree872290e45fa20fd28078c252297044675254d332
parent50a9b49acca943754f603bd45aa4fa5b9f5020b6 (diff)
downloadefl-311fada0d2f54d46d3656ad64fe22bea2f58b93c.tar.gz
eolian: simpler and more efficient defer parsing
-rw-r--r--src/lib/eolian/eolian_database.c37
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