q66 pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=cdd4860520f428f64dbf8ddb3ae05cf6bc75cf41
commit cdd4860520f428f64dbf8ddb3ae05cf6bc75cf41 Author: Daniel Kolesa <[email protected]> Date: Thu Aug 21 16:34:40 2014 +0100 eolian: turn db validation into separate API --- src/bin/elua/modules/lualian.lua | 3 +++ src/bin/eolian/main.c | 6 ++++++ src/bin/eolian_cxx/eolian_cxx.cc | 6 ++++++ src/bindings/luajit/eolian.lua | 5 +++++ src/lib/eolian/Eolian.h | 11 +++++++++++ src/lib/eolian/eolian_database.c | 13 +++++-------- 6 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/bin/elua/modules/lualian.lua b/src/bin/elua/modules/lualian.lua index 9b664a2..1a963f7 100644 --- a/src/bin/elua/modules/lualian.lua +++ b/src/bin/elua/modules/lualian.lua @@ -677,6 +677,9 @@ M.generate = function(fname, libname, fstream) if not eolian.eo_file_parse(fname) then error("Failed parsing file: " .. fname) end + if not eolian.database_validate() then + error("Failed validating database.") + end local sfn = fname:match(".*[\\/](.+)$") or fname local klass = eolian.class_get_by_file(sfn) local tp = klass:type_get() diff --git a/src/bin/eolian/main.c b/src/bin/eolian/main.c index bcd13fc..fed76e9 100644 --- a/src/bin/eolian/main.c +++ b/src/bin/eolian/main.c @@ -358,6 +358,12 @@ int main(int argc, char **argv) goto end; } + if (!eolian_database_validate()) + { + ERR("Error validating database.\n"); + goto end; + } + eo_filename_copy = strdup(eo_filename); eo_file_basename = basename(eo_filename_copy); if (show) diff --git a/src/bin/eolian_cxx/eolian_cxx.cc b/src/bin/eolian_cxx/eolian_cxx.cc index 8090f3c..4a689c5 100644 --- a/src/bin/eolian_cxx/eolian_cxx.cc +++ b/src/bin/eolian_cxx/eolian_cxx.cc @@ -219,6 +219,12 @@ database_load(options_type const& opts) << "Eolian failed parsing input files"; assert(false && "Error parsing input files"); } + if (!::eolian_database_validate()) + { + EINA_CXX_DOM_LOG_ERR(eolian_cxx::domain) + << "Eolian failed validating database."; + assert(false && "Error validating database"); + } } } // namespace eolian_cxx { diff --git a/src/bindings/luajit/eolian.lua b/src/bindings/luajit/eolian.lua index 6cf9a9a..9b8f65c 100644 --- a/src/bindings/luajit/eolian.lua +++ b/src/bindings/luajit/eolian.lua @@ -138,6 +138,7 @@ ffi.cdef [[ Eina_Bool eolian_system_directory_scan(); Eina_Bool eolian_all_eo_files_parse(); Eina_Bool eolian_all_eot_files_parse(); + Eina_Bool eolian_database_validate(void); Eina_Bool eolian_show_class(const Eolian_Class *klass); Eina_Bool eolian_show_typedef(const char *alias); Eina_Bool eolian_show_struct(const char *name); @@ -304,6 +305,10 @@ M.all_eot_files_parse = function() return eolian.eolian_all_eot_files_parse() ~= 0 end +M.database_validate = function() + return eolian.eolian_databasE_validate() ~= 0 +end + M.eot_file_parse = function(fname) return eolian.eolian_eot_file_parse(fname) ~= 0 end diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h index 3098f49..7135a45 100644 --- a/src/lib/eolian/Eolian.h +++ b/src/lib/eolian/Eolian.h @@ -291,6 +291,17 @@ EAPI Eina_Bool eolian_all_eo_files_parse(); EAPI Eina_Bool eolian_all_eot_files_parse(); /* + * @brief Validates the database, printing errors and warnings. + * + * @return EINA_TRUE on success, EINA_FALSE otherwise. + * + * Useful to catch type errors etc. early on. + * + * @ingroup Eolian + */ +EAPI Eina_Bool eolian_database_validate(void); + +/* * @brief Show information about a given class. * * If klass is NULL, this function will print information of diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c index b954a94..757f889 100644 --- a/src/lib/eolian/eolian_database.c +++ b/src/lib/eolian/eolian_database.c @@ -19,7 +19,6 @@ Eina_Hash *_filenames = NULL; Eina_Hash *_tfilenames = NULL; static int _database_init_count = 0; -static int _parse_depth = 0; static void _hashlist_free(void *data) @@ -160,7 +159,6 @@ eolian_eo_file_parse(const char *filepath) const Eolian_Class *class = eolian_class_get_by_file(bfilename); const char *inherit_name; Eolian_Implement *impl; - ++_parse_depth; if (!class) { if (!eo_parser_database_fill(filepath, EINA_FALSE)) @@ -207,15 +205,9 @@ eolian_eo_file_parse(const char *filepath) } eina_iterator_free(itr); - --_parse_depth; - if (!_parse_depth && !database_validate()) - goto error; - - _parse_depth = 0; return EINA_TRUE; error: - _parse_depth = 0; return EINA_FALSE; } @@ -249,3 +241,8 @@ eolian_all_eo_files_parse() return ret; } +EAPI Eina_Bool +eolian_database_validate(void) +{ + return database_validate(); +} --
