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 */ --