q66 pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=28b1dd25c7d092d7bef7321aa7c77c81ac8d7e23
commit 28b1dd25c7d092d7bef7321aa7c77c81ac8d7e23 Author: Daniel Kolesa <[email protected]> Date: Wed Apr 18 15:23:07 2018 +0200 eolian: add internal api for dep deferring + parsing without dep This is cleaner than adding into a hash manually. Additionally, it is now possible to request that the file be parsed not as a dep, but rather standalone, which will be useful later. --- src/lib/eolian/eo_lexer.c | 6 +++--- src/lib/eolian/eo_parser.c | 24 ++++++++++-------------- src/lib/eolian/eolian_database.c | 22 +++++++++++++++++++--- src/lib/eolian/eolian_database.h | 2 ++ 4 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/lib/eolian/eo_lexer.c b/src/lib/eolian/eo_lexer.c index ce18009950..9b282e6b41 100644 --- a/src/lib/eolian/eo_lexer.c +++ b/src/lib/eolian/eo_lexer.c @@ -280,10 +280,10 @@ doc_ref_class(Eo_Lexer *ls, const char *cname) *p = tolower(*p); } memcpy(buf + clen, ".eo", sizeof(".eo")); - const char *eop = eina_hash_find(ls->state->filenames_eo, buf); - if (!eop) + if (!eina_hash_find(ls->state->filenames_eo, buf)) return; - eina_hash_set(ls->state->defer, buf, eop); + /* ref'd classes do not become dependencies */ + database_defer(ls->state, buf, EINA_FALSE); } static void diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c index 7a08618dcd..780f1840c0 100644 --- a/src/lib/eolian/eo_parser.c +++ b/src/lib/eolian/eo_parser.c @@ -753,11 +753,10 @@ parse_type_void(Eo_Lexer *ls) fnm = database_class_to_filename(nm); if (!compare_class_file(bnm, fnm)) { - const char *fname = eina_hash_find(ls->state->filenames_eo, fnm); eina_stringshare_del(bnm); - if (fname) + if (eina_hash_find(ls->state->filenames_eo, fnm)) { - eina_hash_set(ls->state->defer, fnm, fname); + database_defer(ls->state, fnm, EINA_TRUE); def->type = EOLIAN_TYPE_CLASS; } free(fnm); @@ -1459,8 +1458,7 @@ parse_part(Eo_Lexer *ls) parse_name(ls, buf); const char *nm = eina_strbuf_string_get(buf); char *fnm = database_class_to_filename(nm); - const char *fname = eina_hash_find(ls->state->filenames_eo, fnm); - if (!fname) + if (!eina_hash_find(ls->state->filenames_eo, fnm)) { free(fnm); char ebuf[PATH_MAX]; @@ -1469,7 +1467,7 @@ parse_part(Eo_Lexer *ls) eo_lexer_syntax_error(ls, ebuf); return; } - eina_hash_set(ls->state->defer, fnm, fname); + database_defer(ls->state, fnm, EINA_TRUE); free(fnm); part->klass_name = eina_stringshare_add(nm); eo_lexer_dtor_pop(ls); @@ -1947,7 +1945,7 @@ parse_class_body(Eo_Lexer *ls, Eolian_Class_Type type) static void _inherit_dep(Eo_Lexer *ls, Eina_Strbuf *buf) { - const char *fname, *iname; + const char *iname; char *fnm; eina_strbuf_reset(buf); eo_lexer_context_push(ls); @@ -1964,8 +1962,7 @@ _inherit_dep(Eo_Lexer *ls, Eina_Strbuf *buf) eo_lexer_syntax_error(ls, ebuf); return; /* unreachable (longjmp above), make static analysis shut up */ } - fname = eina_hash_find(ls->state->filenames_eo, fnm); - if (!fname) + if (!eina_hash_find(ls->state->filenames_eo, fnm)) { char ebuf[PATH_MAX]; free(fnm); @@ -1991,7 +1988,7 @@ _inherit_dep(Eo_Lexer *ls, Eina_Strbuf *buf) return; } } - eina_hash_set(ls->state->defer, fnm, fname); + database_defer(ls->state, fnm, EINA_TRUE); ls->klass->inherits = eina_list_append(ls->klass->inherits, inames); free(fnm); eo_lexer_context_pop(ls); @@ -2079,17 +2076,16 @@ parse_unit(Eo_Lexer *ls, Eina_Bool eot) { Eina_Strbuf *buf = eina_strbuf_new(); eo_lexer_dtor_push(ls, EINA_FREE_CB(eina_strbuf_free), buf); - const char *found = NULL; char errbuf[PATH_MAX]; eo_lexer_get(ls); check(ls, TOK_VALUE); eina_strbuf_append(buf, ls->t.value.s); eina_strbuf_append(buf, ".eot"); - if (!(found = eina_hash_find(ls->state->filenames_eot, eina_strbuf_string_get(buf)))) + if (!eina_hash_find(ls->state->filenames_eot, eina_strbuf_string_get(buf))) { size_t buflen = eina_strbuf_length_get(buf); eina_strbuf_remove(buf, buflen - 1, buflen); - if (!(found = eina_hash_find(ls->state->filenames_eo, eina_strbuf_string_get(buf)))) + if (!eina_hash_find(ls->state->filenames_eo, eina_strbuf_string_get(buf))) { eo_lexer_dtor_pop(ls); snprintf(errbuf, sizeof(errbuf), @@ -2097,7 +2093,7 @@ parse_unit(Eo_Lexer *ls, Eina_Bool eot) eo_lexer_syntax_error(ls, errbuf); } } - eina_hash_set(ls->state->defer, eina_strbuf_string_get(buf), found); + database_defer(ls->state, eina_strbuf_string_get(buf), EINA_TRUE); eo_lexer_dtor_pop(ls); eo_lexer_get(ls); check_next(ls, ';'); diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c index a23a1bde84..43e9c00686 100644 --- a/src/lib/eolian/eolian_database.c +++ b/src/lib/eolian/eolian_database.c @@ -845,6 +845,18 @@ _state_clean(Eolian_State *state) _hashlist_free_buckets(st->objects_f); } +void +database_defer(Eolian_State *state, const char *fname, Eina_Bool isdep) +{ + void *nval = (void *)((size_t)isdep + 1); + size_t found = (size_t)eina_hash_find(state->defer, fname); + /* add if not found or upgrade to dep if requested */ + if (!found) + eina_hash_add(state->defer, fname, nval); + else if ((found <= 1) && isdep) + eina_hash_set(state->defer, fname, nval); +} + static Eina_Bool _parse_deferred(Eolian_Unit *parent); typedef struct _Defer_Data @@ -854,11 +866,15 @@ typedef struct _Defer_Data } Defer_Data; static Eina_Bool -_defer_hash_cb(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED, - void *data, void *fdata) +_defer_hash_cb(const Eina_Hash *hash EINA_UNUSED, const void *key, + void *data EINA_UNUSED, void *fdata) { Defer_Data *d = fdata; - Eolian_Unit *pdep = _eolian_file_parse_nodep(d->parent, data); + Eolian_Unit *parent = d->parent; + /* not a dependency; parse standalone */ + //if ((size_t)data <= 1) + // parent = parent->state; + Eolian_Unit *pdep = _eolian_file_parse_nodep(parent, key); return (d->succ = (pdep && _parse_deferred(pdep))); } diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index 2cf09810e5..319ec25125 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -377,6 +377,8 @@ struct _Eolian_Variable char *database_class_to_filename(const char *cname); Eina_Bool database_validate(const Eolian_Unit *src); +/* if isdep is EINA_TRUE, parse as a dependency of current unit */ +void database_defer(Eolian_State *state, const char *fname, Eina_Bool isdep); void database_object_add(Eolian_Unit *unit, const Eolian_Object *obj); --
