eolian: clean up and fix function pointer generation
authorDaniel Kolesa <d.kolesa@osg.samsung.com>
Wed, 30 Aug 2017 13:45:20 +0000 (15:45 +0200)
committerDaniel Kolesa <d.kolesa@osg.samsung.com>
Wed, 30 Aug 2017 13:45:20 +0000 (15:45 +0200)
Out/inout params are now correctly handled.

src/bin/eolian/headers.c
src/bin/eolian/headers.h
src/bin/eolian/types.c
src/tests/eolian/data/function_types_ref.h

index a0c6879..90fc1ea 100644 (file)
@@ -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)
index e45d851..56e4b4f 100644 (file)
@@ -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
index c856d7a..ec06c81 100644 (file)
@@ -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;
index 2f534c7..fe7c57d 100644 (file)
@@ -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);