From 5c2611d93a58bff942e49202053cad3e0090540d Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Wed, 8 Nov 2017 16:12:40 +0100 Subject: eolian: simplify dependency parsing and cut down on hash lookups --- src/lib/eolian/eo_parser.c | 35 +++++++++++++++++++---------------- src/lib/eolian/eo_parser.h | 2 +- src/lib/eolian/eolian_database.c | 8 ++++---- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c index da03709c38..db8878a5c7 100644 --- a/src/lib/eolian/eo_parser.c +++ b/src/lib/eolian/eo_parser.c @@ -672,18 +672,20 @@ parse_struct_attrs(Eo_Lexer *ls, Eina_Bool is_enum, Eina_Bool *is_extern, } } -static void +static Eolian_Class * _parse_dep(Eo_Lexer *ls, const char *fname, const char *name) { if (eina_hash_find(_parsingeos, fname)) - return; - if (!eo_parser_database_fill(fname, EINA_FALSE)) + return NULL; + Eolian_Class *cl = NULL; + if (!eo_parser_database_fill(fname, EINA_FALSE, &cl) || !cl) { char buf[PATH_MAX]; eo_lexer_context_restore(ls); snprintf(buf, sizeof(buf), "error parsing dependency '%s'", name); eo_lexer_syntax_error(ls, buf); } + return cl; } static Eolian_Type * @@ -1515,13 +1517,12 @@ parse_part(Eo_Lexer *ls) char *fnm = database_class_to_filename(nm); if (!compare_class_file(bnm, fnm)) { + Eolian_Class *dep = NULL; const char *fname = eina_hash_find(_filenames, fnm); eina_stringshare_del(bnm); free(fnm); if (fname) - _parse_dep(ls, fname, nm); - /* FIXME: pass unit properly */ - Eolian_Class *dep = (Eolian_Class *)eolian_class_get_by_name(NULL, nm); + dep = _parse_dep(ls, fname, nm); if (!dep) { char ebuf[PATH_MAX]; @@ -2031,9 +2032,7 @@ _inherit_dep(Eo_Lexer *ls, Eina_Strbuf *buf, Eina_Bool check_inherit, snprintf(ebuf, sizeof(ebuf), "unknown inherit '%s'", iname); eo_lexer_syntax_error(ls, ebuf); } - _parse_dep(ls, fname, iname); - /* FIXME: pass unit properly */ - Eolian_Class *dep = (Eolian_Class *)eolian_class_get_by_name(NULL, iname); + Eolian_Class *dep = _parse_dep(ls, fname, iname); if (!dep) { char ebuf[PATH_MAX]; @@ -2185,7 +2184,7 @@ parse_unit(Eo_Lexer *ls, Eina_Bool eot) eo_lexer_syntax_error(ls, errbuf); } pop_strbuf(ls); - if (!eo_parser_database_fill(found, !is_eo)) + if (!eo_parser_database_fill(found, !is_eo, NULL)) { pop_strbuf(ls); snprintf(errbuf, sizeof(errbuf), @@ -2498,10 +2497,14 @@ end: } Eina_Bool -eo_parser_database_fill(const char *filename, Eina_Bool eot) +eo_parser_database_fill(const char *filename, Eina_Bool eot, Eolian_Class **fcl) { - if (eina_hash_find(_parsedeos, filename)) - return EINA_TRUE; + Eolian_Class *cl = eina_hash_find(_parsedeos, filename); + if (cl) + { + if (!eot && fcl) *fcl = cl; + return EINA_TRUE; + } eina_hash_set(_parsingeos, filename, (void *)EINA_TRUE); @@ -2521,8 +2524,6 @@ eo_parser_database_fill(const char *filename, Eina_Bool eot) parse_chunk(ls, eot); if (eot) goto done; - Eolian_Class *cl; - if (!(cl = ls->tmp.kls)) { _eolian_log("eolian: no class for file '%s'", filename); @@ -2539,8 +2540,10 @@ eo_parser_database_fill(const char *filename, Eina_Bool eot) eina_hash_set(_classes, cl->full_name, cl); eina_hash_set(_classesf, cl->base.file, cl); + if (fcl) *fcl = cl; + done: - eina_hash_set(_parsedeos, filename, (void *)EINA_TRUE); + eina_hash_set(_parsedeos, filename, eot ? (void *)EINA_TRUE : cl); eina_hash_set(_parsingeos, filename, (void *)EINA_FALSE); eo_lexer_free(ls); diff --git a/src/lib/eolian/eo_parser.h b/src/lib/eolian/eo_parser.h index 08f5142388..7179107803 100644 --- a/src/lib/eolian/eo_parser.h +++ b/src/lib/eolian/eo_parser.h @@ -3,6 +3,6 @@ #include "eo_lexer.h" -Eina_Bool eo_parser_database_fill(const char *filename, Eina_Bool eot); +Eina_Bool eo_parser_database_fill(const char *filename, Eina_Bool eot, Eolian_Class **cl); #endif /* __EO_PARSER_H__ */ \ No newline at end of file diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c index eacc5b94fb..0141450275 100644 --- a/src/lib/eolian/eolian_database.c +++ b/src/lib/eolian/eolian_database.c @@ -682,11 +682,11 @@ _eolian_file_parse_nodep(const char *filepath) if (!(eopath = eina_hash_find(is_eo ? _filenames : _tfilenames, filepath))) { char *vpath = eina_file_path_sanitize(filepath); - Eina_Bool ret = eo_parser_database_fill(vpath, !is_eo); + Eina_Bool ret = eo_parser_database_fill(vpath, !is_eo, NULL); free(vpath); return ret; } - return eo_parser_database_fill(eopath, !is_eo); + return eo_parser_database_fill(eopath, !is_eo, NULL); } static Eina_Bool @@ -732,7 +732,7 @@ eolian_file_parse(const char *filepath) static Eina_Bool _tfile_parse(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED, void *data, void *fdata) { Eina_Bool *ret = fdata; - if (*ret) *ret = eo_parser_database_fill(data, EINA_TRUE); + if (*ret) *ret = eo_parser_database_fill(data, EINA_TRUE, NULL); if (*ret) *ret = _parse_deferred(); return *ret; } @@ -756,7 +756,7 @@ eolian_all_eot_files_parse() static Eina_Bool _file_parse(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED, void *data, void *fdata) { Eina_Bool *ret = fdata; - if (*ret) *ret = eo_parser_database_fill(data, EINA_FALSE); + if (*ret) *ret = eo_parser_database_fill(data, EINA_FALSE, NULL); if (*ret) *ret = _parse_deferred(); return *ret; } -- cgit v1.2.3