q66 pushed a commit to branch master.

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

commit a1ae5cd918776ba3661e9ade588231f3b2a0db4e
Author: Daniel Kolesa <[email protected]>
Date:   Tue Mar 20 17:05:22 2018 +0100

    eolian: use new error logging for all recoverable errors
---
 src/lib/eolian/database_class_api.c |  4 ++--
 src/lib/eolian/database_expr.c      |  2 +-
 src/lib/eolian/database_validate.c  |  8 ++++----
 src/lib/eolian/eo_lexer.c           | 18 ++++++++++++------
 src/lib/eolian/eo_parser.c          | 19 +++++++++++++------
 src/lib/eolian/eolian_database.c    | 13 +++++++++----
 src/lib/eolian/eolian_database.h    | 35 +++++++++++++++++++++++++++++++++++
 src/lib/eolian/eolian_priv.h        | 17 ++++-------------
 8 files changed, 80 insertions(+), 36 deletions(-)

diff --git a/src/lib/eolian/database_class_api.c 
b/src/lib/eolian/database_class_api.c
index cee57a3a39..dad2c77fc7 100644
--- a/src/lib/eolian/database_class_api.c
+++ b/src/lib/eolian/database_class_api.c
@@ -95,8 +95,8 @@ eolian_class_function_by_name_get(const Eolian_Class *cl, 
const char *func_name,
           }
      }
 
-   _eolian_log("function '%s' not found in class '%s'", func_name,
-               eolian_object_short_name_get(&cl->base));
+   eolian_state_log(cl->base.unit->state, "function '%s' not found in class 
'%s'",
+                    func_name, eolian_object_short_name_get(&cl->base));
    return NULL;
 }
 
diff --git a/src/lib/eolian/database_expr.c b/src/lib/eolian/database_expr.c
index 16497c1779..60be01bd01 100644
--- a/src/lib/eolian/database_expr.c
+++ b/src/lib/eolian/database_expr.c
@@ -12,7 +12,7 @@
 static Eina_Bool
 node_error(const Eolian_Object *obj, const char *msg)
 {
-   _eolian_log_line(obj->file, obj->line, obj->column, "%s", msg);
+   eolian_state_log_obj(obj->unit->state, obj, "%s", msg);
    return EINA_FALSE;
 }
 
