jackdanielz pushed a commit to branch master.

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

commit 7f900882329811e80b792bd8e466b6fb1148371e
Author: Daniel Zaoui <[email protected]>
Date:   Sun Apr 27 10:03:39 2014 +0300

    Eolian/Generator: only requests .eo files parsing when needed.
    
    Before this change, all the .eo files of the directories given with -I
    option were parsed. Most of this information was not necessary at all,
    since only the classes belonging to the inheritance of the class given
    as parameter were needed.
    Now, during the parsing of the given class, the inherits classes are
    searched and parsed.
    
    A condition is needed to make it work well. To find a filename for a
    class, we consider the lowercase of the class name as the filename we
    have to parse.
    e.g, Elm_Button -> elm_button -> elm_button.eo
    
    It considerably reduces the generation time.
    
    A fix in the tests was needed.
---
 src/bin/eolian/main.c            | 25 +++--------------
 src/lib/eolian/Eolian.h          | 12 +++++++++
 src/lib/eolian/eolian.c          |  6 -----
 src/lib/eolian/eolian_database.c | 58 ++++++++++++++++++++++++++++++++++++++++
 src/tests/eolian/eolian_suite.c  |  2 +-
 5 files changed, 74 insertions(+), 29 deletions(-)

diff --git a/src/bin/eolian/main.c b/src/bin/eolian/main.c
index 17b6373..bdd967f 100644
--- a/src/bin/eolian/main.c
+++ b/src/bin/eolian/main.c
@@ -7,8 +7,6 @@
 #include "eo1_generator.h"
 #include "common_funcs.h"
 
-#define EO_SUFFIX ".eo"
-
 static char*
 _include_guard_enclose(const char *fname, const char *fbody)
 {
@@ -220,19 +218,11 @@ int main(int argc, char **argv)
            case 'I':
                      {
                         const char *dir = optarg;
-                        Eina_Iterator *dir_files;
-                        char *file;
-                        /* Get all files from directory. Not recursively!!! */
-                        dir_files = eina_file_ls(dir);
-                        EINA_ITERATOR_FOREACH(dir_files, file)
+                        if (!eolian_directory_scan(dir))
                           {
-                             if (eina_str_has_suffix(file, EO_SUFFIX))
-                               {
-                                  /* Allocated string will be freed during 
deletion of "included_files" list. */
-                                  included_files = 
eina_list_append(included_files, strdup(file));
-                               }
+                             ERR("Failed to scan %s", dir);
+                             goto end;
                           }
-                        eina_iterator_free(dir_files);
                         break;
                      }
            default: help = EINA_TRUE;
@@ -264,15 +254,6 @@ int main(int argc, char **argv)
      }
 
    const char *filename;
-   EINA_LIST_FOREACH(included_files, itr, filename)
-     {
-        if (!eolian_eo_file_parse(filename))
-          {
-             ERR("Error during parsing file %s\n", filename);
-             goto end;
-          }
-     }
-
    EINA_LIST_FOREACH(files4gen, itr, filename)
      {
         if (!eolian_eo_file_parse(filename))
diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h
index eebf6ed..fa21e83 100644
--- a/src/lib/eolian/Eolian.h
+++ b/src/lib/eolian/Eolian.h
@@ -146,6 +146,18 @@ EAPI int eolian_init(void);
 EAPI int eolian_shutdown(void);
 
 /*
+ * @brief Scan the given directory and search for .eo files.
+ *
+ * The found files are just open to extract the class name.
+ *
+ * @param[in] dir the directory to scan
+ * @return EINA_TRUE on success, EINA_FALSE otherwise.
+ *
+ * @ingroup Eolian
+ */
+EAPI Eina_Bool eolian_directory_scan(const char *dir);
+
+/*
  * @brief Show information about a given class.
  *
  * If class_name is NULL, this function will print information of
diff --git a/src/lib/eolian/eolian.c b/src/lib/eolian/eolian.c
index 65d856e..94a00b4 100644
--- a/src/lib/eolian/eolian.c
+++ b/src/lib/eolian/eolian.c
@@ -54,9 +54,3 @@ EAPI int eolian_shutdown(void)
    return _eolian_init_counter;
 }
 
-EAPI Eina_Bool eolian_eo_file_parse(const char *filename)
-{
-   if (eolian_class_find_by_file(filename)) return EINA_TRUE;
-   return eo_tokenizer_database_fill(filename);
-}
-
diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c
index fe22c1d..f66f192 100644
--- a/src/lib/eolian/eolian_database.c
+++ b/src/lib/eolian/eolian_database.c
@@ -1,4 +1,5 @@
 #include <Eina.h>
+#include "eo_lexer.h"
 #include "eolian_database.h"
 
 #define PROP_GET_RETURN_DFLT_VAL "property_get_return_dflt_val"
@@ -14,6 +15,7 @@
 #define EOLIAN_PROP_SET_RETURN_COMMENT "property_set_return_comment"
 
 static Eina_Hash *_classes = NULL;
+static Eina_Hash *_filenames = NULL; /* Hash: filename without extension -> 
full path */
 static int _database_init_count = 0;
 
 typedef struct
@@ -189,6 +191,8 @@ database_init()
    eina_init();
    if (!_classes)
       _classes = eina_hash_stringshared_new(_hash_free_cb);
+   if (!_filenames)
+      _filenames = eina_hash_string_small_new(free);
    return ++_database_init_count;
 }
 
