q66 pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=9aaa5cf83915007ed43acabeb8ab3171b8ec23d1

commit 9aaa5cf83915007ed43acabeb8ab3171b8ec23d1
Author: Daniel Kolesa <d.kol...@osg.samsung.com>
Date:   Thu Dec 14 17:18:32 2017 +0100

    eolian: remove _cunit and prepare for returning actual units
---
 src/lib/eolian/eo_lexer.c        | 11 +++----
 src/lib/eolian/eo_parser.c       | 36 +++++++++++++++--------
 src/lib/eolian/eo_parser.h       |  2 +-
 src/lib/eolian/eolian_database.c | 63 ++++++++++++++++++----------------------
 src/lib/eolian/eolian_database.h |  2 +-
 5 files changed, 61 insertions(+), 53 deletions(-)

diff --git a/src/lib/eolian/eo_lexer.c b/src/lib/eolian/eo_lexer.c
index afe7cc8a4c..80f08eac2c 100644
--- a/src/lib/eolian/eo_lexer.c
+++ b/src/lib/eolian/eo_lexer.c
@@ -1035,6 +1035,12 @@ eo_lexer_set_input(Eo_Lexer *ls, Eolian *state, const 
char *source)
    ls->icolumn         = ls->column = -1;
    ls->decpoint        = '.';
    next_char(ls);
+
+   Eolian_Unit *ncunit = calloc(1, sizeof(Eolian_Unit));
+   ls->unit = ncunit;
+   database_unit_init(state, ncunit);
+   eina_hash_add(state->units, ls->filename, ncunit);
+
    if (ls->current != 0xEF)
      return;
    next_char(ls);
@@ -1044,11 +1050,6 @@ eo_lexer_set_input(Eo_Lexer *ls, Eolian *state, const 
char *source)
    if (ls->current != 0xBF)
      return;
    next_char(ls);
-
-   Eolian_Unit *ncunit = calloc(1, sizeof(Eolian_Unit));
-   ls->unit = ncunit;
-   database_unit_init(state, ncunit, ls->filename);
-   eina_hash_add(state->units, ls->filename, ncunit);
 }
 
 static void
diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c
index e8cecef038..71e1d7ee55 100644
--- a/src/lib/eolian/eo_parser.c
+++ b/src/lib/eolian/eo_parser.c
@@ -683,7 +683,7 @@ _parse_dep(Eo_Lexer *ls, const char *fname, const char 
*name)
    if (eina_hash_find(ls->state->parsing, fname))
      return NULL;
    Eolian_Class *cl = NULL;
-   if (!eo_parser_database_fill(ls->state, fname, EINA_FALSE, &cl) || !cl)
+   if (!eo_parser_database_fill(ls->unit, fname, EINA_FALSE, &cl) || !cl)
      {
         char buf[PATH_MAX];
         eo_lexer_context_restore(ls);
@@ -2496,19 +2496,30 @@ end:
    return ret;
 }
 
