From 2071bbe8fb6efedef6cfa3ec1ad3df398c42727f Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Wed, 30 Aug 2017 15:45:20 +0200 Subject: [PATCH] eolian: clean up and fix function pointer generation Out/inout params are now correctly handled. --- src/bin/eolian/headers.c | 16 ++++++++-------- src/bin/eolian/headers.h | 1 + src/bin/eolian/types.c | 21 +++------------------ src/tests/eolian/data/function_types_ref.h | 2 +- 4 files changed, 13 insertions(+), 27 deletions(-) diff --git a/src/bin/eolian/headers.c b/src/bin/eolian/headers.c index a0c6879..90fc1ea 100644 --- a/src/bin/eolian/headers.c +++ b/src/bin/eolian/headers.c @@ -11,8 +11,8 @@ _get_add_star(Eolian_Function_Type ftype, Eolian_Parameter_Dir pdir) return ""; } -int -eo_gen_type_c_params_gen(Eina_Strbuf *buf, Eolian_Function_Parameter *pr, Eolian_Function_Type ftype, int *rpid) +static int +_gen_param(Eina_Strbuf *buf, Eolian_Function_Parameter *pr, Eolian_Function_Type ftype, int *rpid) { const Eolian_Type *prt = eolian_parameter_type_get(pr); const Eolian_Typedecl *ptd = eolian_type_typedecl_get(prt); @@ -38,8 +38,8 @@ eo_gen_type_c_params_gen(Eina_Strbuf *buf, Eolian_Function_Parameter *pr, Eolian return 1; } -static void -_gen_params(Eina_Iterator *itr, Eina_Strbuf *buf, Eina_Strbuf **flagbuf, int *nidx, Eolian_Function_Type ftype) +void +eo_gen_params(Eina_Iterator *itr, Eina_Strbuf *buf, Eina_Strbuf **flagbuf, int *nidx, Eolian_Function_Type ftype) { Eolian_Function_Parameter *pr; EINA_ITERATOR_FOREACH(itr, pr) @@ -47,9 +47,9 @@ _gen_params(Eina_Iterator *itr, Eina_Strbuf *buf, Eina_Strbuf **flagbuf, int *ni int rpid = 0; if (*nidx) eina_strbuf_append(buf, ", "); - *nidx += eo_gen_type_c_params_gen(buf, pr, ftype, &rpid); + *nidx += _gen_param(buf, pr, ftype, &rpid); - if (!eolian_parameter_is_nonull(pr)) + if (!eolian_parameter_is_nonull(pr) || !flagbuf) continue; if (!*flagbuf) @@ -139,7 +139,7 @@ _gen_func(const Eolian_Unit *src, const Eolian_Function *fid, eina_strbuf_append(buf, "Eo *obj"); } - _gen_params(eolian_property_keys_get(fid, ftype), buf, &flagbuf, &nidx, EOLIAN_PROPERTY); + eo_gen_params(eolian_property_keys_get(fid, ftype), buf, &flagbuf, &nidx, EOLIAN_PROPERTY); if (!var_as_ret) { @@ -148,7 +148,7 @@ _gen_func(const Eolian_Unit *src, const Eolian_Function *fid, itr = eolian_property_values_get(fid, ftype); else itr = eolian_function_parameters_get(fid); - _gen_params(itr, buf, &flagbuf, &nidx, ftype); + eo_gen_params(itr, buf, &flagbuf, &nidx, ftype); } if (flagbuf) diff --git a/src/bin/eolian/headers.h b/src/bin/eolian/headers.h index e45d851..56e4b4f 100644 --- a/src/bin/eolian/headers.h +++ b/src/bin/eolian/headers.h @@ -3,6 +3,7 @@ #include "main.h" +void eo_gen_params(Eina_Iterator *itr, Eina_Strbuf *buf, Eina_Strbuf **flagbuf, int *nidx, Eolian_Function_Type ftype); void eo_gen_header_gen(const Eolian_Unit *src, const Eolian_Class *cl, Eina_Strbuf *buf, Eina_Bool legacy); #endif diff --git a/src/bin/eolian/types.c b/src/bin/eolian/types.c index c856d7a..ec06c81 100644 --- a/src/bin/eolian/types.c +++ b/src/bin/eolian/types.c @@ -1,4 +1,5 @@ #include "main.h" +#include "headers.h" #include "docs.h" static Eina_Strbuf * @@ -157,24 +158,8 @@ _type_generate(const Eolian_Unit *src, const Eolian_Typedecl *tp, /* Parameters */ eina_strbuf_append(buf, "(void *data"); - Eina_Iterator *params = eolian_function_parameters_get(fid); - const Eolian_Function_Parameter *param = NULL; - EINA_ITERATOR_FOREACH(params, param) - { - const Eolian_Typedecl *ptd = eolian_type_typedecl_get(eolian_parameter_type_get(param)); - Eina_Stringshare *pn = eolian_parameter_name_get(param); - Eina_Stringshare *pt = eolian_type_c_type_get(eolian_parameter_type_get(param), EOLIAN_C_TYPE_PARAM); - - if (!pn) - pn = ""; // FIXME add some kind of param1/param2 control for null? - - if (ptd && eolian_typedecl_type_get(ptd) == EOLIAN_TYPEDECL_FUNCTION_POINTER) - eina_strbuf_append_printf(buf, ", void *%s_data, %s %s, Eina_Free_Cb %s_free_cb", - pn, pt, pn, pn); - else - eina_strbuf_append_printf(buf, ", %s %s", pt, pn); - - } + int nidx = 1; + eo_gen_params(eolian_function_parameters_get(fid), buf, NULL, &nidx, EOLIAN_FUNCTION_POINTER); eina_strbuf_append(buf, ")"); break; diff --git a/src/tests/eolian/data/function_types_ref.h b/src/tests/eolian/data/function_types_ref.h index 2f534c7..fe7c57d 100644 --- a/src/tests/eolian/data/function_types_ref.h +++ b/src/tests/eolian/data/function_types_ref.h @@ -8,7 +8,7 @@ typedef void (*VoidFunc)(void *data); typedef const char * (*SimpleFunc)(void *data, int a, double b); -typedef double (*ComplexFunc)(void *data, const char * c, const char * d); +typedef double (*ComplexFunc)(void *data, const char *c, const char **d); typedef void (*FuncAsArgFunc)(void *data, void *cb_data, VoidFunc cb, Eina_Free_Cb cb_free_cb, void *another_cb_data, SimpleFunc another_cb, Eina_Free_Cb another_cb_free_cb); -- 2.7.4