q66 pushed a commit to branch master.

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

commit f796a21d72c47d7661349f14e6533299f750654a
Author: Daniel Kolesa <d.kol...@samsung.com>
Date:   Thu Apr 26 16:07:28 2018 +0200

    eolian: add event redefinition checks
    
    As EFL fails build with this enabled, hide these behind the
    EOLIAN_EVENT_REDEF_WARN environment variable for the time being.
---
 src/lib/eolian/database_validate.c | 32 ++++++++++++++++++++++++++------
 1 file changed, 26 insertions(+), 6 deletions(-)

diff --git a/src/lib/eolian/database_validate.c 
b/src/lib/eolian/database_validate.c
index 80674f0565..343155ea16 100644
--- a/src/lib/eolian/database_validate.c
+++ b/src/lib/eolian/database_validate.c
@@ -11,6 +11,7 @@
 typedef struct _Validate_State
 {
    Eina_Bool warned;
+   Eina_Bool event_redef;
 } Validate_State;
 
 static Eina_Bool
@@ -449,8 +450,20 @@ _validate_part(Eolian_Part *part, Eina_Hash *nhash)
 }
 
 static Eina_Bool
-_validate_event(Validate_State *vals, Eolian_Event *event)
+_validate_event(Validate_State *vals, Eolian_Event *event, Eina_Hash *ehash)
 {
+   const Eolian_Event *oev = eina_hash_find(ehash, event->base.name);
+   if (EINA_UNLIKELY(!!oev) && vals->event_redef)
+     {
+        char buf[512];
+        snprintf(buf, sizeof(buf),
+                 "event '%s' redefined (originally at %s:%d:%d)",
+                 oev->base.name, oev->base.file,
+                 oev->base.line, oev->base.column);
+        _obj_error(&event->base, buf);
+        vals->warned = EINA_TRUE;
+     }
+
    if (event->base.validated)
      return EINA_TRUE;
 
@@ -460,6 +473,9 @@ _validate_event(Validate_State *vals, Eolian_Event *event)
    if (!_validate_doc(event->doc))
      return EINA_FALSE;
 
+   if (!oev)
+     eina_hash_add(ehash, event->base.name, event);
+
    return _validate(&event->base);
 }
 
@@ -753,7 +769,7 @@ _validate_implement(Eolian_Implement *impl)
 
 static Eina_Bool
 _validate_class(Validate_State *vals, Eolian_Class *cl,
-                Eina_Hash *nhash, Eina_Hash *chash)
+                Eina_Hash *nhash, Eina_Hash *ehash, Eina_Hash *chash)
 {
    Eina_List *l;
    Eolian_Function *func;
@@ -799,7 +815,7 @@ _validate_class(Validate_State *vals, Eolian_Class *cl,
            default:
              break;
           }
-        if (!_validate_class(vals, icl, nhash, chash))
+        if (!_validate_class(vals, icl, nhash, ehash, chash))
           return EINA_FALSE;
      }
 
@@ -812,7 +828,7 @@ _validate_class(Validate_State *vals, Eolian_Class *cl,
        return EINA_FALSE;
 
    EINA_LIST_FOREACH(cl->events, l, event)
-     if (!_validate_event(vals, event))
+     if (!_validate_event(vals, event, ehash))
        return EINA_FALSE;
 
    EINA_LIST_FOREACH(cl->parts, l, part)
@@ -877,7 +893,7 @@ database_validate(const Eolian_Unit *src)
 {
    Eolian_Class *cl;
 
-   Validate_State vals = { EINA_FALSE };
+   Validate_State vals = { EINA_FALSE, !!getenv("EOLIAN_EVENT_REDEF_WARN") };
 
    /* do an initial pass to refill inherits */
    Eina_Iterator *iter = eolian_unit_classes_get(src);
@@ -895,20 +911,24 @@ database_validate(const Eolian_Unit *src)
 
    iter = eolian_unit_classes_get(src);
    Eina_Hash *nhash = eina_hash_stringshared_new(NULL);
+   Eina_Hash *ehash = eina_hash_stringshared_new(NULL);
    Eina_Hash *chash = eina_hash_stringshared_new(NULL);
    EINA_ITERATOR_FOREACH(iter, cl)
      {
         eina_hash_free_buckets(nhash);
+        eina_hash_free_buckets(ehash);
         eina_hash_free_buckets(chash);
-        if (!_validate_class(&vals, cl, nhash, chash))
+        if (!_validate_class(&vals, cl, nhash, ehash, chash))
           {
              eina_iterator_free(iter);
              eina_hash_free(nhash);
+             eina_hash_free(nhash);
              eina_hash_free(chash);
              return EINA_FALSE;
           }
      }
    eina_hash_free(chash);
+   eina_hash_free(ehash);
    eina_hash_free(nhash);
    eina_iterator_free(iter);
 

-- 


Reply via email to