From 4d7e908e49223f530026b5ef904a5e63d97603b7 Mon Sep 17 00:00:00 2001 From: Daniel Zaoui Date: Tue, 18 Feb 2014 15:16:51 +0200 Subject: [PATCH] Eolian/Lexer: support class::constructor/destructor --- src/lib/eolian/Eolian.h | 4 ++++ src/lib/eolian/eo_lexer.c | 18 ++++++++++++++---- src/lib/eolian/eo_lexer.rl | 10 ++++++++++ src/lib/eolian/eolian_database.c | 34 ++++++++++++++++++++++++++++++++++ src/lib/eolian/eolian_database.h | 6 ++++++ 5 files changed, 68 insertions(+), 4 deletions(-) diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h index e48ed29..ac38c5d 100644 --- a/src/lib/eolian/Eolian.h +++ b/src/lib/eolian/Eolian.h @@ -441,6 +441,10 @@ EAPI const Eina_List *eolian_class_events_list_get(const char *class_name); */ EAPI Eina_Bool eolian_class_event_information_get(Eolian_Event event, const char **event_name, const char **event_desc); +EAPI Eina_Bool eolian_class_ctor_enable_get(const char *class_name); + +EAPI Eina_Bool eolian_class_dtor_enable_get(const char *class_name); + #endif #ifdef __cplusplus diff --git a/src/lib/eolian/eo_lexer.c b/src/lib/eolian/eo_lexer.c index 22d20b5..65b28eb 100644 --- a/src/lib/eolian/eo_lexer.c +++ b/src/lib/eolian/eo_lexer.c @@ -1371,9 +1371,9 @@ _eof_trans: { toknz->tmp.param = _eo_tokenizer_param_get(toknz, ( toknz->p)); if (toknz->tmp.params) - *(toknz->tmp.params) = eina_list_append(*(toknz->tmp.params), toknz->tmp.param); + *(toknz->tmp.params) = eina_list_append(*(toknz->tmp.params), toknz->tmp.param); else - ABORT(toknz, "got a param but there is no property nor method waiting for it"); + ABORT(toknz, "got a param but there is no property nor method waiting for it"); INF(" %s : %s", toknz->tmp.param->name, toknz->tmp.param->type); } break; @@ -1687,7 +1687,7 @@ _eof_trans: toknz->tmp.param = NULL; toknz->current_nesting--; if (toknz->tmp.prop) - { toknz->cs = 308; goto _again;} + { toknz->cs = 308; goto _again;} else if (toknz->tmp.meth) { toknz->cs = 321; goto _again;} else @@ -1728,7 +1728,7 @@ _eof_trans: toknz->tmp.param = NULL; toknz->current_nesting--; if (toknz->tmp.prop) - { toknz->cs = 308; goto _again;} + { toknz->cs = 308; goto _again;} else if (toknz->tmp.meth) { toknz->cs = 321; goto _again;} else @@ -2809,6 +2809,16 @@ eo_tokenizer_database_fill(const char *filename) database_class_function_add(kls->name, foo_id); continue; } + if (!strcmp(class, "class::constructor")) + { + database_class_ctor_enable_set(kls->name, EINA_TRUE); + continue; + } + if (!strcmp(class, "class::destructor")) + { + database_class_dtor_enable_set(kls->name, EINA_TRUE); + continue; + } char *func = strstr(class, "::"); if (func) *func = '\0'; func += 2; diff --git a/src/lib/eolian/eo_lexer.rl b/src/lib/eolian/eo_lexer.rl index 5dd6053..ef6237a 100644 --- a/src/lib/eolian/eo_lexer.rl +++ b/src/lib/eolian/eo_lexer.rl @@ -1215,6 +1215,16 @@ eo_tokenizer_database_fill(const char *filename) database_class_function_add(kls->name, foo_id); continue; } + if (!strcmp(class, "class::constructor")) + { + database_class_ctor_enable_set(kls->name, EINA_TRUE); + continue; + } + if (!strcmp(class, "class::destructor")) + { + database_class_dtor_enable_set(kls->name, EINA_TRUE); + continue; + } char *func = strstr(class, "::"); if (func) *func = '\0'; func += 2; diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c index 8c94526..69a4ad4 100644 --- a/src/lib/eolian/eolian_database.c +++ b/src/lib/eolian/eolian_database.c @@ -20,6 +20,8 @@ typedef struct Eina_List *destructors; /* List destructor_name -> _Function_Id */ Eina_List *implements; /* List implements name -> _Implement_Desc */ Eina_List *events; /* List event_name -> _Event_Desc */ + Eina_Bool class_ctor_enable:1; + Eina_Bool class_dtor_enable:1; } Class_desc; typedef struct @@ -801,6 +803,38 @@ eolian_class_event_information_get(Eolian_Event event, const char **event_name, return EINA_TRUE; } +Eina_Bool +database_class_ctor_enable_set(const char *class_name, Eina_Bool enable) +{ + Class_desc *desc = _class_get(class_name); + if (!desc) return EINA_FALSE; + desc->class_ctor_enable = enable; + return EINA_TRUE; +} + +Eina_Bool +database_class_dtor_enable_set(const char *class_name, Eina_Bool enable) +{ + Class_desc *desc = _class_get(class_name); + if (!desc) return EINA_FALSE; + desc->class_dtor_enable = enable; + return EINA_TRUE; +} + +Eina_Bool +eolian_class_ctor_enable_get(const char *class_name) +{ + Class_desc *desc = _class_get(class_name); + return desc?desc->class_ctor_enable:EINA_FALSE; +} + +Eina_Bool +eolian_class_dtor_enable_get(const char *class_name) +{ + Class_desc *desc = _class_get(class_name); + return desc?desc->class_dtor_enable:EINA_FALSE; +} + static void _implements_print(Eolian_Implement impl, int nb_spaces) { diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index 39d64d3..79a3412 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -76,6 +76,12 @@ database_implement_legacy_return_add(Eolian_Implement_Legacy leg, Eina_Stringsha Eina_Bool database_class_implement_add(const char *class_name, Eolian_Implement impl_id); +Eina_Bool +database_class_ctor_enable_set(const char *class_name, Eina_Bool enable); + +Eina_Bool +database_class_dtor_enable_set(const char *class_name, Eina_Bool enable); + Eolian_Event database_event_new(const char *event_name, const char *event_desc); -- 2.7.4