From 842a020e1f9717914685e0f9501d8652fe76d5e1 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Wed, 20 Apr 2016 15:53:16 -0700 Subject: [PATCH] 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 -- 2.7.4