@@ -205,6 +209,7 @@ database_shutdown()
    if (_database_init_count == 0)
      {
         eina_hash_free(_classes);
+        eina_hash_free(_filenames);
         eina_shutdown();
      }
    return _database_init_count;
@@ -1244,3 +1249,56 @@ eolian_show(const char *class_name)
      }
    return EINA_TRUE;
 }
+
+#define EO_SUFFIX ".eo"
+EAPI Eina_Bool
+eolian_directory_scan(const char *dir)
+{
+   if (!dir) return EINA_FALSE;
+   char *file;
+   /* Get all files from directory. Not recursively!!! */
+   Eina_Iterator *dir_files = eina_file_ls(dir);
+   EINA_ITERATOR_FOREACH(dir_files, file)
+     {
+        if (eina_str_has_suffix(file, EO_SUFFIX))
+          {
+             int len = strlen(file);
+             int idx = len - 1;
+             while (idx >= 0 && file[idx] != '/') idx--;
+             eina_hash_add(_filenames, eina_stringshare_add_length(file+idx+1, 
len - idx - sizeof(EO_SUFFIX)), strdup(file));
+          }
+     }
+   eina_iterator_free(dir_files);
+   return EINA_TRUE;
+}
+
+EAPI Eina_Bool eolian_eo_file_parse(const char *filepath)
+{
+   const Eina_List *itr;
+   const char *class_name = eolian_class_find_by_file(filepath);
+   if (!class_name)
+     {
+        if (!eo_tokenizer_database_fill(filepath)) return EINA_FALSE;
+        class_name = eolian_class_find_by_file(filepath);
+        if (!class_name)
+          {
+             ERR("No class for file %s", filepath);
+             return EINA_FALSE;
+          }
+     }
+   EINA_LIST_FOREACH(eolian_class_inherits_list_get(class_name), itr, 
class_name)
+     {
+        char *filename = strdup(class_name);
+        eina_str_tolower(&filename);
+        filepath = eina_hash_find(_filenames, filename);
+        if (!filepath)
+          {
+             ERR("Unable to find class %s", class_name);
+             return EINA_FALSE;
+          }
+        if (!eolian_eo_file_parse(filepath)) return EINA_FALSE;
+        free(filename);
+     }
+   return EINA_TRUE;
+}
+
diff --git a/src/tests/eolian/eolian_suite.c b/src/tests/eolian/eolian_suite.c
index a9e4e77..b839a3f 100644
--- a/src/tests/eolian/eolian_suite.c
+++ b/src/tests/eolian/eolian_suite.c
@@ -25,7 +25,7 @@ START_TEST(eolian_ctor_dtor)
 
    eolian_init();
    /* Parsing */
-   fail_if(!eolian_eo_file_parse(PACKAGE_DATA_DIR"/data/base.eo"));
+   fail_if(!eolian_directory_scan(PACKAGE_DATA_DIR"/data"));
    fail_if(!eolian_eo_file_parse(PACKAGE_DATA_DIR"/data/ctor_dtor.eo"));
 
    /* Class ctor/dtor */

-- 


Reply via email to