cedric pushed a commit to branch master.

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

commit 36bc9aa187dc5d1ba257c4bf03060f0792e65866
Author: Cedric BAIL <ced...@osg.samsung.com>
Date:   Wed Jun 29 15:25:22 2016 -0700

    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 f55d772..7b142d7 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 499ff92..9b7fe5a 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 b33f047..beaeca6 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 b76ecb3..6c87ccd 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 fa9a655..c5c3339 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 2e52edc..cb5d53f 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 2a880da..d10dcdd 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));
 

-- 


Reply via email to