q66 pushed a commit to branch master.

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

commit c95350016dd04ecd1bd514a73af862f36ae7f39e
Author: Daniel Kolesa <d.kol...@osg.samsung.com>
Date:   Tue Feb 2 17:55:01 2016 +0000

    eolian: add parsing and generation of hot events
    
    Unfreezable events can now be marked @hot.
    
    @feature
---
 src/bin/eolian/eo_generator.c       |  5 +++--
 src/bindings/luajit/eolian.lua      | 10 ++++++++++
 src/lib/eolian/Eolian.h             | 10 ++++++++++
 src/lib/eolian/database_event_api.c |  7 +++++++
 src/lib/eolian/eo_lexer.h           |  2 +-
 src/lib/eolian/eo_parser.c          | 31 +++++++++++++++++++++----------
 src/lib/eolian/eolian_database.h    |  1 +
 src/tests/eolian/data/events.eo     |  1 +
 src/tests/eolian/eolian_parsing.c   |  9 +++++++++
 9 files changed, 63 insertions(+), 13 deletions(-)

diff --git a/src/bin/eolian/eo_generator.c b/src/bin/eolian/eo_generator.c
index b761284..25e8372 100644
--- a/src/bin/eolian/eo_generator.c
+++ b/src/bin/eolian/eo_generator.c
@@ -621,8 +621,9 @@ 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\");\n",
-                                  evname, eolian_event_name_get(event));
+                                  "EOAPI const Eo_Event_Description _%s =\n   
EO_EVENT_DESCRIPTION%s(\"%s\");\n",
+                                  evname, eolian_event_is_hot(event) ? "_HOT" 
: "",
+                                  eolian_event_name_get(event));
         eina_stringshare_del(evname);
      }
    eina_iterator_free(itr);
diff --git a/src/bindings/luajit/eolian.lua b/src/bindings/luajit/eolian.lua
index 96be587..a517631 100644
--- a/src/bindings/luajit/eolian.lua
+++ b/src/bindings/luajit/eolian.lua
@@ -252,6 +252,8 @@ ffi.cdef [[
     const Eolian_Type *eolian_event_type_get(const Eolian_Event *event);
     const Eolian_Documentation *eolian_event_documentation_get(const 
Eolian_Event *event);
     Eolian_Object_Scope eolian_event_scope_get(const Eolian_Event *event);
+    Eina_Bool eolian_event_is_beta(const Eolian_Event *event);
+    Eina_Bool eolian_event_is_hot(const Eolian_Event *event);
     const char *eolian_event_c_name_get(const Eolian_Event *event);
     Eina_Bool eolian_class_ctor_enable_get(const Eolian_Class *klass);
     Eina_Bool eolian_class_dtor_enable_get(const Eolian_Class *klass);
@@ -858,6 +860,14 @@ ffi.metatype("Eolian_Event", {
             local v = eolian.eolian_event_c_name_get(self)
             if v == nil then return nil end
             return ffi_stringshare(v)
+        end,
+
+        is_beta = function(self)
+            return eolian_event_is_beta(self) ~= 0
+        end,
+
+        is_hot = function(self)
+            return eolian_event_is_hot(self) ~= 0
         end
     }
 })
diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h
index 44b4e9a..a659e1f 100644
--- a/src/lib/eolian/Eolian.h
+++ b/src/lib/eolian/Eolian.h
@@ -1185,6 +1185,16 @@ EAPI Eolian_Object_Scope eolian_event_scope_get(const 
Eolian_Event *event);
 EAPI Eina_Bool eolian_event_is_beta(const Eolian_Event *event);
 
 /*
+ * @brief Get whether an event is hot (unfreezable).
+ *
+ * @param[in] event the event handle
+ * @return EINA_TRUE and EINA_FALSE respectively
+ *
+ * @ingroup Eolian
+ */
+EAPI Eina_Bool eolian_event_is_hot(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 58e906e..3901cd1 100644
--- a/src/lib/eolian/database_event_api.c
+++ b/src/lib/eolian/database_event_api.c
@@ -40,6 +40,13 @@ eolian_event_is_beta(const Eolian_Event *event)
    return event->is_beta;
 }
 
+EAPI Eina_Bool
+eolian_event_is_hot(const Eolian_Event *event)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(event, EINA_FALSE);
+   return event->is_hot;
+}
+
 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 9508765..9908e26 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(in), KWAT(inout), KWAT(nonull), KWAT(nullable), \
