cedric pushed a commit to branch master.

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

commit 842a020e1f9717914685e0f9501d8652fe76d5e1
Author: Cedric BAIL <ced...@osg.samsung.com>
Date:   Wed Apr 20 15:53:16 2016 -0700

    eolian: add support for restartable event.
---
 src/bin/eolian/eo_generator.c       |  6 ++++--
 src/lib/eolian/Eolian.h             | 14 ++++++++++++++
 src/lib/eolian/database_event_api.c |  7 +++++++
 src/lib/eolian/eo_lexer.h           |  2 +-
 src/lib/eolian/eo_parser.c          |  7 ++++++-
 src/lib/eolian/eolian_database.h    |  1 +
 6 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/src/bin/eolian/eo_generator.c b/src/bin/eolian/eo_generator.c
index d2b7677..0d80cc2 100644
--- a/src/bin/eolian/eo_generator.c
+++ b/src/bin/eolian/eo_generator.c
@@ -672,8 +672,10 @@ eo_source_beginning_generate(const Eolian_Class *class, 
Eina_Strbuf *buf)
         Eina_Stringshare *evname = eolian_event_c_name_get(event);
 
         eina_strbuf_append_printf(tmpbuf,
-                                  "EOAPI const Eo_Event_Description _%s =\n   
EO_EVENT_DESCRIPTION%s(\"%s\");\n",
-                                  evname, eolian_event_is_hot(event) ? "_HOT" 
: "",
+                                  "EOAPI const Eo_Event_Description _%s =\n   
EO_EVENT_DESCRIPTION%s%s(\"%s\");\n",
+                                  evname,
+                                  eolian_event_is_hot(event) ? "_HOT" : "",
+                                  eolian_event_is_restart(event) ? "_RESTART" 
: "",
                                   eolian_event_name_get(event));
         eina_stringshare_del(evname);
      }
diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h
index e2294a2..c8a51fa 100644
--- a/src/lib/eolian/Eolian.h
+++ b/src/lib/eolian/Eolian.h
@@ -1207,6 +1207,20 @@ EAPI Eina_Bool eolian_event_is_beta(const Eolian_Event 
*event);
 EAPI Eina_Bool eolian_event_is_hot(const Eolian_Event *event);
 
 /*
+ * @brief Get whether an event is a restartable event.
+ *
+ * @param[in] event the event handle
+ * @return EINA_TRUE and EINA_FALSE respectively
+ *
+ * In case of nested call, restartable event will start processing from where
+ * they where in the parent callback call skipping all the previously executed
+ * callback. Especially useful for nested main loop use case.
+ *
+ * @ingroup Eolian
+ */
+EAPI Eina_Bool eolian_event_is_restart(const Eolian_Event *event);
+
+/*
  * @brief Returns the C name of an event
  *
  * @param[in] event the event handle
diff --git a/src/lib/eolian/database_event_api.c 
b/src/lib/eolian/database_event_api.c
index 3901cd1..1ef52ec 100644
--- a/src/lib/eolian/database_event_api.c
+++ b/src/lib/eolian/database_event_api.c
@@ -47,6 +47,13 @@ eolian_event_is_hot(const Eolian_Event *event)
    return event->is_hot;
 }
 
+EAPI Eina_Bool
+eolian_event_is_restart(const Eolian_Event *event)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(event, EINA_FALSE);
+   return event->is_restart;
+}
+
 EAPI Eina_Stringshare *
 eolian_event_c_name_get(const Eolian_Event *event)
 {
diff --git a/src/lib/eolian/eo_lexer.h b/src/lib/eolian/eo_lexer.h
index c43e3df..c00f7f3 100644
--- a/src/lib/eolian/eo_lexer.h
+++ b/src/lib/eolian/eo_lexer.h
@@ -30,7 +30,7 @@ enum Tokens
     KW(legacy_prefix), KW(methods), KW(mixin), KW(own), KW(params), \
     KW(set), KW(type), KW(values), KW(var), KWAT(auto), KWAT(beta), \
     KWAT(c_only), KWAT(class), KWAT(const), KWAT(empty), KWAT(extern), \
-    KWAT(free), KWAT(hot), KWAT(in), KWAT(inout), KWAT(nonull), 
KWAT(nullable), \
+    KWAT(free), KWAT(hot), KWAT(restart), KWAT(in), KWAT(inout), KWAT(nonull), 
KWAT(nullable), \
     KWAT(optional), KWAT(out), KWAT(private), KWAT(property), \
     KWAT(protected), KWAT(virtual), KWAT(warn_unused), \
     \
diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c
index 9b8ec2a..07b0864 100644
--- a/src/lib/eolian/eo_parser.c
+++ b/src/lib/eolian/eo_parser.c
@@ -1547,7 +1547,7 @@ parse_event(Eo_Lexer *ls)
    ev->name = eina_stringshare_add(eina_strbuf_string_get(buf));
    pop_strbuf(ls);
    Eina_Bool has_scope = EINA_FALSE, has_beta = EINA_FALSE,
-             has_hot   = EINA_FALSE;
+             has_hot   = EINA_FALSE, has_restart = EINA_FALSE;
    for (;;) switch (ls->t.kw)
      {
       case KW_at_private:
@@ -1568,6 +1568,11 @@ parse_event(Eo_Lexer *ls)
         ev->is_hot = EINA_TRUE;
         eo_lexer_get(ls);
         break;
+      case KW_at_restart:
+        CASE_LOCK(ls, restart, "restart qualifier");
+        ev->is_restart = EINA_TRUE;
+        eo_lexer_get(ls);
+        break;
       default:
         goto end;
      }
diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h
index 20cd91c..d57ea30 100644
--- a/src/lib/eolian/eolian_database.h
+++ b/src/lib/eolian/eolian_database.h
@@ -222,6 +222,7 @@ struct _Eolian_Event
    int scope;
    Eina_Bool is_beta :1;
    Eina_Bool is_hot  :1;
+   Eina_Bool is_restart :1;
 };
 
 struct _Eolian_Struct_Type_Field

-- 


Reply via email to