From 8a1f93f698315b43de28b755bce5fc9a4d85d59a Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Tue, 5 Dec 2017 16:40:04 +0100 Subject: [PATCH] eolian: pass state where necessary This modifies the API so that global state removal is made possible. It's still used internally for now but externally the state is contained. --- src/bin/eolian/main.c | 9 +- src/bin/eolian_cxx/eolian_cxx.cc | 23 ++++- src/bindings/luajit/eolian.lua | 104 +++++++++++-------- src/lib/eolian/Eolian.h | 144 +++++++++++++++------------ src/lib/eolian/eolian_database.c | 20 ++-- src/scripts/elua/modules/lualian.lua | 16 ++- src/tests/eolian/eolian_parsing.c | 119 ++++++++++++++++------ 7 files changed, 276 insertions(+), 159 deletions(-) diff --git a/src/bin/eolian/main.c b/src/bin/eolian/main.c index fdb5ca2568..92643c6f7e 100644 --- a/src/bin/eolian/main.c +++ b/src/bin/eolian/main.c @@ -430,6 +430,8 @@ main(int argc, char **argv) eina_init(); eolian_init(); + Eolian *eos = eolian_new(); + const char *dom = "eolian_gen"; _eolian_gen_log_dom = eina_log_domain_register(dom, EINA_COLOR_GREEN); if (_eolian_gen_log_dom < 0) @@ -530,7 +532,7 @@ main(int argc, char **argv) if (scan_system) { - if (!eolian_system_directory_scan()) + if (!eolian_system_directory_scan(eos)) { fprintf(stderr, "eolian: could not scan system directory\n"); goto end; @@ -540,14 +542,14 @@ main(int argc, char **argv) const char *inc; EINA_LIST_FREE(includes, inc) { - if (!eolian_directory_scan(inc)) + if (!eolian_directory_scan(eos, inc)) { fprintf(stderr, "eolian: could not scan '%s'\n", inc); goto end; } } - const Eolian_Unit *src = eolian_file_parse(input); + const Eolian_Unit *src = eolian_file_parse(eos, input); if (!src) { fprintf(stderr, "eolian: could not parse file '%s'\n", input); @@ -589,6 +591,7 @@ end: free(outs[i]); free(basen); + eolian_free(eos); eolian_shutdown(); eina_shutdown(); diff --git a/src/bin/eolian_cxx/eolian_cxx.cc b/src/bin/eolian_cxx/eolian_cxx.cc index 134700ae6c..fac96da5e2 100644 --- a/src/bin/eolian_cxx/eolian_cxx.cc +++ b/src/bin/eolian_cxx/eolian_cxx.cc @@ -34,6 +34,7 @@ struct options_type { std::vector include_dirs; std::vector in_files; + mutable Eolian* state; mutable Eolian_Unit const* unit; std::string out_file; bool main_header; @@ -298,7 +299,7 @@ run(options_type const& opts) for(auto&& name : opts.in_files) { - Eolian_Unit const* unit = ::eolian_file_parse(name.c_str()); + Eolian_Unit const* unit = ::eolian_file_parse(opts.state, name.c_str()); if(!unit) { EINA_CXX_DOM_LOG_ERR(eolian_cxx::domain) @@ -345,18 +346,31 @@ run(options_type const& opts) } } +static void +state_init(options_type const& opts) +{ + Eolian *eos = ::eolian_new(); + if (!eos) + { + EINA_CXX_DOM_LOG_ERR(eolian_cxx::domain) + << "Eolian failed creating state"; + assert(false && "Error creating Eolian state"); + } + opts.state = eos; +} + static void database_load(options_type const& opts) { for (auto src : opts.include_dirs) { - if (!::eolian_directory_scan(src.c_str())) + if (!::eolian_directory_scan(opts.state, src.c_str())) { EINA_CXX_DOM_LOG_WARN(eolian_cxx::domain) << "Couldn't load eolian from '" << src << "'."; } } - if (!::eolian_all_eot_files_parse()) + if (!::eolian_all_eot_files_parse(opts.state)) { EINA_CXX_DOM_LOG_ERR(eolian_cxx::domain) << "Eolian failed parsing eot files"; @@ -368,7 +382,7 @@ database_load(options_type const& opts) << "No input file."; assert(false && "Error parsing input file"); } - if (!opts.main_header && !::eolian_file_parse(opts.in_files[0].c_str())) + if (!opts.main_header && !::eolian_file_parse(opts.state, opts.in_files[0].c_str())) { EINA_CXX_DOM_LOG_ERR(eolian_cxx::domain) << "Failed parsing: " << opts.in_files[0] << "."; @@ -480,6 +494,7 @@ int main(int argc, char **argv) efl::eina::eina_init eina_init; efl::eolian::eolian_init eolian_init; eolian_cxx::options_type opts = opts_get(argc, argv); + eolian_cxx::state_init(opts); eolian_cxx::database_load(opts); eolian_cxx::run(opts); } diff --git a/src/bindings/luajit/eolian.lua b/src/bindings/luajit/eolian.lua index b0c0f7c67e..b7d4d6ec0d 100644 --- a/src/bindings/luajit/eolian.lua +++ b/src/bindings/luajit/eolian.lua @@ -13,6 +13,7 @@ ffi.cdef [[ typedef unsigned char Eina_Bool; typedef struct _Eina_Iterator Eina_Iterator; + typedef struct _Eolian Eolian; typedef struct _Eolian_Class Eolian_Class; typedef struct _Eolian_Function Eolian_Function; typedef struct _Eolian_Type Eolian_Type; @@ -284,17 +285,19 @@ ffi.cdef [[ const char *text, *text_end; } Eolian_Doc_Token; - const Eolian_Unit *eolian_file_parse(const char *filepath); - Eina_Iterator *eolian_all_eo_file_paths_get(void); - Eina_Iterator *eolian_all_eot_file_paths_get(void); - Eina_Iterator *eolian_all_eo_files_get(void); - Eina_Iterator *eolian_all_eot_files_get(void); int eolian_init(void); int eolian_shutdown(void); - Eina_Bool eolian_directory_scan(const char *dir); - Eina_Bool eolian_system_directory_scan(); - Eina_Bool eolian_all_eo_files_parse(); - Eina_Bool eolian_all_eot_files_parse(); + Eolian *eolian_new(void); + void eolian_free(Eolian *state); + const Eolian_Unit *eolian_file_parse(Eolian *state, const char *filepath); + Eina_Iterator *eolian_all_eo_file_paths_get(Eolian *state); + Eina_Iterator *eolian_all_eot_file_paths_get(Eolian *state); + Eina_Iterator *eolian_all_eo_files_get(Eolian *state); + Eina_Iterator *eolian_all_eot_files_get(Eolian *state); + Eina_Bool eolian_directory_scan(Eolian *state, const char *dir); + Eina_Bool eolian_system_directory_scan(Eolian *state); + Eina_Bool eolian_all_eo_files_parse(Eolian *state); + Eina_Bool eolian_all_eot_files_parse(Eolian *state); const Eolian_Class *eolian_class_get_by_name(const Eolian_Unit *unit, const char *class_name); const Eolian_Class *eolian_class_get_by_file(const Eolian_Unit *unit, const char *file_name); const char *eolian_class_file_get(const Eolian_Class *klass); @@ -509,44 +512,59 @@ M.object_scope = { PROTECTED = 3 } -M.directory_scan = function(dir) - return eolian.eolian_directory_scan(dir) ~= 0 -end +ffi.metatype("Eolian", { + __index = { + directory_scan = function(self, dir) + return eolian.eolian_directory_scan(self, dir) ~= 0 + end, -M.system_directory_scan = function() - return eolian.eolian_system_directory_scan() ~= 0 -end + system_directory_scan = function(self) + return eolian.eolian_system_directory_scan(self) ~= 0 + end, -M.file_parse = function(fpath) - local v = eolian.eolian_file_parse(fpath) - if v == nil then - return nil + file_parse = function(self, fpath) + local v = eolian.eolian_file_parse(self, fpath) + if v == nil then + return nil + end + return v + end, + + all_eo_files_parse = function(self) + return eolian.eolian_all_eo_files_parse(self) ~= 0 + end, + + all_eot_files_parse = function(self) + return eolian.eolian_all_eot_files_parse(self) ~= 0 + end, + + all_eo_file_paths_get = function(self) + return iterator.String_Iterator(eolian.eolian_all_eo_file_paths_get(self)) + end, + + all_eot_file_paths_get = function(self) + return iterator.String_Iterator(eolian.eolian_all_eot_file_paths_get(self)) + end, + + all_eo_files_get = function(self) + return iterator.String_Iterator(eolian.eolian_all_eo_files_get(self)) + end, + + all_eot_files_get = function(self) + return iterator.String_Iterator(eolian.eolian_all_eot_files_get(self)) + end, + + unit_get = function(self) + return ffi.cast("Eolian_Unit *", self) + end + }, + __gc = function(self) + eolian.eolian_free(self) end - return v -end +}) -M.all_eo_files_parse = function() - return eolian.eolian_all_eo_files_parse() ~= 0 -end - -M.all_eot_files_parse = function() - return eolian.eolian_all_eot_files_parse() ~= 0 -end - -M.all_eo_file_paths_get = function() - return iterator.String_Iterator(eolian.eolian_all_eo_file_paths_get()) -end - -M.all_eot_file_paths_get = function() - return iterator.String_Iterator(eolian.eolian_all_eot_file_paths_get()) -end - -M.all_eo_files_get = function() - return iterator.String_Iterator(eolian.eolian_all_eo_files_get()) -end - -M.all_eot_files_get = function() - return iterator.String_Iterator(eolian.eolian_all_eot_files_get()) +M.new = function() + return eolian.eolian_new() end M.declaration_type = { diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h index 0e8b9d59c7..bfb8c5387a 100644 --- a/src/lib/eolian/Eolian.h +++ b/src/lib/eolian/Eolian.h @@ -455,65 +455,6 @@ typedef struct _Eolian_Doc_Token const char *text, *text_end; } Eolian_Doc_Token; -/* - * @brief Parse the given .eo or .eot file and fill the database. - * - * The input can be either a full path to the file or only a filename. - * If it's a filename, it must be scanned for first. - * - * @param[in] filepath Path to the file to parse. - * @return The unit corresponding to the parsed file or NULL. - * - * @see eolian_directory_scan - * - * @ingroup Eolian - */ -EAPI const Eolian_Unit *eolian_file_parse(const char *filepath); - -/* - * @brief Get an iterator to all .eo file names with paths. - * - * @see eolian_all_eo_files_get - * @see eolian_all_eot_file_paths_get - * @see eolian_all_eot_files_get - * - * @ingroup Eolian - */ -EAPI Eina_Iterator *eolian_all_eo_file_paths_get(void); - -/* - * @brief Get an iterator to all .eot file names with paths. - * - * @see eolian_all_eo_files_get - * @see eolian_all_eo_file_paths_get - * @see eolian_all_eot_files_get - * - * @ingroup Eolian - */ -EAPI Eina_Iterator *eolian_all_eot_file_paths_get(void); - -/* - * @brief Get an iterator to all .eo file names (without paths). - * - * @see eolian_all_eo_file_paths_get - * @see eolian_all_eot_file_paths_get - * @see eolian_all_eot_files_get - * - * @ingroup Eolian - */ -EAPI Eina_Iterator *eolian_all_eo_files_get(void); - -/* - * @brief Get an iterator to all .eot file names (without paths). - * - * @see eolian_all_eo_file_paths_get - * @see eolian_all_eot_file_paths_get - * @see eolian_all_eo_files_get - * - * @ingroup Eolian - */ -EAPI Eina_Iterator *eolian_all_eot_files_get(void); - /* * @brief Init Eolian. * @@ -550,17 +491,86 @@ EAPI Eolian *eolian_new(void); * * If the input is NULL, this function has no effect. * - * @param[in] unit the state to free + * @param[in] state the state to free * */ EAPI void eolian_free(Eolian *state); +/* + * @brief Parse the given .eo or .eot file and fill the database. + * + * The input can be either a full path to the file or only a filename. + * If it's a filename, it must be scanned for first. + * + * @param[in] state The Eolian state. + * @param[in] filepath Path to the file to parse. + * @return The unit corresponding to the parsed file or NULL. + * + * @see eolian_directory_scan + * + * @ingroup Eolian + */ +EAPI const Eolian_Unit *eolian_file_parse(Eolian *state, const char *filepath); + +/* + * @brief Get an iterator to all .eo file names with paths. + * + * @param[in] state The Eolian state. + * + * @see eolian_all_eo_files_get + * @see eolian_all_eot_file_paths_get + * @see eolian_all_eot_files_get + * + * @ingroup Eolian + */ +EAPI Eina_Iterator *eolian_all_eo_file_paths_get(Eolian *state); + +/* + * @brief Get an iterator to all .eot file names with paths. + * + * @param[in] state The Eolian state. + * + * @see eolian_all_eo_files_get + * @see eolian_all_eo_file_paths_get + * @see eolian_all_eot_files_get + * + * @ingroup Eolian + */ +EAPI Eina_Iterator *eolian_all_eot_file_paths_get(Eolian *state); + +/* + * @brief Get an iterator to all .eo file names (without paths). + * + * @param[in] state The Eolian state. + * + * @see eolian_all_eo_file_paths_get + * @see eolian_all_eot_file_paths_get + * @see eolian_all_eot_files_get + * + * @ingroup Eolian + */ +EAPI Eina_Iterator *eolian_all_eo_files_get(Eolian *state); + +/* + * @brief Get an iterator to all .eot file names (without paths). + * + * @param[in] state The Eolian state. + * + * @see eolian_all_eo_file_paths_get + * @see eolian_all_eot_file_paths_get + * @see eolian_all_eo_files_get + * + * @ingroup Eolian + */ +EAPI Eina_Iterator *eolian_all_eot_files_get(Eolian *state); + /* * @brief Scan the given directory (recursively) and search for .eo and * .eot files. * * The found files are just open to extract the class name. * + * @param[in] state The Eolian state. * @param[in] dir the directory to scan * @return EINA_TRUE on success, EINA_FALSE otherwise. * @@ -568,24 +578,28 @@ EAPI void eolian_free(Eolian *state); * * @ingroup Eolian */ -EAPI Eina_Bool eolian_directory_scan(const char *dir); +EAPI Eina_Bool eolian_directory_scan(Eolian *state, const char *dir); /* * @brief Scan the system directory (recursively) and search for .eo and * .eot files. * + * @param[in] state The Eolian state. + * * @return EINA_TRUE on success, EINA_FALSE otherwise. * * @see eolian_directory_scan * * @ingroup Eolian */ -EAPI Eina_Bool eolian_system_directory_scan(void); +EAPI Eina_Bool eolian_system_directory_scan(Eolian *state); /* * @brief Force parsing of all the .eo files located in the directories * given in eolian_directory_scan.. * + * @param[in] state The Eolian state. + * * @return EINA_TRUE on success, EINA_FALSE otherwise. * * @see eolian_directory_scan @@ -593,12 +607,14 @@ EAPI Eina_Bool eolian_system_directory_scan(void); * * @ingroup Eolian */ -EAPI Eina_Bool eolian_all_eo_files_parse(void); +EAPI Eina_Bool eolian_all_eo_files_parse(Eolian *state); /* * @brief Force parsing of all the .eot files located in the directories * given in eolian_directory_scan.. * + * @param[in] state The Eolian state. + * * @return EINA_TRUE on success, EINA_FALSE otherwise. * * @see eolian_directory_scan @@ -606,7 +622,7 @@ EAPI Eina_Bool eolian_all_eo_files_parse(void); * * @ingroup Eolian */ -EAPI Eina_Bool eolian_all_eot_files_parse(void); +EAPI Eina_Bool eolian_all_eot_files_parse(Eolian *state); /* * @brief Gets a class by its name diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c index e68e9d3b0a..0a6601b539 100644 --- a/src/lib/eolian/eolian_database.c +++ b/src/lib/eolian/eolian_database.c @@ -685,7 +685,7 @@ _scan_cb(const char *name, const char *path, void *data EINA_UNUSED) } EAPI Eina_Bool -eolian_directory_scan(const char *dir) +eolian_directory_scan(Eolian *state EINA_UNUSED, const char *dir) { if (!dir) return EINA_FALSE; eina_file_dir_list(dir, EINA_TRUE, _scan_cb, NULL); @@ -693,13 +693,13 @@ eolian_directory_scan(const char *dir) } EAPI Eina_Bool -eolian_system_directory_scan() +eolian_system_directory_scan(Eolian *state) { Eina_Bool ret; Eina_Strbuf *buf = eina_strbuf_new(); eina_strbuf_append(buf, eina_prefix_data_get(_eolian_prefix)); eina_strbuf_append(buf, "/include"); - ret = eolian_directory_scan(eina_strbuf_string_get(buf)); + ret = eolian_directory_scan(state, eina_strbuf_string_get(buf)); eina_strbuf_free(buf); return ret; } @@ -773,7 +773,7 @@ _parse_deferred() static Eolian_Unit unit_tmp; EAPI const Eolian_Unit * -eolian_file_parse(const char *filepath) +eolian_file_parse(Eolian *state EINA_UNUSED, const char *filepath) { if (!_eolian_file_parse_nodep(filepath)) return NULL; @@ -794,7 +794,7 @@ static Eina_Bool _tfile_parse(const Eina_Hash *hash EINA_UNUSED, const void *key } EAPI Eina_Bool -eolian_all_eot_files_parse() +eolian_all_eot_files_parse(Eolian *state EINA_UNUSED) { Eina_Bool ret = EINA_TRUE; @@ -819,7 +819,7 @@ static Eina_Bool _file_parse(const Eina_Hash *hash EINA_UNUSED, const void *key } EAPI Eina_Bool -eolian_all_eo_files_parse() +eolian_all_eo_files_parse(Eolian *state EINA_UNUSED) { Eina_Bool ret = EINA_TRUE; @@ -836,28 +836,28 @@ eolian_all_eo_files_parse() } EAPI Eina_Iterator * -eolian_all_eot_files_get(void) +eolian_all_eot_files_get(Eolian *state EINA_UNUSED) { if (!_tfilenames) return NULL; return eina_hash_iterator_key_new(_tfilenames); } EAPI Eina_Iterator * -eolian_all_eo_files_get(void) +eolian_all_eo_files_get(Eolian *state EINA_UNUSED) { if (!_filenames) return NULL; return eina_hash_iterator_key_new(_filenames); } EAPI Eina_Iterator * -eolian_all_eot_file_paths_get(void) +eolian_all_eot_file_paths_get(Eolian *state EINA_UNUSED) { if (!_tfilenames) return NULL; return eina_hash_iterator_data_new(_tfilenames); } EAPI Eina_Iterator * -eolian_all_eo_file_paths_get(void) +eolian_all_eo_file_paths_get(Eolian *state EINA_UNUSED) { if (!_filenames) return NULL; return eina_hash_iterator_data_new(_filenames); diff --git a/src/scripts/elua/modules/lualian.lua b/src/scripts/elua/modules/lualian.lua index 035c24db96..3864bd1d02 100644 --- a/src/scripts/elua/modules/lualian.lua +++ b/src/scripts/elua/modules/lualian.lua @@ -16,6 +16,14 @@ local obj_scope = eolian.object_scope local param_dir = eolian.parameter_dir local gen_unit +local gen_state + +local get_state = function() + if not gen_state then + gen_state = eolian.new() + end + return assert(gen_state, "could not create eolian state") +end cutil.init_module(function() dom = log.Domain("lualian") @@ -683,21 +691,21 @@ local gen_class = function(klass) end M.include_dir = function(dir) - if not eolian.directory_scan(dir) then + if not get_state():directory_scan(dir) then error("Failed including directory: " .. dir) end end M.load_eot_files = function() - return eolian.all_eot_files_parse() + return get_state():all_eot_files_parse() end M.system_directory_scan = function() - return eolian.system_directory_scan() + return get_state():system_directory_scan() end M.generate = function(fname, fstream) - local unit = eolian.file_parse(fname) + local unit = get_state():file_parse(fname) if unit == nil then error("Failed parsing file: " .. fname) end diff --git a/src/tests/eolian/eolian_parsing.c b/src/tests/eolian/eolian_parsing.c index ce18e4e137..788ca774c3 100644 --- a/src/tests/eolian/eolian_parsing.c +++ b/src/tests/eolian/eolian_parsing.c @@ -23,9 +23,10 @@ START_TEST(eolian_namespaces) void *dummy; eolian_init(); + Eolian *eos = eolian_new(); /* Parsing */ - fail_if(!eolian_directory_scan(PACKAGE_DATA_DIR"/data")); - fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/nmsp1_class1.eo"))); + fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data")); + fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/nmsp1_class1.eo"))); /* Classes existence */ fail_if(!(class11 = eolian_class_get_by_name(unit, "nmsp1.class1"))); @@ -89,6 +90,7 @@ START_TEST(eolian_namespaces) fail_if(eina_iterator_next(iter, &dummy)); eina_iterator_free(iter); + eolian_free(eos); eolian_shutdown(); } END_TEST @@ -104,8 +106,10 @@ START_TEST(eolian_events) void *dummy; eolian_init(); + Eolian *eos = eolian_new(); /* Parsing */ - fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/events.eo"))); + fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data")); + fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/events.eo"))); /* Class */ fail_if(!(class = eolian_class_get_by_name(unit, "Events"))); @@ -162,6 +166,7 @@ START_TEST(eolian_events) fail_if(!eolian_class_event_get_by_name(class, "clicked,double")); fail_if(eolian_class_event_get_by_name(class, "clicked,triple")); + eolian_free(eos); eolian_shutdown(); } END_TEST @@ -176,9 +181,10 @@ START_TEST(eolian_override) const Eolian_Unit *unit; eolian_init(); + Eolian *eos = eolian_new(); /* Parsing */ - fail_if(!eolian_directory_scan(PACKAGE_DATA_DIR"/data")); - fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/override.eo"))); + fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data")); + fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/override.eo"))); /* Class */ fail_if(!(class = eolian_class_get_by_name(unit, "Override"))); @@ -220,6 +226,7 @@ START_TEST(eolian_override) eina_iterator_free(iter); + eolian_free(eos); eolian_shutdown(); } END_TEST @@ -231,14 +238,17 @@ START_TEST(eolian_consts) const Eolian_Unit *unit; eolian_init(); + Eolian *eos = eolian_new(); /* Parsing */ - fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/consts.eo"))); + fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data")); + fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/consts.eo"))); fail_if(!(class = eolian_class_get_by_name(unit, "Consts"))); /* Method */ fail_if(!(fid = eolian_class_function_get_by_name(class, "foo", EOLIAN_METHOD))); fail_if(EINA_FALSE == eolian_function_object_is_const(fid)); + eolian_free(eos); eolian_shutdown(); } END_TEST @@ -255,9 +265,10 @@ START_TEST(eolian_ctor_dtor) void *dummy; eolian_init(); + Eolian *eos = eolian_new(); /* Parsing */ - fail_if(!eolian_directory_scan(PACKAGE_DATA_DIR"/data")); - fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/ctor_dtor.eo"))); + fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data")); + fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/ctor_dtor.eo"))); fail_if(!(class = eolian_class_get_by_name(unit, "Ctor_Dtor"))); fail_if(!(base = eolian_class_get_by_name(unit, "Base"))); @@ -307,6 +318,7 @@ START_TEST(eolian_ctor_dtor) fail_if(eina_iterator_next(iter, &dummy)); eina_iterator_free(iter); + eolian_free(eos); eolian_shutdown(); } END_TEST @@ -322,8 +334,10 @@ START_TEST(eolian_typedef) const char *file; eolian_init(); + Eolian *eos = eolian_new(); /* Parsing */ - fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/typedef.eo"))); + fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data")); + fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/typedef.eo"))); /* Check that the class Dummy is still readable */ fail_if(!(class = eolian_class_get_by_name(unit, "Typedef"))); @@ -388,6 +402,7 @@ START_TEST(eolian_typedef) fail_if(!eina_iterator_next(iter, (void**)&tdl)); fail_if(eina_iterator_next(iter, (void**)&tdl)); + eolian_free(eos); eolian_shutdown(); } END_TEST @@ -404,8 +419,10 @@ START_TEST(eolian_complex_type) void *dummy; eolian_init(); + Eolian *eos = eolian_new(); /* Parsing */ - fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/complex_type.eo"))); + fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data")); + fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/complex_type.eo"))); fail_if(!(class = eolian_class_get_by_name(unit, "Complex_Type"))); /* Properties return type */ @@ -474,6 +491,7 @@ START_TEST(eolian_complex_type) fail_if(strcmp(type_name, "char *")); eina_stringshare_del(type_name); + eolian_free(eos); eolian_shutdown(); } END_TEST @@ -485,8 +503,10 @@ START_TEST(eolian_scope) const Eolian_Unit *unit; eolian_init(); + Eolian *eos = eolian_new(); /* Parsing */ - fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/scope.eo"))); + fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data")); + fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/scope.eo"))); fail_if(!(class = eolian_class_get_by_name(unit, "Scope"))); /* Property scope */ @@ -507,6 +527,7 @@ START_TEST(eolian_scope) fail_if(!(fid = eolian_class_function_get_by_name(class, "foobar", EOLIAN_METHOD))); fail_if(eolian_function_scope_get(fid, EOLIAN_METHOD) != EOLIAN_SCOPE_PUBLIC); + eolian_free(eos); eolian_shutdown(); } END_TEST @@ -525,8 +546,10 @@ START_TEST(eolian_simple_parsing) void *dummy; eolian_init(); + Eolian *eos = eolian_new(); /* Parsing */ - fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/class_simple.eo"))); + fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data")); + fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/class_simple.eo"))); fail_if(!(class = eolian_class_get_by_name(unit, "Class_Simple"))); fail_if(eolian_class_get_by_file(unit, "class_simple.eo") != class); fail_if(strcmp(eolian_class_file_get(class), "class_simple.eo")); @@ -643,6 +666,7 @@ START_TEST(eolian_simple_parsing) fail_if(eolian_function_is_beta(fid)); fail_if(!eolian_type_is_ptr(eolian_function_return_type_get(fid, EOLIAN_METHOD))); + eolian_free(eos); eolian_shutdown(); } END_TEST @@ -659,9 +683,11 @@ START_TEST(eolian_struct) const char *file; eolian_init(); + Eolian *eos = eolian_new(); /* Parsing */ - fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/struct.eo"))); + fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data")); + fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/struct.eo"))); /* Check that the class Dummy is still readable */ fail_if(!(class = eolian_class_get_by_name(unit, "Struct"))); @@ -713,6 +739,7 @@ START_TEST(eolian_struct) fail_if(!(tdl = eolian_type_typedecl_get(type))); fail_if(eolian_typedecl_type_get(tdl) != EOLIAN_TYPEDECL_STRUCT); + eolian_free(eos); eolian_shutdown(); } END_TEST @@ -724,9 +751,11 @@ START_TEST(eolian_extern) const Eolian_Unit *unit; eolian_init(); + Eolian *eos = eolian_new(); /* Parsing */ - fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/extern.eo"))); + fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data")); + fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/extern.eo"))); /* Check that the class Dummy is still readable */ fail_if(!(class = eolian_class_get_by_name(unit, "Extern"))); @@ -748,6 +777,7 @@ START_TEST(eolian_extern) fail_if(!(tdl = eolian_typedecl_struct_get_by_name(unit, "Y"))); fail_if(!eolian_typedecl_is_extern(tdl)); + eolian_free(eos); eolian_shutdown(); } END_TEST @@ -763,9 +793,11 @@ START_TEST(eolian_var) const char *name; eolian_init(); + Eolian *eos = eolian_new(); /* Parsing */ - fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/var.eo"))); + fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data")); + fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/var.eo"))); /* Check that the class Dummy is still readable */ fail_if(!(class = eolian_class_get_by_name(unit, "Var"))); @@ -813,6 +845,7 @@ START_TEST(eolian_var) fail_if(strcmp(name, "double")); fail_if(eolian_variable_value_get(var)); + eolian_free(eos); eolian_shutdown(); } END_TEST @@ -831,9 +864,11 @@ START_TEST(eolian_enum) Eolian_Value v; eolian_init(); + Eolian *eos = eolian_new(); /* Parsing */ - fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/enum.eo"))); + fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data")); + fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/enum.eo"))); /* Check that the class Dummy is still readable */ fail_if(!(class = eolian_class_get_by_name(unit, "Enum"))); @@ -914,6 +949,7 @@ START_TEST(eolian_enum) fail_if(v.type != EOLIAN_EXPR_INT); fail_if(v.value.i != 5); + eolian_free(eos); eolian_shutdown(); } END_TEST @@ -925,8 +961,10 @@ START_TEST(eolian_class_funcs) const Eolian_Unit *unit; eolian_init(); + Eolian *eos = eolian_new(); /* Parsing */ - fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/class_funcs.eo"))); + fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data")); + fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/class_funcs.eo"))); fail_if(!(class = eolian_class_get_by_name(unit, "Class_Funcs"))); /* Class properties */ @@ -950,6 +988,7 @@ START_TEST(eolian_class_funcs) fail_if(eolian_function_is_class(fid)); fail_if(eolian_function_scope_get(fid, EOLIAN_METHOD) != EOLIAN_SCOPE_PROTECTED); + eolian_free(eos); eolian_shutdown(); } END_TEST @@ -962,9 +1001,11 @@ START_TEST(eolian_free_func) const Eolian_Unit *unit; eolian_init(); + Eolian *eos = eolian_new(); /* Parsing */ - fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/free_func.eo"))); + fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data")); + fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/free_func.eo"))); /* Check that the class Dummy is still readable */ fail_if(!(class = eolian_class_get_by_name(unit, "Free_Func"))); @@ -996,6 +1037,7 @@ START_TEST(eolian_free_func) fail_if(!(type = eolian_typedecl_base_type_get(tdl))); fail_if(strcmp(eolian_type_free_func_get(type), "ptr_free")); + eolian_free(eos); eolian_shutdown(); } END_TEST @@ -1009,9 +1051,11 @@ START_TEST(eolian_null) Eina_Iterator *iter; eolian_init(); + Eolian *eos = eolian_new(); /* Parsing */ - fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/null.eo"))); + fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data")); + fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/null.eo"))); fail_if(!(class = eolian_class_get_by_name(unit, "Null"))); fail_if(!(func = eolian_class_function_get_by_name(class, "foo", EOLIAN_METHOD))); @@ -1045,6 +1089,7 @@ START_TEST(eolian_null) fail_if(eina_iterator_next(iter, (void**)¶m)); eina_iterator_free(iter); + eolian_free(eos); eolian_shutdown(); } END_TEST @@ -1056,10 +1101,11 @@ START_TEST(eolian_import) const Eolian_Unit *unit; eolian_init(); + Eolian *eos = eolian_new(); - fail_if(!eolian_directory_scan(PACKAGE_DATA_DIR"/data")); + fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data")); - fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/import.eo"))); + fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/import.eo"))); fail_if(!(class = eolian_class_get_by_name(unit, "Import"))); fail_if(!(tdl = eolian_typedecl_alias_get_by_name(unit, "Imported"))); @@ -1068,6 +1114,7 @@ START_TEST(eolian_import) fail_if(!(tdl = eolian_typedecl_struct_get_by_name(unit, "Imported_Struct"))); fail_if(strcmp(eolian_typedecl_file_get(tdl), "import_types.eot")); + eolian_free(eos); eolian_shutdown(); } END_TEST @@ -1082,10 +1129,11 @@ START_TEST(eolian_decl) Eina_Iterator *itr; eolian_init(); + Eolian *eos = eolian_new(); - fail_if(!eolian_directory_scan(PACKAGE_DATA_DIR"/data")); + fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data")); - fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/decl.eo"))); + fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/decl.eo"))); fail_if(!(class = eolian_class_get_by_name(unit, "Decl"))); fail_if(!(itr = eolian_declarations_get_by_file("decl.eo"))); @@ -1130,6 +1178,7 @@ START_TEST(eolian_decl) fail_if(!(decl = eolian_declaration_get_by_name("A"))); fail_if(eolian_declaration_type_get(decl) != EOLIAN_DECL_STRUCT); + eolian_free(eos); eolian_shutdown(); } END_TEST @@ -1149,10 +1198,11 @@ START_TEST(eolian_docs) Eina_Iterator *itr; eolian_init(); + Eolian *eos = eolian_new(); - fail_if(!eolian_directory_scan(PACKAGE_DATA_DIR"/data")); + fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data")); - fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/docs.eo"))); + fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/docs.eo"))); fail_if(!(tdl = eolian_typedecl_struct_get_by_name(unit, "Foo"))); fail_if(!(doc = eolian_typedecl_documentation_get(tdl))); @@ -1374,6 +1424,7 @@ START_TEST(eolian_docs) "Event docs.")); fail_if(eolian_documentation_description_get(doc)); + eolian_free(eos); eolian_shutdown(); } END_TEST @@ -1391,11 +1442,12 @@ START_TEST(eolian_function_types) void *dummy; eolian_init(); + Eolian *eos = eolian_new(); - fail_if(!eolian_directory_scan(PACKAGE_DATA_DIR"/data")); + fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data")); /* Parsing */ - fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/function_types.eot"))); + fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/function_types.eot"))); /* void func(void); */ fail_if(!(decl = eolian_typedecl_alias_get_by_name(unit, "VoidFunc"))); @@ -1500,6 +1552,7 @@ START_TEST(eolian_function_types) fail_if(eina_iterator_next(iter, &dummy)); + eolian_free(eos); eolian_shutdown(); } END_TEST @@ -1517,10 +1570,11 @@ START_TEST(eolian_function_as_arguments) void *dummy; eolian_init(); + Eolian *eos = eolian_new(); - fail_if(!eolian_directory_scan(PACKAGE_DATA_DIR"/data")); + fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data")); - fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/function_as_argument.eo"))); + fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/function_as_argument.eo"))); fail_if(!(cls = eolian_class_get_by_name(unit, "Function_As_Argument"))); @@ -1540,6 +1594,7 @@ START_TEST(eolian_function_as_arguments) fail_if(eina_iterator_next(iter, &dummy)); + eolian_free(eos); eolian_shutdown(); } END_TEST @@ -1557,10 +1612,11 @@ START_TEST(eolian_parts) }; eolian_init(); + Eolian *eos = eolian_new(); - fail_if(!eolian_directory_scan(PACKAGE_DATA_DIR"/data")); + fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data")); - fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/parts.eo"))); + fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/parts.eo"))); fail_if(!(cls = eolian_class_get_by_name(unit, "Parts"))); @@ -1585,6 +1641,7 @@ START_TEST(eolian_parts) } eina_iterator_free(iter); + eolian_free(eos); eolian_shutdown(); } END_TEST