From 36bc9aa187dc5d1ba257c4bf03060f0792e65866 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Wed, 29 Jun 2016 15:25:22 -0700 Subject: [PATCH] eolian: add a builtin to handle a free callback. --- src/lib/eolian/database_type.c | 21 +++++++++++++++------ src/lib/eolian/eo_lexer.c | 1 + src/lib/eolian/eo_lexer.h | 1 + src/tests/eolian/data/typedef.eo | 2 ++ src/tests/eolian/data/typedef_ref.c | 2 ++ src/tests/eolian/data/typedef_ref_stub.c | 2 ++ src/tests/eolian/eolian_parsing.c | 3 ++- 7 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/lib/eolian/database_type.c b/src/lib/eolian/database_type.c index f55d772fd1..7b142d71bf 100644 --- a/src/lib/eolian/database_type.c +++ b/src/lib/eolian/database_type.c @@ -198,13 +198,22 @@ _atype_to_str(const Eolian_Typedecl *tp, Eina_Strbuf *buf) { eina_strbuf_append(buf, "typedef "); - if (tp->base_type->type == EOLIAN_TYPE_REGULAR && - !strcmp(tp->base_type->name, "__builtin_event_cb")) + if (tp->base_type->type == EOLIAN_TYPE_REGULAR) { - eina_strbuf_append(buf, "void (*"); - _append_name(tp, buf); - eina_strbuf_append(buf, ")(void *data, const Efl_Event *event)"); - return; + if (!strcmp(tp->base_type->name, "__builtin_event_cb")) + { + eina_strbuf_append(buf, "void (*"); + _append_name(tp, buf); + eina_strbuf_append(buf, ")(void *data, const Efl_Event *event)"); + return; + } + if (!strcmp(tp->base_type->name, "__builtin_free_cb")) + { + eina_strbuf_append(buf, "void (*"); + _append_name(tp, buf); + eina_strbuf_append(buf, ")(void *data)"); + return; + } } Eina_Strbuf *fulln = eina_strbuf_new(); diff --git a/src/lib/eolian/eo_lexer.c b/src/lib/eolian/eo_lexer.c index 499ff92949..9b7fe5a388 100644 --- a/src/lib/eolian/eo_lexer.c +++ b/src/lib/eolian/eo_lexer.c @@ -81,6 +81,7 @@ static const char * const ctypes[] = "void *", "Efl_Event_Cb", + "Eina_Free_Cb", }; #undef KW diff --git a/src/lib/eolian/eo_lexer.h b/src/lib/eolian/eo_lexer.h index b33f047396..beaeca65f6 100644 --- a/src/lib/eolian/eo_lexer.h +++ b/src/lib/eolian/eo_lexer.h @@ -58,6 +58,7 @@ enum Tokens \ KW(void_ptr), \ KW(__builtin_event_cb), \ + KW(__builtin_free_cb), \ KW(__undefined_type), \ \ KW(true), KW(false), KW(null) diff --git a/src/tests/eolian/data/typedef.eo b/src/tests/eolian/data/typedef.eo index b76ecb3bde..6c87ccdf31 100644 --- a/src/tests/eolian/data/typedef.eo +++ b/src/tests/eolian/data/typedef.eo @@ -10,6 +10,8 @@ type Undef: __undefined_type; /* not generated */ type Event: __builtin_event_cb; /* specially generated */ +type Free: __builtin_free_cb; /* specially generated */ + enum Enum.Bar { legacy: bar; diff --git a/src/tests/eolian/data/typedef_ref.c b/src/tests/eolian/data/typedef_ref.c index fa9a655eb7..c5c3339072 100644 --- a/src/tests/eolian/data/typedef_ref.c +++ b/src/tests/eolian/data/typedef_ref.c @@ -21,6 +21,8 @@ typedef Evas_Coord2 Evas_Coord3; typedef void (*Event)(void *data, const Efl_Event *event); +typedef void (*Free)(void *data); + typedef enum { BAR_FIRST_ITEM = 0, diff --git a/src/tests/eolian/data/typedef_ref_stub.c b/src/tests/eolian/data/typedef_ref_stub.c index 2e52edc8e5..cb5d53f143 100644 --- a/src/tests/eolian/data/typedef_ref_stub.c +++ b/src/tests/eolian/data/typedef_ref_stub.c @@ -13,5 +13,7 @@ typedef Evas_Coord2 Evas_Coord3; typedef void (*Event)(void *data, const Efl_Event *event); +typedef void (*Free)(void *data); + #endif diff --git a/src/tests/eolian/eolian_parsing.c b/src/tests/eolian/eolian_parsing.c index 2a880dac02..d10dcdd087 100644 --- a/src/tests/eolian/eolian_parsing.c +++ b/src/tests/eolian/eolian_parsing.c @@ -410,7 +410,8 @@ START_TEST(eolian_typedef) fail_if(!eina_iterator_next(iter, (void**)&tdl)); /* not generated undefined type, skip */ fail_if(!eina_iterator_next(iter, (void**)&tdl)); - /* event type, tested by generation tests */ + /* event type and free cb, tested by generation tests */ + fail_if(!eina_iterator_next(iter, (void**)&tdl)); fail_if(!eina_iterator_next(iter, (void**)&tdl)); fail_if(eina_iterator_next(iter, (void**)&tdl));