eolian: simpler and more efficient defer parsing

This commit is contained in:
Daniel Kolesa 2018-04-18 15:04:04 +02:00
parent 50a9b49acc
commit 311fada0d2
1 changed files with 22 additions and 15 deletions

View File

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