-Eina_Bool
-eo_parser_database_fill(Eolian *state, const char *filename, Eina_Bool eot, 
Eolian_Class **fcl)
+Eolian_Unit *
+eo_parser_database_fill(Eolian_Unit *parent, const char *filename, Eina_Bool 
eot, Eolian_Class **fcl)
 {
-   Eolian_Class *cl = eina_hash_find(state->parsed, filename);
+   Eolian_Class *cl = eina_hash_find(parent->state->parsed, filename);
    if (cl)
      {
         if (!eot && fcl) *fcl = cl;
-        return EINA_TRUE;
+        const char *fsl = strrchr(filename, '/');
+        const char *bsl = strrchr(filename, '\\');
+        const char *fname = NULL;
+        if (fsl || bsl)
+          fname = eina_stringshare_add((fsl > bsl) ? (fsl + 1) : (bsl + 1));
+        if (fname)
+          {
+             Eolian_Unit *ret = eina_hash_find(parent->state->units, fname);
+             eina_stringshare_del(fname);
+             return ret;
+          }
+        return NULL;
      }
 
-   eina_hash_set(state->parsing, filename, (void *)EINA_TRUE);
+   eina_hash_set(parent->state->parsing, filename, (void *)EINA_TRUE);
 
-   Eo_Lexer *ls = eo_lexer_new(state, filename);
+   Eo_Lexer *ls = eo_lexer_new(parent->state, filename);
    if (!ls)
      {
         _eolian_log("unable to create lexer for file '%s'", filename);
@@ -2544,14 +2555,15 @@ eo_parser_database_fill(Eolian *state, const char 
*filename, Eina_Bool eot, Eoli
    if (fcl) *fcl = cl;
 
 done:
-   eina_hash_set(state->parsed, filename, eot ? (void *)EINA_TRUE : cl);
-   eina_hash_set(state->parsing, filename, (void *)EINA_FALSE);
+   eina_hash_set(ls->state->parsed, filename, eot ? (void *)EINA_TRUE : cl);
+   eina_hash_set(ls->state->parsing, filename, (void *)EINA_FALSE);
+   eina_hash_add(parent->children, filename, ls->unit);
 
    eo_lexer_free(ls);
-   return EINA_TRUE;
+   return ls->unit;
 
 error:
-   eina_hash_set(state->parsing, filename, (void *)EINA_FALSE);
+   eina_hash_set(ls->state->parsing, filename, (void *)EINA_FALSE);
    eo_lexer_free(ls);
-   return EINA_FALSE;
+   return NULL;
 }
diff --git a/src/lib/eolian/eo_parser.h b/src/lib/eolian/eo_parser.h
index 8196c5bf9d..f7422e4704 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(Eolian *state, const char *filename, 
Eina_Bool eot, Eolian_Class **cl);
+Eolian_Unit *eo_parser_database_fill(Eolian_Unit *parent, 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 360d979d77..bf1cd50c10 100644
--- a/src/lib/eolian/eolian_database.c
+++ b/src/lib/eolian/eolian_database.c
@@ -11,8 +11,6 @@
 Eina_Hash *_decls      = NULL;
 Eina_Hash *_declsf     = NULL;
 
-static Eolian_Unit *_cunit = NULL;
-
 static int _database_init_count = 0;
 
 static void
@@ -542,17 +540,10 @@ eolian_doc_token_ref_get(const Eolian_Unit *unit, const 
Eolian_Doc_Token *tok,
 }
 
 void
-database_unit_init(Eolian *state, Eolian_Unit *unit, Eina_Stringshare *fname)
+database_unit_init(Eolian *state, Eolian_Unit *unit)
 {
    unit->state = state;
 
-   if (fname)
-     {
-        Eolian_Unit *ocunit = _cunit;
-        if (ocunit)
-          eina_hash_add(ocunit->children, fname, unit);
-     }
-
    unit->children   = eina_hash_stringshared_new(NULL);
    unit->classes    = 
eina_hash_stringshared_new(EINA_FREE_CB(database_class_del));
    unit->globals    = 
eina_hash_stringshared_new(EINA_FREE_CB(database_var_del));
@@ -560,9 +551,6 @@ database_unit_init(Eolian *state, Eolian_Unit *unit, 
Eina_Stringshare *fname)
    unit->aliases    = 
eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_del));
    unit->structs    = 
eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_del));
    unit->enums      = 
eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_del));
-
-   if (fname)
-     _cunit = unit;
 }
 
 void
@@ -586,7 +574,7 @@ eolian_new(void)
    if (!state)
      return NULL;
 
-   database_unit_init(state, &state->unit, NULL);
+   database_unit_init(state, &state->unit);
 
    state->filenames_eo  = eina_hash_string_small_new(free);
    state->filenames_eot = eina_hash_string_small_new(free);
@@ -699,61 +687,62 @@ database_class_to_filename(const char *cname)
    return ret;
 }
 
-static Eina_Bool
-_eolian_file_parse_nodep(Eolian *state, const char *filepath)
+static Eolian_Unit *
+_eolian_file_parse_nodep(Eolian_Unit *parent, const char *filepath)
 {
    Eina_Bool is_eo;
    const char *eopath;
    if (_database_init_count <= 0)
-     return EINA_FALSE;
+     return NULL;
    is_eo = eina_str_has_suffix(filepath, EO_SUFFIX);
    if (!is_eo && !eina_str_has_suffix(filepath, EOT_SUFFIX))
      {
         _eolian_log("file '%s' doesn't have a correct extension", filepath);
-        return EINA_FALSE;
+        return NULL;
      }
-   if (!(eopath = eina_hash_find(is_eo ? state->filenames_eo : 
state->filenames_eot, filepath)))
+   if (!(eopath = eina_hash_find(is_eo ? parent->state->filenames_eo : 
parent->state->filenames_eot, filepath)))
      {
         char *vpath = eina_file_path_sanitize(filepath);
-        Eina_Bool ret = eo_parser_database_fill(state, vpath, !is_eo, NULL);
+        Eolian_Unit *ret = eo_parser_database_fill(parent, vpath, !is_eo, 
NULL);
         free(vpath);
         return ret;
      }
-   return eo_parser_database_fill(state, eopath, !is_eo, NULL);
+   return eo_parser_database_fill(parent, eopath, !is_eo, NULL);
 }
 
 static Eina_Bool
