q66 pushed a commit to branch master.

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

commit f7e09d3570aa92a756c4d287ba9da845fcd554f7
Author: Daniel Kolesa <[email protected]>
Date:   Wed Jun 15 16:20:45 2016 +0100

    eolian: move deferred eo file parsing to the very end
    
    Because of this the cyclic check would occasionally have false positives.
    By moving deferred eo parsing to the end of the whole parse process, it
    can no longer affect the cyclic checker.
    
    @fix
---
 src/lib/eolian/database_fill.c   | 15 ---------------
 src/lib/eolian/eolian_database.c | 26 ++++++++++++++++++++++++--
 2 files changed, 24 insertions(+), 17 deletions(-)

diff --git a/src/lib/eolian/database_fill.c b/src/lib/eolian/database_fill.c
index 286b471..14c79cb 100644
--- a/src/lib/eolian/database_fill.c
+++ b/src/lib/eolian/database_fill.c
@@ -234,7 +234,6 @@ eo_parser_database_fill(const char *filename, Eina_Bool eot)
    Eina_Iterator *itr;
    Eolian_Class *cl;
    Eo_Lexer *ls;
-   const char *dep;
 
    if (eina_hash_find(_parsedeos, filename))
      return EINA_TRUE;
@@ -298,20 +297,6 @@ eo_parser_database_fill(const char *filename, Eina_Bool 
eot)
      }
    eina_iterator_free(itr);
 
-   /* parse deferred eos (doc dependencies) */
-   itr = eina_hash_iterator_data_new(_defereos);
-   EINA_ITERATOR_FOREACH(itr, dep)
-     {
-        if (!eina_hash_find(_parsingeos, dep) && !eolian_file_parse(dep))
-          {
-             eina_iterator_free(itr);
-             eina_hash_free_buckets(_defereos);
-             goto error;
-          }
-     }
-   eina_iterator_free(itr);
-   eina_hash_free_buckets(_defereos);
-
 done:
    eina_hash_set(_parsedeos, filename, (void *)EINA_TRUE);
    eina_hash_set(_parsingeos, filename, (void *)EINA_FALSE);
diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c
index 8520ca4..2f15b49 100644
--- a/src/lib/eolian/eolian_database.c
+++ b/src/lib/eolian/eolian_database.c
@@ -288,8 +288,8 @@ database_object_class_fill(const char *class_name, const 
Eolian_Class **cl)
    return found;
 }
 
-EAPI Eina_Bool
-eolian_file_parse(const char *filepath)
+static Eina_Bool
+_eolian_file_parse_nodep(const char *filepath)
 {
    Eina_Bool is_eo;
    const char *eopath;
@@ -311,6 +311,28 @@ eolian_file_parse(const char *filepath)
    return eo_parser_database_fill(eopath, !is_eo);
 }
 
+EAPI Eina_Bool
+eolian_file_parse(const char *filepath)
+{
+   const char *dep;
+   if (!_eolian_file_parse_nodep(filepath))
+     return EINA_FALSE;
+   /* parse doc dependencies (deferred eo files) */
+   Eina_Iterator *itr = eina_hash_iterator_data_new(_defereos);
+   EINA_ITERATOR_FOREACH(itr, dep)
+     {
+        if (!_eolian_file_parse_nodep(dep))
+          {
+             eina_iterator_free(itr);
+             eina_hash_free_buckets(_defereos);
+             return EINA_FALSE;
+          }
+     }
+   eina_iterator_free(itr);
+   eina_hash_free_buckets(_defereos);
+   return EINA_TRUE;
+}
+
 static Eina_Bool _tfile_parse(const Eina_Hash *hash EINA_UNUSED, const void 
*key EINA_UNUSED, void *data, void *fdata)
 {
    Eina_Bool *ret = fdata;

-- 


Reply via email to