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();
+}

-- 


Reply via email to