Done On 04/28/2014 12:24 PM, Tom Hacohen wrote: > Yay, good job. :) > > Please update the wiki. > > > On 27/04/14 09:04, Daniel Zaoui wrote: >> 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 */ >> > > > ------------------------------------------------------------------------------ > "Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE > Instantly run your Selenium tests across 300+ browser/OS combos. Get > unparalleled scalability from the best Selenium testing platform available. > Simple to use. Nothing to install. Get started now for free." > http://p.sf.net/sfu/SauceLabs > _______________________________________________ > enlightenment-devel mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/enlightenment-devel >
------------------------------------------------------------------------------ "Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE Instantly run your Selenium tests across 300+ browser/OS combos. Get unparalleled scalability from the best Selenium testing platform available. Simple to use. Nothing to install. Get started now for free." http://p.sf.net/sfu/SauceLabs _______________________________________________ enlightenment-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