-_parse_deferred(Eolian *state)
+_parse_deferred(Eolian_Unit *parent)
 {
-   Eina_Hash *defer = state->defer;
+   Eina_Hash *defer = parent->state->defer;
    if (!defer || !eina_hash_population(defer))
      return EINA_TRUE;
    /* clean room for more deps for later parsing */
-   state->defer = eina_hash_string_small_new(NULL);
+   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)
      {
-        if (!_eolian_file_parse_nodep(state, dep))
+        Eolian_Unit *pdep = _eolian_file_parse_nodep(parent, dep);
+        if (!pdep || !_parse_deferred(pdep))
           {
              eina_iterator_free(itr);
-             eina_hash_free_buckets(state->defer);
+             eina_hash_free_buckets(parent->state->defer);
              eina_hash_free(defer);
              return EINA_FALSE;
           }
      }
    eina_iterator_free(itr);
    eina_hash_free(defer);
-   /* in case more deps were queued in, parse them */
-   return _parse_deferred(state);
+   return EINA_TRUE;
 }
 
 EAPI const Eolian_Unit *
 eolian_file_parse(Eolian *state, const char *filepath)
 {
-   if (!_eolian_file_parse_nodep(state, filepath))
+   Eolian_Unit *ret = _eolian_file_parse_nodep((Eolian_Unit *)state, filepath);
+   if (!ret)
      return NULL;
-   if (!_parse_deferred(state))
+   if (!_parse_deferred(ret))
      return NULL;
    /* FIXME: pass unit properly */
    if (!database_validate(state, &state->unit))
@@ -770,8 +759,11 @@ typedef struct _Parse_Data
 static Eina_Bool _tfile_parse(const Eina_Hash *hash EINA_UNUSED, const void 
*key EINA_UNUSED, void *data, void *fdata)
 {
    Parse_Data *pd = fdata;
-   if (pd->ret) pd->ret = eo_parser_database_fill(pd->state, data, EINA_TRUE, 
NULL);
-   if (pd->ret) pd->ret = _parse_deferred(pd->state);
+   Eolian_Unit *unit = NULL;
+   if (pd->ret)
+     unit = eo_parser_database_fill((Eolian_Unit *)pd->state, data, EINA_TRUE, 
NULL);
+   pd->ret = !!unit;
+   if (pd->ret) pd->ret = _parse_deferred(unit);
    return pd->ret;
 }
 
@@ -795,8 +787,11 @@ eolian_all_eot_files_parse(Eolian *state)
 static Eina_Bool _file_parse(const Eina_Hash *hash EINA_UNUSED, const void 
*key EINA_UNUSED, void *data, void *fdata)
 {
    Parse_Data *pd = fdata;
-   if (pd->ret) pd->ret = eo_parser_database_fill(pd->state, data, EINA_FALSE, 
NULL);
-   if (pd->ret) pd->ret = _parse_deferred(pd->state);
+   Eolian_Unit *unit = NULL;
+   if (pd->ret)
+     unit = eo_parser_database_fill((Eolian_Unit *)pd->state, data, 
EINA_FALSE, NULL);
+   pd->ret = !!unit;
+   if (pd->ret) pd->ret = _parse_deferred(unit);
    return pd->ret;
 }
 
diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h
index 6b4a06b0f7..b2e72907ab 100644
--- a/src/lib/eolian/eolian_database.h
+++ b/src/lib/eolian/eolian_database.h
@@ -327,7 +327,7 @@ void database_decl_add(Eina_Stringshare *name, 
Eolian_Declaration_Type type,
 
 void database_doc_del(Eolian_Documentation *doc);
 
-void database_unit_init(Eolian *state, Eolian_Unit *unit, Eina_Stringshare 
*fname);
+void database_unit_init(Eolian *state, Eolian_Unit *unit);
 void database_unit_del(Eolian_Unit *unit);
 
 /* types */

-- 


Reply via email to