diff --git a/src/lib/eolian/database_validate.c 
b/src/lib/eolian/database_validate.c
index 3ca36da923..8dfc23c3de 100644
--- a/src/lib/eolian/database_validate.c
+++ b/src/lib/eolian/database_validate.c
@@ -38,8 +38,8 @@ _validate_docstr(const Eolian_Unit *src, Eina_Stringshare 
*str, const Eolian_Obj
             if (eolian_doc_token_ref_resolve(&tok, src, NULL, NULL) == 
EOLIAN_OBJECT_UNKNOWN)
               {
                  char *refn = eolian_doc_token_text_get(&tok);
-                 _eolian_log_line(info->file, info->line, info->column,
-                                  "failed validating reference '%s'", refn);
+                 eolian_state_log_obj(info->unit->state, info,
+                                      "failed validating reference '%s'", 
refn);
                  free(refn);
                  ret = EINA_FALSE;
                  break;
@@ -116,7 +116,7 @@ _ef_map_cb(const Eina_Hash *hash EINA_UNUSED, const void 
*key EINA_UNUSED,
 static Eina_Bool
 _obj_error(const Eolian_Object *o, const char *msg)
 {
-   _eolian_log_line(o->file, o->line, o->column, "%s", msg);
+   eolian_state_log_obj(o->unit->state, o, "%s", msg);
    return EINA_FALSE;
 }
 
@@ -467,7 +467,7 @@ _get_impl_class(const Eolian_Class *cl, const char *cln)
 }
 
 #define _eo_parser_log(_base, ...) \
-   _eolian_log_line((_base)->file, (_base)->line, (_base)->column, __VA_ARGS__)
+   eolian_state_log_obj((_base)->unit->state, (_base), __VA_ARGS__)
 
 static Eina_Bool
 _db_fill_implement(Eolian_Class *cl, Eolian_Implement *impl)
diff --git a/src/lib/eolian/eo_lexer.c b/src/lib/eolian/eo_lexer.c
index 56b1bb7fc9..9328676685 100644
--- a/src/lib/eolian/eo_lexer.c
+++ b/src/lib/eolian/eo_lexer.c
@@ -108,8 +108,13 @@ throw(Eo_Lexer *ls, const char *fmt, ...)
    for (i = 0; i < ls->column; ++i)
      eina_strbuf_append_char(buf, ' ');
    eina_strbuf_append(buf, "^\n");
-   _eolian_log_line(ls->source, ls->line_number, ls->column,
-                    "%s", eina_strbuf_string_get(buf));
+   Eolian_Object tmp;
+   memset(&tmp, 0, sizeof(Eolian_Object));
+   tmp.unit = ls->unit;
+   tmp.file = ls->source;
+   tmp.line = ls->line_number;
+   tmp.column = ls->column;
+   eolian_state_log_obj(ls->state, &tmp, "%s", eina_strbuf_string_get(buf));
    eina_strbuf_free(buf);
    longjmp(ls->err_jmp, EINA_TRUE);
 }
@@ -1020,9 +1025,9 @@ _node_free(Eolian_Object *obj)
    /* for when we have a proper node allocator and collect on shutdown */
    if (obj->refcount > 1)
      {
-        _eolian_log("node %p (type %d, name %s at %s:%d:%d)"
-                    " dangling ref (count: %d)", obj, obj->type, obj->name,
-                    obj->file, obj->line, obj->column, obj->refcount);
+        eolian_state_log(obj->state, "node %p (type %d, name %s at %s:%d:%d)"
+                         " dangling ref (count: %d)", obj, obj->type, 
obj->name,
+                         obj->file, obj->line, obj->column, obj->refcount);
      }
 #endif
    switch (obj->type)
@@ -1055,7 +1060,7 @@ eo_lexer_set_input(Eo_Lexer *ls, Eolian_State *state, 
const char *source)
    Eina_File *f = eina_file_open(source, EINA_FALSE);
    if (!f)
      {
-        _eolian_log("%s", strerror(errno));
+        eolian_state_log(ls->state, "%s", strerror(errno));
         longjmp(ls->err_jmp, EINA_TRUE);
      }
    ls->lookahead.token = -1;
@@ -1290,6 +1295,7 @@ eo_lexer_context_push(Eo_Lexer *ls)
    Lexer_Ctx *ctx = malloc(sizeof(Lexer_Ctx));
    if (!ctx)
      {
+        /* FIXME unrecoverable */
         _eolian_log("out of memory pushing context");
         longjmp(ls->err_jmp, EINA_TRUE);
      }
diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c
index 05200acd4a..13b9cd7a44 100644
--- a/src/lib/eolian/eo_parser.c
+++ b/src/lib/eolian/eo_parser.c
@@ -1071,10 +1071,16 @@ parse_accessor:
      {
         if (getenv("EOLIAN_PROPERTY_DOC_WARN"))
           {
-             _eolian_log_line(prop->base.file, line, col,
-                              "%s doc without property doc for '%s.%s'",
-                              is_get ? "getter" : "setter",
-                              ls->klass->base.name, prop->base.name);
+             Eolian_Object tmp;
+             memset(&tmp, 0, sizeof(Eolian_Object));
+             tmp.file = prop->base.file;
+             tmp.line = line;
+             tmp.column = col;
+             tmp.unit = ls->unit;
+             eolian_state_log_obj(ls->state, &tmp,
+                                  "%s doc without property doc for '%s.%s'",
+                                  is_get ? "getter" : "setter",
+                                  ls->klass->base.name, prop->base.name);
           }
      }
    if (is_get)
@@ -2210,7 +2216,8 @@ eo_parser_database_fill(Eolian_Unit *parent, const char 
*filename, Eina_Bool eot
    Eo_Lexer *ls = eo_lexer_new(parent->state, filename);
    if (!ls)
      {
-        _eolian_log("unable to create lexer for file '%s'", filename);
+        eolian_state_log(parent->state, "unable to create lexer for file '%s'",
+                         filename);
         goto error;
      }
 
@@ -2226,7 +2233,7 @@ eo_parser_database_fill(Eolian_Unit *parent, const char 
*filename, Eina_Bool eot
    Eolian_Class *cl;
    if (!(cl = ls->klass))
      {
-        _eolian_log("eolian: no class for file '%s'", filename);
+        eolian_state_log(ls->state, "no class for file '%s'", filename);
         goto error;
      }
    ls->klass = NULL;
diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c
index 86e66f116e..7bb0f4b420 100644
--- a/src/lib/eolian/eolian_database.c
+++ b/src/lib/eolian/eolian_database.c
@@ -580,7 +580,10 @@ _default_panic_cb(const Eolian_State *state EINA_UNUSED, 
const char *msg)
 static void
 _default_error_cb(const Eolian_Object *obj, const char *msg, void *data 
EINA_UNUSED)
 {
-   _eolian_log_line(obj->file, obj->line, obj->column, msg);
+   if (obj)
+     _eolian_log_line(obj->file, obj->line, obj->column, msg);
+   else
+     _eolian_log(msg);
 }
 
 EAPI Eolian_State *
@@ -649,7 +652,7 @@ EAPI Eolian_Panic_Cb
 eolian_state_panic_cb_set(Eolian_State *state, Eolian_Panic_Cb cb)
 {
    Eolian_Panic_Cb old_cb = state->panic;
-   state->panic = cb;
+   state->panic = cb ? cb : _default_panic_cb;
    return old_cb;
 }
 
@@ -657,7 +660,7 @@ EAPI Eolian_Error_Cb
 eolian_state_error_cb_set(Eolian_State *state, Eolian_Error_Cb cb)
 {
    Eolian_Error_Cb old_cb = state->error;
-   state->error = cb;
+   state->error = cb ? cb : _default_error_cb;
    return old_cb;
 }
 
@@ -754,7 +757,9 @@ _eolian_file_parse_nodep(Eolian_Unit *parent, const char 
*filepath)
    is_eo = eina_str_has_suffix(filepath, EO_SUFFIX);
    if (!is_eo && !eina_str_has_suffix(filepath, EOT_SUFFIX))
      {
-        _eolian_log("file '%s' doesn't have a correct extension", filepath);
+        eolian_state_log(parent->state,
+                         "file '%s' doesn't have a correct extension",
+                         filepath);
         return NULL;
      }
    if (!(eopath = eina_hash_find(is_eo ? parent->state->filenames_eo : 
parent->state->filenames_eot, filepath)))
diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h
index 8b58d65e54..f2fccf2f2f 100644
--- a/src/lib/eolian/eolian_database.h
+++ b/src/lib/eolian/eolian_database.h
@@ -110,6 +110,41 @@ eolian_object_add(Eolian_Object *obj, Eina_Stringshare 
*name, Eina_Hash *hash)
    eolian_object_add(&obj->base, name, tunit->memb); \
 }
 
+static inline void eolian_state_vlog(const Eolian_State *state, const 
Eolian_Object *obj, const char *fmt, va_list args) EINA_ARG_NONNULL(1, 3);
+static inline void eolian_state_log(const Eolian_State *state, const char 
*fmt, ...) EINA_ARG_NONNULL(1, 2) EINA_PRINTF(2, 3);
+static inline void eolian_state_log_obj(const Eolian_State *state, const 
Eolian_Object *obj, const char *fmt, ...) EINA_ARG_NONNULL(1, 2, 3) 
EINA_PRINTF(3, 4);
+
+
+static inline void
+eolian_state_vlog(const Eolian_State *state, const Eolian_Object *obj,
+                 const char *fmt, va_list args)
+{
+   Eina_Strbuf *sb = eina_strbuf_new();
+   eina_strbuf_append_vprintf(sb, fmt, args);
+   state->error(obj, eina_strbuf_string_get(sb), state->error_data);
+   eina_strbuf_free(sb);
+}
+
+static inline void
+eolian_state_log(const Eolian_State *state, const char *fmt, ...)
+{
+   va_list args;
+   va_start(args, fmt);
+   eolian_state_vlog(state, NULL, fmt, args);
+   va_end(args);
+}
+
+static inline void
+eolian_state_log_obj(const Eolian_State *state, const Eolian_Object *obj,
+                     const char *fmt, ...)
+{
+   va_list args;
+   va_start(args, fmt);
+   eolian_state_vlog(state, obj, fmt, args);
+   va_end(args);
+}
+
+
 struct _Eolian_Documentation
 {
    Eolian_Object base;
diff --git a/src/lib/eolian/eolian_priv.h b/src/lib/eolian/eolian_priv.h
index 58c0f229ae..036d922c32 100644
--- a/src/lib/eolian/eolian_priv.h
+++ b/src/lib/eolian/eolian_priv.h
@@ -5,32 +5,23 @@
 #include <stdio.h>
 #include <stdarg.h>
 
-static inline void _eolian_log_line(const char *file, int line, int column, 
const char *fmt, ...) EINA_ARG_NONNULL(1, 4) EINA_PRINTF(4, 5);
+static inline void _eolian_log_line(const char *file, int line, int column, 
const char *str) EINA_ARG_NONNULL(1, 4);
 static inline void _eolian_log(const char *fmt, ...) EINA_ARG_NONNULL(1) 
EINA_PRINTF(1, 2);
 
 static inline void
-_eolian_log_line(const char *file, int line, int column, const char *fmt, ...)
+_eolian_log_line(const char *file, int line, int column, const char *str)
 {
-   Eina_Strbuf *sb = eina_strbuf_new();
-   va_list args;
-
-   va_start(args, fmt);
-   eina_strbuf_append_vprintf(sb, fmt, args);
-   va_end(args);
-
    if (!eina_log_color_disable_get())
      {
         fprintf(stderr, EINA_COLOR_RED "eolian" EINA_COLOR_RESET ": "
                 EINA_COLOR_WHITE "%s" EINA_COLOR_RESET ":%d:%d: "
                 EINA_COLOR_ORANGE "%s\n" EINA_COLOR_RESET,
-                file, line, column, eina_strbuf_string_get(sb));
+                file, line, column, str);
      }
    else
      {
-        fprintf(stderr, "eolian: %s:%d:%d: %s\n", file, line, column,
-                eina_strbuf_string_get(sb));
+        fprintf(stderr, "eolian: %s:%d:%d: %s\n", file, line, column, str);
      }
-   eina_strbuf_free(sb);
 }
 
 static inline void

-- 


Reply via email to