+    KWAT(free), KWAT(hot), 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 43fb30f..10fdfd8 100644
--- a/src/lib/eolian/eo_parser.c
+++ b/src/lib/eolian/eo_parser.c
@@ -1532,21 +1532,32 @@ parse_event(Eo_Lexer *ls)
      }
    ev->name = eina_stringshare_add(eina_strbuf_string_get(buf));
    pop_strbuf(ls);
-   if (ls->t.kw == KW_at_private)
-     {
-        ev->scope = EOLIAN_SCOPE_PRIVATE;
-        eo_lexer_get(ls);
-     }
-   else if (ls->t.kw == KW_at_protected)
+   Eina_Bool has_scope = EINA_FALSE, has_beta = EINA_FALSE,
+             has_hot   = EINA_FALSE;
+   for (;;) switch (ls->t.kw)
      {
-        ev->scope = EOLIAN_SCOPE_PROTECTED;
+      case KW_at_private:
+      case KW_at_protected:
+        CASE_LOCK(ls, scope, "scope qualifier")
+        ev->scope = (ls->t.kw == KW_at_private)
+                     ? EOLIAN_SCOPE_PRIVATE
+                     : EOLIAN_SCOPE_PROTECTED;
         eo_lexer_get(ls);
-     }
-   if (ls->t.kw == KW_at_beta)
-     {
+        break;
+      case KW_at_beta:
+        CASE_LOCK(ls, beta, "beta qualifier")
         ev->is_beta = EINA_TRUE;
         eo_lexer_get(ls);
+        break;
+      case KW_at_hot:
+        CASE_LOCK(ls, hot, "hot qualifier");
+        ev->is_hot = EINA_TRUE;
+        eo_lexer_get(ls);
+        break;
+      default:
+        goto end;
      }
+end:
    if (ls->t.token == ':')
      {
         eo_lexer_get(ls);
diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h
index 73435a5..6a51c62 100644
--- a/src/lib/eolian/eolian_database.h
+++ b/src/lib/eolian/eolian_database.h
@@ -210,6 +210,7 @@ struct _Eolian_Event
    Eolian_Class *klass;
    int scope;
    Eina_Bool is_beta :1;
+   Eina_Bool is_hot  :1;
 };
 
 struct _Eolian_Struct_Type_Field
diff --git a/src/tests/eolian/data/events.eo b/src/tests/eolian/data/events.eo
index e1f68d5..4b0e1f8 100644
--- a/src/tests/eolian/data/events.eo
+++ b/src/tests/eolian/data/events.eo
@@ -2,5 +2,6 @@ class Events {
    events {
       clicked @beta; [[Comment for clicked]]
       clicked,double: Evas_Event_Clicked_Double_Info; /* No comment */
+      hot @hot;
    }
 }
diff --git a/src/tests/eolian/eolian_parsing.c 
b/src/tests/eolian/eolian_parsing.c
index c104a61..5f66e2d 100644
--- a/src/tests/eolian/eolian_parsing.c
+++ b/src/tests/eolian/eolian_parsing.c
@@ -118,6 +118,7 @@ START_TEST(eolian_events)
    fail_if(eolian_event_type_get(ev));
    fail_if(strcmp(name, "clicked"));
    fail_if(!eolian_event_is_beta(ev));
+   fail_if(eolian_event_is_hot(ev));
    /* Clicked,double */
    fail_if(!(eina_iterator_next(iter, (void**)&ev)));
    fail_if(!(name = eolian_event_name_get(ev)));
@@ -126,6 +127,14 @@ START_TEST(eolian_events)
    type_name = eolian_type_name_get(type);
    fail_if(strcmp(type_name, "Evas_Event_Clicked_Double_Info"));
    fail_if(eolian_event_is_beta(ev));
+   fail_if(eolian_event_is_hot(ev));
+   /* Hot */
+   fail_if(!(eina_iterator_next(iter, (void**)&ev)));
+   fail_if(!(name = eolian_event_name_get(ev)));
+   fail_if(eolian_event_type_get(ev));
+   fail_if(strcmp(name, "hot"));
+   fail_if(eolian_event_is_beta(ev));
+   fail_if(!eolian_event_is_hot(ev));
    fail_if(eina_iterator_next(iter, &dummy));
    eina_iterator_free(iter);
    /* Check eolian_class_event_get_by_name */

-- 


Reply via email to