eolian: remove remaining global state (+ modify APIs accordingly)

This commit is contained in:
Daniel Kolesa 2017-12-15 17:00:36 +01:00
parent d624464ab4
commit 18e18ca74c
20 changed files with 170 additions and 160 deletions

View File

@ -377,7 +377,7 @@ eo_gen_docs_event_gen(const Eolian_Unit *src, const Eolian_Event *ev,
if (rt) if (rt)
{ {
p = buf; p = buf;
Eina_Stringshare *rts = eolian_type_c_type_get(rt, EOLIAN_C_TYPE_DEFAULT); Eina_Stringshare *rts = eolian_type_c_type_get(src, rt, EOLIAN_C_TYPE_DEFAULT);
snprintf(buf, sizeof(buf), "@return %s", rts); snprintf(buf, sizeof(buf), "@return %s", rts);
eina_stringshare_del(rts); eina_stringshare_del(rts);
} }

View File

@ -12,12 +12,13 @@ _get_add_star(Eolian_Function_Type ftype, Eolian_Parameter_Dir pdir)
} }
static int static int
_gen_param(Eina_Strbuf *buf, Eolian_Function_Parameter *pr, Eolian_Function_Type ftype, int *rpid) _gen_param(const Eolian_Unit *src, Eina_Strbuf *buf,
Eolian_Function_Parameter *pr, Eolian_Function_Type ftype, int *rpid)
{ {
const Eolian_Type *prt = eolian_parameter_type_get(pr); const Eolian_Type *prt = eolian_parameter_type_get(pr);
const Eolian_Typedecl *ptd = eolian_type_typedecl_get(prt); const Eolian_Typedecl *ptd = eolian_type_typedecl_get(src, prt);
const char *prn = eolian_parameter_name_get(pr); const char *prn = eolian_parameter_name_get(pr);
Eina_Stringshare *prtn = eolian_type_c_type_get(prt, EOLIAN_C_TYPE_PARAM); Eina_Stringshare *prtn = eolian_type_c_type_get(src, prt, EOLIAN_C_TYPE_PARAM);
if (ptd && (eolian_typedecl_type_get(ptd) == EOLIAN_TYPEDECL_FUNCTION_POINTER)) if (ptd && (eolian_typedecl_type_get(ptd) == EOLIAN_TYPEDECL_FUNCTION_POINTER))
{ {
@ -39,7 +40,8 @@ _gen_param(Eina_Strbuf *buf, Eolian_Function_Parameter *pr, Eolian_Function_Type
} }
void void
eo_gen_params(Eina_Iterator *itr, Eina_Strbuf *buf, Eina_Strbuf **flagbuf, int *nidx, Eolian_Function_Type ftype) eo_gen_params(const Eolian_Unit *src, Eina_Iterator *itr, Eina_Strbuf *buf,
Eina_Strbuf **flagbuf, int *nidx, Eolian_Function_Type ftype)
{ {
Eolian_Function_Parameter *pr; Eolian_Function_Parameter *pr;
EINA_ITERATOR_FOREACH(itr, pr) EINA_ITERATOR_FOREACH(itr, pr)
@ -47,7 +49,7 @@ eo_gen_params(Eina_Iterator *itr, Eina_Strbuf *buf, Eina_Strbuf **flagbuf, int *
int rpid = 0; int rpid = 0;
if (*nidx) if (*nidx)
eina_strbuf_append(buf, ", "); eina_strbuf_append(buf, ", ");
*nidx += _gen_param(buf, pr, ftype, &rpid); *nidx += _gen_param(src, buf, pr, ftype, &rpid);
if (!eolian_parameter_is_nonull(pr) || !flagbuf) if (!eolian_parameter_is_nonull(pr) || !flagbuf)
continue; continue;
@ -110,7 +112,7 @@ _gen_func(const Eolian_Unit *src, const Eolian_Function *fid,
eina_strbuf_append(buf, legacy ? "EAPI " : "EOAPI "); eina_strbuf_append(buf, legacy ? "EAPI " : "EOAPI ");
if (rtp) if (rtp)
{ {
Eina_Stringshare *rtps = eolian_type_c_type_get(rtp, EOLIAN_C_TYPE_RETURN); Eina_Stringshare *rtps = eolian_type_c_type_get(src, rtp, EOLIAN_C_TYPE_RETURN);
eina_strbuf_append(buf, rtps); eina_strbuf_append(buf, rtps);
if (rtps[strlen(rtps) - 1] != '*') if (rtps[strlen(rtps) - 1] != '*')
eina_strbuf_append_char(buf, ' '); eina_strbuf_append_char(buf, ' ');
@ -139,7 +141,7 @@ _gen_func(const Eolian_Unit *src, const Eolian_Function *fid,
eina_strbuf_append(buf, "Eo *obj"); eina_strbuf_append(buf, "Eo *obj");
} }
eo_gen_params(eolian_property_keys_get(fid, ftype), buf, &flagbuf, &nidx, EOLIAN_PROPERTY); eo_gen_params(src, eolian_property_keys_get(fid, ftype), buf, &flagbuf, &nidx, EOLIAN_PROPERTY);
if (!var_as_ret) if (!var_as_ret)
{ {
@ -148,7 +150,7 @@ _gen_func(const Eolian_Unit *src, const Eolian_Function *fid,
itr = eolian_property_values_get(fid, ftype); itr = eolian_property_values_get(fid, ftype);
else else
itr = eolian_function_parameters_get(fid); itr = eolian_function_parameters_get(fid);
eo_gen_params(itr, buf, &flagbuf, &nidx, ftype); eo_gen_params(src, itr, buf, &flagbuf, &nidx, ftype);
} }
if (flagbuf) if (flagbuf)

View File

@ -3,7 +3,7 @@
#include "main.h" #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_params(const Eolian_Unit *src, 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); void eo_gen_header_gen(const Eolian_Unit *src, const Eolian_Class *cl, Eina_Strbuf *buf, Eina_Bool legacy);
#endif #endif

View File

@ -123,13 +123,13 @@ _append_defval(const Eolian_Unit *src, Eina_Strbuf *buf,
else WRN("evaluation of default value failed"); else WRN("evaluation of default value failed");
} }
/* default value or fallback */ /* default value or fallback */
const Eolian_Type *btp = eolian_type_aliased_base_get(tp); const Eolian_Type *btp = eolian_type_aliased_base_get(src, tp);
if (eolian_type_is_ptr(btp)) if (eolian_type_is_ptr(btp))
{ {
eina_strbuf_append(buf, "NULL"); eina_strbuf_append(buf, "NULL");
return; return;
} }
const Eolian_Typedecl *tdcl = eolian_type_typedecl_get(btp); const Eolian_Typedecl *tdcl = eolian_type_typedecl_get(src, btp);
if (tdcl && (eolian_typedecl_type_get(tdcl) == EOLIAN_TYPEDECL_STRUCT)) if (tdcl && (eolian_typedecl_type_get(tdcl) == EOLIAN_TYPEDECL_STRUCT))
{ {
char *sn = eo_gen_c_full_name_get(eolian_typedecl_full_name_get(tdcl)); char *sn = eo_gen_c_full_name_get(eolian_typedecl_full_name_get(tdcl));
@ -140,7 +140,7 @@ _append_defval(const Eolian_Unit *src, Eina_Strbuf *buf,
free(sn); free(sn);
return; return;
} }
Eina_Stringshare *ctp = eolian_type_c_type_get(btp, EOLIAN_C_TYPE_DEFAULT); Eina_Stringshare *ctp = eolian_type_c_type_get(src, btp, EOLIAN_C_TYPE_DEFAULT);
if (strchr(ctp, '*')) if (strchr(ctp, '*'))
{ {
eina_strbuf_append(buf, "NULL"); eina_strbuf_append(buf, "NULL");
@ -182,7 +182,7 @@ _generate_loop_content(Eina_Strbuf **buf, const Eolian_Type *inner_type, const E
} }
static void static void
_generate_iterative_free(Eina_Strbuf **buf, const Eolian_Type *type, const Eolian_Type *inner_type, Eolian_Function_Parameter *parameter, Eina_Strbuf *param) _generate_iterative_free(const Eolian_Unit *src, Eina_Strbuf **buf, const Eolian_Type *type, const Eolian_Type *inner_type, Eolian_Function_Parameter *parameter, Eina_Strbuf *param)
{ {
Eina_Strbuf *iterator_header, *iter_param; Eina_Strbuf *iterator_header, *iter_param;
@ -194,7 +194,7 @@ _generate_iterative_free(Eina_Strbuf **buf, const Eolian_Type *type, const Eolia
eina_strbuf_append_printf(iter_param, "%s_iter", eolian_parameter_name_get(parameter)); eina_strbuf_append_printf(iter_param, "%s_iter", eolian_parameter_name_get(parameter));
//generate the field definition //generate the field definition
eina_strbuf_append_printf(*buf, " %s", eolian_type_c_type_get(inner_type, EOLIAN_C_TYPE_DEFAULT)); eina_strbuf_append_printf(*buf, " %s", eolian_type_c_type_get(src, inner_type, EOLIAN_C_TYPE_DEFAULT));
if(t == EOLIAN_TYPE_BUILTIN_INARRAY if(t == EOLIAN_TYPE_BUILTIN_INARRAY
|| t == EOLIAN_TYPE_BUILTIN_INLIST) || t == EOLIAN_TYPE_BUILTIN_INLIST)
{ {
@ -328,7 +328,7 @@ _gen_func(const Eolian_Unit *src, const Eolian_Class *cl,
{ {
const char *prn = eolian_parameter_name_get(pr); const char *prn = eolian_parameter_name_get(pr);
const Eolian_Type *pt = eolian_parameter_type_get(pr); const Eolian_Type *pt = eolian_parameter_type_get(pr);
Eina_Stringshare *ptn = eolian_type_c_type_get(pt, EOLIAN_C_TYPE_PARAM); Eina_Stringshare *ptn = eolian_type_c_type_get(src, pt, EOLIAN_C_TYPE_PARAM);
if (eina_strbuf_length_get(params)) if (eina_strbuf_length_get(params))
eina_strbuf_append(params, ", "); eina_strbuf_append(params, ", ");
@ -400,7 +400,7 @@ _gen_func(const Eolian_Unit *src, const Eolian_Class *cl,
} }
else if (inner_type && eolian_type_is_owned(inner_type)) else if (inner_type && eolian_type_is_owned(inner_type))
{ {
_generate_iterative_free(&fallback_free_ownership, type, inner_type, pr, param_call); _generate_iterative_free(src, &fallback_free_ownership, type, inner_type, pr, param_call);
} }
} }
eina_iterator_free(itr); eina_iterator_free(itr);
@ -429,8 +429,8 @@ _gen_func(const Eolian_Unit *src, const Eolian_Class *cl,
const Eolian_Expression *dfv = eolian_parameter_default_value_get(pr); const Eolian_Expression *dfv = eolian_parameter_default_value_get(pr);
const char *prn = eolian_parameter_name_get(pr); const char *prn = eolian_parameter_name_get(pr);
const Eolian_Type *pt = eolian_parameter_type_get(pr); const Eolian_Type *pt = eolian_parameter_type_get(pr);
Eina_Stringshare *ptn = eolian_type_c_type_get(pt, EOLIAN_C_TYPE_PARAM); Eina_Stringshare *ptn = eolian_type_c_type_get(src, pt, EOLIAN_C_TYPE_PARAM);
const Eolian_Typedecl *ptd = eolian_type_typedecl_get(pt); const Eolian_Typedecl *ptd = eolian_type_typedecl_get(src, pt);
Eina_Bool had_star = ptn[strlen(ptn) - 1] == '*'; Eina_Bool had_star = ptn[strlen(ptn) - 1] == '*';
const char *add_star = _get_add_star(ftype, pd); const char *add_star = _get_add_star(ftype, pd);
@ -501,7 +501,7 @@ _gen_func(const Eolian_Unit *src, const Eolian_Class *cl,
if (impl_same_class && eolian_implement_is_pure_virtual(impl, ftype)) if (impl_same_class && eolian_implement_is_pure_virtual(impl, ftype))
impl_need = EINA_FALSE; impl_need = EINA_FALSE;
Eina_Stringshare *rtpn = rtp ? eolian_type_c_type_get(rtp, EOLIAN_C_TYPE_RETURN) Eina_Stringshare *rtpn = rtp ? eolian_type_c_type_get(src, rtp, EOLIAN_C_TYPE_RETURN)
: eina_stringshare_add("void"); : eina_stringshare_add("void");
char *cname = NULL, *cnamel = NULL, *ocnamel = NULL; char *cname = NULL, *cnamel = NULL, *ocnamel = NULL;
@ -1018,8 +1018,9 @@ eo_gen_source_gen(const Eolian_Unit *src,
} }
static void static void
_gen_params(const Eolian_Function *fid, Eolian_Function_Type ftype, _gen_params(const Eolian_Unit *src, const Eolian_Function *fid,
Eina_Bool var_as_ret, Eina_Strbuf *params, Eina_Strbuf *params_full) Eolian_Function_Type ftype, Eina_Bool var_as_ret,
Eina_Strbuf *params, Eina_Strbuf *params_full)
{ {
Eina_Bool is_prop = (ftype == EOLIAN_PROP_GET || ftype == EOLIAN_PROP_SET); Eina_Bool is_prop = (ftype == EOLIAN_PROP_GET || ftype == EOLIAN_PROP_SET);
@ -1031,7 +1032,7 @@ _gen_params(const Eolian_Function *fid, Eolian_Function_Type ftype,
{ {
const char *prn = eolian_parameter_name_get(pr); const char *prn = eolian_parameter_name_get(pr);
const Eolian_Type *pt = eolian_parameter_type_get(pr); const Eolian_Type *pt = eolian_parameter_type_get(pr);
Eina_Stringshare *ptn = eolian_type_c_type_get(pt, EOLIAN_C_TYPE_PARAM); Eina_Stringshare *ptn = eolian_type_c_type_get(src, pt, EOLIAN_C_TYPE_PARAM);
eina_strbuf_append(params, ", "); eina_strbuf_append(params, ", ");
eina_strbuf_append(params, prn); eina_strbuf_append(params, prn);
@ -1060,8 +1061,8 @@ _gen_params(const Eolian_Function *fid, Eolian_Function_Type ftype,
Eolian_Parameter_Dir pd = eolian_parameter_direction_get(pr); Eolian_Parameter_Dir pd = eolian_parameter_direction_get(pr);
const char *prn = eolian_parameter_name_get(pr); const char *prn = eolian_parameter_name_get(pr);
const Eolian_Type *pt = eolian_parameter_type_get(pr); const Eolian_Type *pt = eolian_parameter_type_get(pr);
const Eolian_Typedecl *ptd = eolian_type_typedecl_get(pt); const Eolian_Typedecl *ptd = eolian_type_typedecl_get(src, pt);
Eina_Stringshare *ptn = eolian_type_c_type_get(pt, EOLIAN_C_TYPE_PARAM); Eina_Stringshare *ptn = eolian_type_c_type_get(src, pt, EOLIAN_C_TYPE_PARAM);
if (ptd && eolian_typedecl_type_get(ptd) == EOLIAN_TYPEDECL_FUNCTION_POINTER) if (ptd && eolian_typedecl_type_get(ptd) == EOLIAN_TYPEDECL_FUNCTION_POINTER)
{ {
@ -1092,9 +1093,9 @@ _gen_params(const Eolian_Function *fid, Eolian_Function_Type ftype,
} }
static void static void
_gen_proto(const Eolian_Class *cl, const Eolian_Function *fid, _gen_proto(const Eolian_Unit *src, const Eolian_Class *cl,
Eolian_Function_Type ftype, Eina_Strbuf *buf, const Eolian_Function *fid, Eolian_Function_Type ftype,
const Eolian_Implement *impl, const char *dtype, Eina_Strbuf *buf, const Eolian_Implement *impl, const char *dtype,
const char *cnamel) const char *cnamel)
{ {
Eina_Bool impl_same_class = (eolian_implement_class_get(impl) == cl); Eina_Bool impl_same_class = (eolian_implement_class_get(impl) == cl);
@ -1141,7 +1142,7 @@ _gen_proto(const Eolian_Class *cl, const Eolian_Function *fid,
eina_strbuf_append(buf, "EOLIAN static "); eina_strbuf_append(buf, "EOLIAN static ");
if (rtp) if (rtp)
{ {
Eina_Stringshare *rtpn = eolian_type_c_type_get(rtp, EOLIAN_C_TYPE_RETURN); Eina_Stringshare *rtpn = eolian_type_c_type_get(src, rtp, EOLIAN_C_TYPE_RETURN);
eina_strbuf_append(buf, rtpn); eina_strbuf_append(buf, rtpn);
eina_stringshare_del(rtpn); eina_stringshare_del(rtpn);
} }
@ -1162,7 +1163,7 @@ _gen_proto(const Eolian_Class *cl, const Eolian_Function *fid,
/* gen params here */ /* gen params here */
Eina_Strbuf *params = eina_strbuf_new(); Eina_Strbuf *params = eina_strbuf_new();
Eina_Strbuf *params_full = eina_strbuf_new(); Eina_Strbuf *params_full = eina_strbuf_new();
_gen_params(fid, ftype, var_as_ret, params, params_full); _gen_params(src, fid, ftype, var_as_ret, params, params_full);
if (eina_strbuf_length_get(params_full)) if (eina_strbuf_length_get(params_full))
eina_strbuf_append(buf, eina_strbuf_string_get(params_full)); eina_strbuf_append(buf, eina_strbuf_string_get(params_full));
@ -1192,7 +1193,7 @@ _gen_proto(const Eolian_Class *cl, const Eolian_Function *fid,
} }
void void
eo_gen_impl_gen(const Eolian_Unit *src EINA_UNUSED, eo_gen_impl_gen(const Eolian_Unit *src,
const Eolian_Class *cl, Eina_Strbuf *buf) const Eolian_Class *cl, Eina_Strbuf *buf)
{ {
if (!cl) if (!cl)
@ -1243,14 +1244,14 @@ eo_gen_impl_gen(const Eolian_Unit *src EINA_UNUSED,
{ {
case EOLIAN_PROP_GET: case EOLIAN_PROP_GET:
case EOLIAN_PROP_SET: case EOLIAN_PROP_SET:
_gen_proto(cl, fid, ftype, buf, imp, dt, cnamel); _gen_proto(src, cl, fid, ftype, buf, imp, dt, cnamel);
break; break;
case EOLIAN_PROPERTY: case EOLIAN_PROPERTY:
_gen_proto(cl, fid, EOLIAN_PROP_SET, buf, imp, dt, cnamel); _gen_proto(src, cl, fid, EOLIAN_PROP_SET, buf, imp, dt, cnamel);
_gen_proto(cl, fid, EOLIAN_PROP_GET, buf, imp, dt, cnamel); _gen_proto(src, cl, fid, EOLIAN_PROP_GET, buf, imp, dt, cnamel);
break; break;
default: default:
_gen_proto(cl, fid, EOLIAN_METHOD, buf, imp, dt, cnamel); _gen_proto(src, cl, fid, EOLIAN_METHOD, buf, imp, dt, cnamel);
} }
} }
eina_iterator_free(itr); eina_iterator_free(itr);

View File

@ -41,7 +41,7 @@ _type_generate(const Eolian_Unit *src, const Eolian_Typedecl *tp,
{ {
const Eolian_Type *mtp = eolian_typedecl_struct_field_type_get(memb); const Eolian_Type *mtp = eolian_typedecl_struct_field_type_get(memb);
Eina_Stringshare *ct = NULL; Eina_Stringshare *ct = NULL;
ct = eolian_type_c_type_get(mtp, EOLIAN_C_TYPE_DEFAULT); ct = eolian_type_c_type_get(src, mtp, EOLIAN_C_TYPE_DEFAULT);
eina_strbuf_append_printf(buf, " %s%s%s;", eina_strbuf_append_printf(buf, " %s%s%s;",
ct, strchr(ct, '*') ? "" : " ", ct, strchr(ct, '*') ? "" : " ",
eolian_typedecl_struct_field_name_get(memb)); eolian_typedecl_struct_field_name_get(memb));
@ -135,7 +135,7 @@ _type_generate(const Eolian_Unit *src, const Eolian_Typedecl *tp,
eina_strbuf_append(buf, "void "); eina_strbuf_append(buf, "void ");
else else
{ {
Eina_Stringshare *ct = eolian_type_c_type_get(rtp, EOLIAN_C_TYPE_RETURN); Eina_Stringshare *ct = eolian_type_c_type_get(src, rtp, EOLIAN_C_TYPE_RETURN);
eina_strbuf_append_printf(buf, "%s ", ct); eina_strbuf_append_printf(buf, "%s ", ct);
} }
@ -147,7 +147,7 @@ _type_generate(const Eolian_Unit *src, const Eolian_Typedecl *tp,
/* Parameters */ /* Parameters */
eina_strbuf_append(buf, "(void *data"); eina_strbuf_append(buf, "(void *data");
int nidx = 1; int nidx = 1;
eo_gen_params(eolian_function_parameters_get(fid), buf, NULL, &nidx, EOLIAN_FUNCTION_POINTER); eo_gen_params(src, eolian_function_parameters_get(fid), buf, NULL, &nidx, EOLIAN_FUNCTION_POINTER);
eina_strbuf_append(buf, ")"); eina_strbuf_append(buf, ")");
break; break;
@ -195,7 +195,7 @@ _var_generate(const Eolian_Unit *src, const Eolian_Variable *vr, Eina_Bool legac
} }
else else
{ {
Eina_Stringshare *ct = eolian_type_c_type_get(vt, EOLIAN_C_TYPE_DEFAULT); Eina_Stringshare *ct = eolian_type_c_type_get(src, vt, EOLIAN_C_TYPE_DEFAULT);
eina_strbuf_append_printf(buf, "EWAPI extern %s %s;", ct, fn); eina_strbuf_append_printf(buf, "EWAPI extern %s %s;", ct, fn);
eina_stringshare_del(ct); eina_stringshare_del(ct);
} }
@ -285,7 +285,7 @@ void eo_gen_types_source_gen(const Eolian_Unit *src,
eina_str_toupper(&fn); eina_str_toupper(&fn);
const Eolian_Type *vt = eolian_variable_base_type_get(vr); const Eolian_Type *vt = eolian_variable_base_type_get(vr);
Eina_Stringshare *ct = eolian_type_c_type_get(vt, EOLIAN_C_TYPE_DEFAULT); Eina_Stringshare *ct = eolian_type_c_type_get(src, vt, EOLIAN_C_TYPE_DEFAULT);
eina_strbuf_append_printf(buf, "EWAPI %s %s = ", ct, fn); eina_strbuf_append_printf(buf, "EWAPI %s %s = ", ct, fn);
eina_stringshare_del(ct); eina_stringshare_del(ct);
free(fn); free(fn);

View File

@ -399,10 +399,10 @@ ffi.cdef [[
const Eolian_Type *eolian_type_base_type_get(const Eolian_Type *tp); const Eolian_Type *eolian_type_base_type_get(const Eolian_Type *tp);
const Eolian_Type *eolian_type_next_type_get(const Eolian_Type *tp); const Eolian_Type *eolian_type_next_type_get(const Eolian_Type *tp);
const Eolian_Type *eolian_typedecl_base_type_get(const Eolian_Typedecl *tp); const Eolian_Type *eolian_typedecl_base_type_get(const Eolian_Typedecl *tp);
const Eolian_Typedecl *eolian_type_typedecl_get(const Eolian_Type *tp); const Eolian_Typedecl *eolian_type_typedecl_get(const Eolian_Unit *unit, const Eolian_Type *tp);
const Eolian_Type *eolian_type_aliased_base_get(const Eolian_Type *tp); const Eolian_Type *eolian_type_aliased_base_get(const Eolian_Unit *unit, const Eolian_Type *tp);
const Eolian_Type *eolian_typedecl_aliased_base_get(const Eolian_Typedecl *tp); const Eolian_Type *eolian_typedecl_aliased_base_get(const Eolian_Unit *unit, const Eolian_Typedecl *tp);
const Eolian_Class *eolian_type_class_get(const Eolian_Unit *unit, const Eolian_Type *tp); const Eolian_Class *eolian_type_class_get(const Eolian_Unit *unit, const Eolian_Type *tp);
Eina_Bool eolian_type_is_owned(const Eolian_Type *tp); Eina_Bool eolian_type_is_owned(const Eolian_Type *tp);
@ -411,7 +411,7 @@ ffi.cdef [[
Eina_Bool eolian_typedecl_is_extern(const Eolian_Typedecl *tp); Eina_Bool eolian_typedecl_is_extern(const Eolian_Typedecl *tp);
const char *eolian_type_c_type_get(const Eolian_Type *tp, Eolian_C_Type_Type ctype); const char *eolian_type_c_type_get(const Eolian_Unit *unit, const Eolian_Type *tp, Eolian_C_Type_Type ctype);
const char *eolian_typedecl_c_type_get(const Eolian_Unit *unit, const Eolian_Typedecl *tp); const char *eolian_typedecl_c_type_get(const Eolian_Unit *unit, const Eolian_Typedecl *tp);
const char *eolian_type_name_get(const Eolian_Type *tp); const char *eolian_type_name_get(const Eolian_Type *tp);
@ -766,8 +766,8 @@ M.Typedecl = ffi.metatype("Eolian_Typedecl", {
return v return v
end, end,
aliased_base_get = function(self) aliased_base_get = function(self, unit)
local v = eolian.eolian_typedecl_aliased_byse_get(self) local v = eolian.eolian_typedecl_aliased_byse_get(unit, self)
if v == nil then return nil end if v == nil then return nil end
return v return v
end, end,
@ -841,14 +841,14 @@ M.Type = ffi.metatype("Eolian_Type", {
return v return v
end, end,
typedecl_get = function(self) typedecl_get = function(self, unit)
local v = eolian.eolian_type_typedecl_get(self) local v = eolian.eolian_type_typedecl_get(unit, self)
if v == nil then return nil end if v == nil then return nil end
return v return v
end, end,
aliased_base_get = function(self) aliased_base_get = function(self, unit)
local v = eolian.eolian_type_aliased_byse_get(self) local v = eolian.eolian_type_aliased_byse_get(unit, self)
if v == nil then return nil end if v == nil then return nil end
return v return v
end, end,
@ -871,8 +871,8 @@ M.Type = ffi.metatype("Eolian_Type", {
return eolian.eolian_type_is_ptr(self) ~= 0 return eolian.eolian_type_is_ptr(self) ~= 0
end, end,
c_type_get = function(self, ctype) c_type_get = function(self, unit, ctype)
local v = eolian.eolian_type_c_type_get(self, ctype) local v = eolian.eolian_type_c_type_get(unit, self, ctype)
if v == nil then return nil end if v == nil then return nil end
return ffi_stringshare(v) return ffi_stringshare(v)
end, end,

View File

@ -1807,12 +1807,13 @@ EAPI const Eolian_Type *eolian_typedecl_base_type_get(const Eolian_Typedecl *tp)
* If the given typedecl is an alias, it returns the result of * If the given typedecl is an alias, it returns the result of
* eolian_type_aliased_base_get on its base type. Otherwise this returns NULL. * eolian_type_aliased_base_get on its base type. Otherwise this returns NULL.
* *
* @param[in] unit the unit to look in
* @param[in] tp the type declaration. * @param[in] tp the type declaration.
* @return the lowest alias base or the given type. * @return the lowest alias base or the given type.
* *
* @ingroup Eolian * @ingroup Eolian
*/ */
EAPI const Eolian_Type *eolian_typedecl_aliased_base_get(const Eolian_Typedecl *tp); EAPI const Eolian_Type *eolian_typedecl_aliased_base_get(const Eolian_Unit *unit, const Eolian_Typedecl *tp);
/* /*
* @brief Check if a struct or alias type declaration is extern. * @brief Check if a struct or alias type declaration is extern.
@ -1955,12 +1956,13 @@ EAPI const Eolian_Type *eolian_type_next_type_get(const Eolian_Type *tp);
* *
* This tries to look up alias, struct and enum in that order. * This tries to look up alias, struct and enum in that order.
* *
* @param[in] unit the unit to look in
* @param[in] tp the type. * @param[in] tp the type.
* @return the pointed to type decalration or NULL. * @return the pointed to type decalration or NULL.
* *
* @ingroup Eolian * @ingroup Eolian
*/ */
EAPI const Eolian_Typedecl *eolian_type_typedecl_get(const Eolian_Type *tp); EAPI const Eolian_Typedecl *eolian_type_typedecl_get(const Eolian_Unit *unit, const Eolian_Type *tp);
/* /*
* @brief Get the lowest base type of an alias stack. * @brief Get the lowest base type of an alias stack.
@ -1972,12 +1974,13 @@ EAPI const Eolian_Typedecl *eolian_type_typedecl_get(const Eolian_Type *tp);
* type actually is while still having convenience. Keep in mind that this stops * type actually is while still having convenience. Keep in mind that this stops
* if the found type is actually a pointer (has a ptr() on it). * if the found type is actually a pointer (has a ptr() on it).
* *
* @param[in] unit the unit to look in
* @param[in] tp the type. * @param[in] tp the type.
* @return the lowest alias base or the given type. * @return the lowest alias base or the given type.
* *
* @ingroup Eolian * @ingroup Eolian
*/ */
EAPI const Eolian_Type *eolian_type_aliased_base_get(const Eolian_Type *tp); EAPI const Eolian_Type *eolian_type_aliased_base_get(const Eolian_Unit *unit, const Eolian_Type *tp);
/* /*
* @brief Get the class associated with an EOLIAN_TYPE_CLASS type. * @brief Get the class associated with an EOLIAN_TYPE_CLASS type.
@ -2025,6 +2028,7 @@ EAPI Eina_Bool eolian_type_is_ptr(const Eolian_Type *tp);
/* /*
* @brief Get the full C type name of the given type. * @brief Get the full C type name of the given type.
* *
* @param[in] unit the unit to look in
* @param[in] tp the type. * @param[in] tp the type.
* @param[in] ctype the context within which the C type string will be used. * @param[in] ctype the context within which the C type string will be used.
* @return The C type name assuming @c tp is not NULL. * @return The C type name assuming @c tp is not NULL.
@ -2035,7 +2039,7 @@ EAPI Eina_Bool eolian_type_is_ptr(const Eolian_Type *tp);
* *
* @ingroup Eolian * @ingroup Eolian
*/ */
EAPI Eina_Stringshare *eolian_type_c_type_get(const Eolian_Type *tp, Eolian_C_Type_Type ctype); EAPI Eina_Stringshare *eolian_type_c_type_get(const Eolian_Unit *unit, const Eolian_Type *tp, Eolian_C_Type_Type ctype);
/* /*
* @brief Get the name of the given type. For regular types, this is for * @brief Get the name of the given type. For regular types, this is for

View File

@ -522,7 +522,7 @@ eval_exp(const Eolian_Unit *unit, const Eolian_Expression *expr,
const Eolian_Type *etp = eolian_typedecl_base_type_get(etpd); const Eolian_Type *etp = eolian_typedecl_base_type_get(etpd);
if (!etp || etp->type != EOLIAN_TYPE_REGULAR) if (!etp || etp->type != EOLIAN_TYPE_REGULAR)
break; break;
etpd = eolian_type_typedecl_get(etp); etpd = eolian_type_typedecl_get(unit, etp);
} }
if (!etpd) etpd = eolian_typedecl_enum_get_by_name(unit, fulln); if (!etpd) etpd = eolian_typedecl_enum_get_by_name(unit, fulln);

View File

@ -29,12 +29,12 @@ _eval_type(const Eolian_Unit *unit, const Eolian_Expression *expr,
return database_expr_eval(unit, expr, EOLIAN_MASK_NULL); return database_expr_eval(unit, expr, EOLIAN_MASK_NULL);
case EOLIAN_TYPE_REGULAR: case EOLIAN_TYPE_REGULAR:
{ {
if (database_type_is_ownable(type)) if (database_type_is_ownable(unit, type))
return database_expr_eval(unit, expr, EOLIAN_MASK_NULL); return database_expr_eval(unit, expr, EOLIAN_MASK_NULL);
int kw = eo_lexer_keyword_str_to_id(type->name); int kw = eo_lexer_keyword_str_to_id(type->name);
if (!kw || kw < KW_byte || kw >= KW_void) if (!kw || kw < KW_byte || kw >= KW_void)
{ {
const Eolian_Typedecl *base = eolian_type_typedecl_get(type); const Eolian_Typedecl *base = eolian_type_typedecl_get(unit, type);
if (!base) if (!base)
return err; return err;
if (base->type == EOLIAN_TYPEDECL_ALIAS) if (base->type == EOLIAN_TYPEDECL_ALIAS)

View File

@ -47,7 +47,7 @@ database_type_add(Eolian *state, Eolian_Typedecl *def)
eina_hash_set(state->aliases_f, def->base.file, eina_list_append eina_hash_set(state->aliases_f, def->base.file, eina_list_append
((Eina_List*)eina_hash_find(state->aliases_f, def->base.file), ((Eina_List*)eina_hash_find(state->aliases_f, def->base.file),
def)); def));
database_decl_add(def->full_name, EOLIAN_DECL_ALIAS, def->base.file, def); database_decl_add(state, def->full_name, EOLIAN_DECL_ALIAS, def->base.file, def);
} }
void void
@ -56,7 +56,7 @@ database_struct_add(Eolian *state, Eolian_Typedecl *tp)
eina_hash_set(state->unit.structs, tp->full_name, tp); eina_hash_set(state->unit.structs, tp->full_name, tp);
eina_hash_set(state->structs_f, tp->base.file, eina_list_append eina_hash_set(state->structs_f, tp->base.file, eina_list_append
((Eina_List*)eina_hash_find(state->structs_f, tp->base.file), tp)); ((Eina_List*)eina_hash_find(state->structs_f, tp->base.file), tp));
database_decl_add(tp->full_name, EOLIAN_DECL_STRUCT, tp->base.file, tp); database_decl_add(state, tp->full_name, EOLIAN_DECL_STRUCT, tp->base.file, tp);
} }
void void
@ -65,11 +65,11 @@ database_enum_add(Eolian *state, Eolian_Typedecl *tp)
eina_hash_set(state->unit.enums, tp->full_name, tp); eina_hash_set(state->unit.enums, tp->full_name, tp);
eina_hash_set(state->enums_f, tp->base.file, eina_list_append eina_hash_set(state->enums_f, tp->base.file, eina_list_append
((Eina_List*)eina_hash_find(state->enums_f, tp->base.file), tp)); ((Eina_List*)eina_hash_find(state->enums_f, tp->base.file), tp));
database_decl_add(tp->full_name, EOLIAN_DECL_ENUM, tp->base.file, tp); database_decl_add(state, tp->full_name, EOLIAN_DECL_ENUM, tp->base.file, tp);
} }
Eina_Bool Eina_Bool
database_type_is_ownable(const Eolian_Type *tp) database_type_is_ownable(const Eolian_Unit *unit, const Eolian_Type *tp)
{ {
if (tp->is_ptr) if (tp->is_ptr)
return EINA_TRUE; return EINA_TRUE;
@ -79,13 +79,13 @@ database_type_is_ownable(const Eolian_Type *tp)
const char *ct = eo_lexer_get_c_type(kw); const char *ct = eo_lexer_get_c_type(kw);
if (!ct) if (!ct)
{ {
const Eolian_Typedecl *tpp = eolian_type_typedecl_get(tp); const Eolian_Typedecl *tpp = eolian_type_typedecl_get(unit, tp);
if (!tpp) if (!tpp)
return EINA_FALSE; return EINA_FALSE;
if (tpp->type == EOLIAN_TYPEDECL_FUNCTION_POINTER) if (tpp->type == EOLIAN_TYPEDECL_FUNCTION_POINTER)
return EINA_TRUE; return EINA_TRUE;
if (tpp->type == EOLIAN_TYPEDECL_ALIAS) if (tpp->type == EOLIAN_TYPEDECL_ALIAS)
return database_type_is_ownable(tpp->base_type); return database_type_is_ownable(unit, tpp->base_type);
return EINA_FALSE; return EINA_FALSE;
} }
return (ct[strlen(ct) - 1] == '*'); return (ct[strlen(ct) - 1] == '*');
@ -103,14 +103,15 @@ _buf_add_suffix(Eina_Strbuf *buf, const char *suffix)
} }
void void
database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name, database_type_to_str(const Eolian_Unit *src, const Eolian_Type *tp,
Eina_Strbuf *buf, const char *name,
Eolian_C_Type_Type ctype) Eolian_C_Type_Type ctype)
{ {
if ((tp->type == EOLIAN_TYPE_REGULAR if ((tp->type == EOLIAN_TYPE_REGULAR
|| tp->type == EOLIAN_TYPE_CLASS || tp->type == EOLIAN_TYPE_CLASS
|| tp->type == EOLIAN_TYPE_VOID) || tp->type == EOLIAN_TYPE_VOID)
&& tp->is_const && tp->is_const
&& ((ctype != EOLIAN_C_TYPE_RETURN) || database_type_is_ownable(tp))) && ((ctype != EOLIAN_C_TYPE_RETURN) || database_type_is_ownable(src, tp)))
{ {
eina_strbuf_append(buf, "const "); eina_strbuf_append(buf, "const ");
} }
@ -137,7 +138,8 @@ database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name,
else else
{ {
/* handles arrays and pointers as they all serialize to pointers */ /* handles arrays and pointers as they all serialize to pointers */
database_type_to_str(tp->base_type, buf, NULL, EOLIAN_C_TYPE_DEFAULT); database_type_to_str(src, tp->base_type, buf, NULL,
EOLIAN_C_TYPE_DEFAULT);
_buf_add_suffix(buf, "*"); _buf_add_suffix(buf, "*");
if (tp->is_const && (ctype != EOLIAN_C_TYPE_RETURN)) if (tp->is_const && (ctype != EOLIAN_C_TYPE_RETURN))
eina_strbuf_append(buf, " const"); eina_strbuf_append(buf, " const");
@ -150,7 +152,8 @@ database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name,
} }
static void static void
_stype_to_str(const Eolian_Typedecl *tp, Eina_Strbuf *buf) _stype_to_str(const Eolian_Unit *src, const Eolian_Typedecl *tp,
Eina_Strbuf *buf)
{ {
Eolian_Struct_Type_Field *sf; Eolian_Struct_Type_Field *sf;
Eina_List *l; Eina_List *l;
@ -167,7 +170,8 @@ _stype_to_str(const Eolian_Typedecl *tp, Eina_Strbuf *buf)
eina_strbuf_append(buf, " { "); eina_strbuf_append(buf, " { ");
EINA_LIST_FOREACH(tp->field_list, l, sf) EINA_LIST_FOREACH(tp->field_list, l, sf)
{ {
database_type_to_str(sf->type, buf, sf->name, EOLIAN_C_TYPE_DEFAULT); database_type_to_str(src, sf->type, buf, sf->name,
EOLIAN_C_TYPE_DEFAULT);
eina_strbuf_append(buf, "; "); eina_strbuf_append(buf, "; ");
} }
eina_strbuf_append(buf, "}"); eina_strbuf_append(buf, "}");
@ -222,7 +226,8 @@ _append_name(const Eolian_Typedecl *tp, Eina_Strbuf *buf)
} }
static void static void
_atype_to_str(const Eolian_Typedecl *tp, Eina_Strbuf *buf) _atype_to_str(const Eolian_Unit *src, const Eolian_Typedecl *tp,
Eina_Strbuf *buf)
{ {
eina_strbuf_append(buf, "typedef "); eina_strbuf_append(buf, "typedef ");
@ -239,7 +244,7 @@ _atype_to_str(const Eolian_Typedecl *tp, Eina_Strbuf *buf)
Eina_Strbuf *fulln = eina_strbuf_new(); Eina_Strbuf *fulln = eina_strbuf_new();
_append_name(tp, fulln); _append_name(tp, fulln);
database_type_to_str(tp->base_type, buf, eina_strbuf_string_get(fulln), database_type_to_str(src, tp->base_type, buf, eina_strbuf_string_get(fulln),
EOLIAN_C_TYPE_DEFAULT); EOLIAN_C_TYPE_DEFAULT);
eina_strbuf_free(fulln); eina_strbuf_free(fulln);
} }
@ -251,14 +256,14 @@ database_typedecl_to_str(const Eolian_Unit *src, const Eolian_Typedecl *tp,
switch (tp->type) switch (tp->type)
{ {
case EOLIAN_TYPEDECL_ALIAS: case EOLIAN_TYPEDECL_ALIAS:
_atype_to_str(tp, buf); _atype_to_str(src, tp, buf);
break; break;
case EOLIAN_TYPEDECL_ENUM: case EOLIAN_TYPEDECL_ENUM:
_etype_to_str(src, tp, buf); _etype_to_str(src, tp, buf);
break; break;
case EOLIAN_TYPEDECL_STRUCT: case EOLIAN_TYPEDECL_STRUCT:
case EOLIAN_TYPEDECL_STRUCT_OPAQUE: case EOLIAN_TYPEDECL_STRUCT_OPAQUE:
_stype_to_str(tp, buf); _stype_to_str(src, tp, buf);
break; break;
default: default:
break; break;

View File

@ -266,7 +266,7 @@ eolian_type_next_type_get(const Eolian_Type *tp)
} }
EAPI const Eolian_Typedecl * EAPI const Eolian_Typedecl *
eolian_type_typedecl_get(const Eolian_Type *tp) eolian_type_typedecl_get(const Eolian_Unit *unit, const Eolian_Type *tp)
{ {
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
if (eolian_type_type_get(tp) != EOLIAN_TYPE_REGULAR) if (eolian_type_type_get(tp) != EOLIAN_TYPE_REGULAR)
@ -277,7 +277,7 @@ eolian_type_typedecl_get(const Eolian_Type *tp)
int kw = eo_lexer_keyword_str_to_id(tp->full_name); int kw = eo_lexer_keyword_str_to_id(tp->full_name);
if (!kw || kw < KW_byte || kw >= KW_true) if (!kw || kw < KW_byte || kw >= KW_true)
{ {
Eolian_Declaration *decl = eina_hash_find(_decls, tp->full_name); Eolian_Declaration *decl = eina_hash_find(unit->state->unit.decls, tp->full_name);
if (decl && decl->type != EOLIAN_DECL_CLASS if (decl && decl->type != EOLIAN_DECL_CLASS
&& decl->type != EOLIAN_DECL_VAR) && decl->type != EOLIAN_DECL_VAR)
return decl->data; return decl->data;
@ -293,22 +293,22 @@ eolian_typedecl_base_type_get(const Eolian_Typedecl *tp)
} }
EAPI const Eolian_Type * EAPI const Eolian_Type *
eolian_type_aliased_base_get(const Eolian_Type *tp) eolian_type_aliased_base_get(const Eolian_Unit *unit, const Eolian_Type *tp)
{ {
if (!tp || tp->type != EOLIAN_TYPE_REGULAR || tp->is_ptr) if (!tp || tp->type != EOLIAN_TYPE_REGULAR || tp->is_ptr)
return tp; return tp;
const Eolian_Typedecl *btp = eolian_type_typedecl_get(tp); const Eolian_Typedecl *btp = eolian_type_typedecl_get(unit, tp);
if (btp && (btp->type == EOLIAN_TYPEDECL_ALIAS)) if (btp && (btp->type == EOLIAN_TYPEDECL_ALIAS))
return eolian_typedecl_aliased_base_get(btp); return eolian_typedecl_aliased_base_get(unit, btp);
return tp; return tp;
} }
EAPI const Eolian_Type * EAPI const Eolian_Type *
eolian_typedecl_aliased_base_get(const Eolian_Typedecl *tp) eolian_typedecl_aliased_base_get(const Eolian_Unit *unit, const Eolian_Typedecl *tp)
{ {
if (!tp || tp->type != EOLIAN_TYPEDECL_ALIAS) if (!tp || tp->type != EOLIAN_TYPEDECL_ALIAS)
return NULL; return NULL;
return eolian_type_aliased_base_get(tp->base_type); return eolian_type_aliased_base_get(unit, tp->base_type);
} }
EAPI const Eolian_Class * EAPI const Eolian_Class *
@ -349,13 +349,14 @@ eolian_typedecl_is_extern(const Eolian_Typedecl *tp)
} }
EAPI Eina_Stringshare * EAPI Eina_Stringshare *
eolian_type_c_type_get(const Eolian_Type *tp, Eolian_C_Type_Type ctype) eolian_type_c_type_get(const Eolian_Unit *unit, const Eolian_Type *tp,
Eolian_C_Type_Type ctype)
{ {
Eina_Stringshare *ret; Eina_Stringshare *ret;
Eina_Strbuf *buf; Eina_Strbuf *buf;
EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL);
buf = eina_strbuf_new(); buf = eina_strbuf_new();
database_type_to_str(tp, buf, NULL, ctype); database_type_to_str(unit, tp, buf, NULL, ctype);
ret = eina_stringshare_add(eina_strbuf_string_get(buf)); ret = eina_stringshare_add(eina_strbuf_string_get(buf));
eina_strbuf_free(buf); eina_strbuf_free(buf);
return ret; return ret;

View File

@ -173,7 +173,7 @@ _validate_type(const Eolian_Unit *src, Eolian_Type *tp)
{ {
char buf[256]; char buf[256];
if (tp->owned && !database_type_is_ownable(tp)) if (tp->owned && !database_type_is_ownable(src, tp))
{ {
snprintf(buf, sizeof(buf), "type '%s' is not ownable", tp->full_name); snprintf(buf, sizeof(buf), "type '%s' is not ownable", tp->full_name);
return _obj_error(&tp->base, buf); return _obj_error(&tp->base, buf);
@ -182,7 +182,7 @@ _validate_type(const Eolian_Unit *src, Eolian_Type *tp)
if (tp->is_ptr && !tp->legacy) if (tp->is_ptr && !tp->legacy)
{ {
tp->is_ptr = EINA_FALSE; tp->is_ptr = EINA_FALSE;
Eina_Bool still_ownable = database_type_is_ownable(tp); Eina_Bool still_ownable = database_type_is_ownable(src, tp);
tp->is_ptr = EINA_TRUE; tp->is_ptr = EINA_TRUE;
if (still_ownable) if (still_ownable)
{ {
@ -213,7 +213,7 @@ _validate_type(const Eolian_Unit *src, Eolian_Type *tp)
return EINA_FALSE; return EINA_FALSE;
if ((kwid >= KW_accessor) && (kwid <= KW_list)) if ((kwid >= KW_accessor) && (kwid <= KW_list))
{ {
if (!database_type_is_ownable(itp)) if (!database_type_is_ownable(src, itp))
{ {
snprintf(buf, sizeof(buf), snprintf(buf, sizeof(buf),
"%s cannot contain value types (%s)", "%s cannot contain value types (%s)",
@ -253,7 +253,7 @@ _validate_type(const Eolian_Unit *src, Eolian_Type *tp)
return _validate(&tp->base); return _validate(&tp->base);
} }
/* user defined */ /* user defined */
tpp = (Eolian_Typedecl *)eolian_type_typedecl_get(tp); tpp = (Eolian_Typedecl *)eolian_type_typedecl_get(src, tp);
if (!tpp) if (!tpp)
{ {
snprintf(buf, sizeof(buf), "undefined type %s", tp->full_name); snprintf(buf, sizeof(buf), "undefined type %s", tp->full_name);

View File

@ -28,7 +28,7 @@ database_var_global_add(Eolian *state, Eolian_Variable *var)
eina_hash_set(state->unit.globals, var->full_name, var); eina_hash_set(state->unit.globals, var->full_name, var);
eina_hash_set(state->globals_f, var->base.file, eina_list_append eina_hash_set(state->globals_f, var->base.file, eina_list_append
((Eina_List*)eina_hash_find(state->globals_f, var->base.file), var)); ((Eina_List*)eina_hash_find(state->globals_f, var->base.file), var));
database_decl_add(var->full_name, EOLIAN_DECL_VAR, var->base.file, var); database_decl_add(state, var->full_name, EOLIAN_DECL_VAR, var->base.file, var);
} }
static void static void
@ -37,7 +37,7 @@ database_var_constant_add(Eolian *state, Eolian_Variable *var)
eina_hash_set(state->unit.constants, var->full_name, var); eina_hash_set(state->unit.constants, var->full_name, var);
eina_hash_set(state->constants_f, var->base.file, eina_list_append eina_hash_set(state->constants_f, var->base.file, eina_list_append
((Eina_List*)eina_hash_find(state->constants_f, var->base.file), var)); ((Eina_List*)eina_hash_find(state->constants_f, var->base.file), var));
database_decl_add(var->full_name, EOLIAN_DECL_VAR, var->base.file, var); database_decl_add(state, var->full_name, EOLIAN_DECL_VAR, var->base.file, var);
} }
void void

View File

@ -866,7 +866,7 @@ parse_typedef(Eo_Lexer *ls)
parse_name(ls, buf); parse_name(ls, buf);
_fill_name(eina_stringshare_add(eina_strbuf_string_get(buf)), _fill_name(eina_stringshare_add(eina_strbuf_string_get(buf)),
&def->full_name, &def->name, &def->namespaces); &def->full_name, &def->name, &def->namespaces);
decl = (Eolian_Declaration *)eina_hash_find(_decls, def->full_name); decl = (Eolian_Declaration *)eina_hash_find(ls->state->unit.decls, def->full_name);
if (decl) if (decl)
{ {
eo_lexer_context_restore(ls); eo_lexer_context_restore(ls);
@ -902,7 +902,7 @@ parse_variable(Eo_Lexer *ls, Eina_Bool global)
parse_name(ls, buf); parse_name(ls, buf);
_fill_name(eina_stringshare_add(eina_strbuf_string_get(buf)), _fill_name(eina_stringshare_add(eina_strbuf_string_get(buf)),
&def->full_name, &def->name, &def->namespaces); &def->full_name, &def->name, &def->namespaces);
decl = (Eolian_Declaration *)eina_hash_find(_decls, def->full_name); decl = (Eolian_Declaration *)eina_hash_find(ls->state->unit.decls, def->full_name);
if (decl) if (decl)
{ {
eo_lexer_context_restore(ls); eo_lexer_context_restore(ls);
@ -2117,7 +2117,7 @@ parse_class(Eo_Lexer *ls, Eolian_Class_Type type)
_fill_name(eina_stringshare_add(eina_strbuf_string_get(buf)), _fill_name(eina_stringshare_add(eina_strbuf_string_get(buf)),
&ls->tmp.kls->full_name, &ls->tmp.kls->name, &ls->tmp.kls->full_name, &ls->tmp.kls->name,
&ls->tmp.kls->namespaces); &ls->tmp.kls->namespaces);
decl = (Eolian_Declaration *)eina_hash_find(_decls, ls->tmp.kls->full_name); decl = (Eolian_Declaration *)eina_hash_find(ls->state->unit.decls, ls->tmp.kls->full_name);
if (decl) if (decl)
{ {
eo_lexer_context_restore(ls); eo_lexer_context_restore(ls);
@ -2233,7 +2233,7 @@ parse_unit(Eo_Lexer *ls, Eina_Bool eot)
col = ls->column; col = ls->column;
parse_name(ls, buf); parse_name(ls, buf);
name = eina_stringshare_add(eina_strbuf_string_get(buf)); name = eina_stringshare_add(eina_strbuf_string_get(buf));
decl = (Eolian_Declaration *)eina_hash_find(_decls, name); decl = (Eolian_Declaration *)eina_hash_find(ls->state->unit.decls, name);
if (decl) if (decl)
{ {
eina_stringshare_del(name); eina_stringshare_del(name);
@ -2271,7 +2271,7 @@ parse_unit(Eo_Lexer *ls, Eina_Bool eot)
} }
return EINA_FALSE; return EINA_FALSE;
found_class: found_class:
database_decl_add(ls->tmp.kls->full_name, EOLIAN_DECL_CLASS, database_decl_add(ls->state, ls->tmp.kls->full_name, EOLIAN_DECL_CLASS,
ls->tmp.kls->base.file, ls->tmp.kls); ls->tmp.kls->base.file, ls->tmp.kls);
return EINA_TRUE; return EINA_TRUE;
} }

View File

@ -8,9 +8,6 @@
#include "eolian_database.h" #include "eolian_database.h"
#include "eolian_priv.h" #include "eolian_priv.h"
Eina_Hash *_decls = NULL;
Eina_Hash *_declsf = NULL;
static int _database_init_count = 0; static int _database_init_count = 0;
static void static void
@ -23,8 +20,6 @@ int
database_init() database_init()
{ {
if (_database_init_count > 0) return ++_database_init_count; if (_database_init_count > 0) return ++_database_init_count;
_decls = eina_hash_stringshared_new(free);
_declsf = eina_hash_stringshared_new(_hashlist_free);
return ++_database_init_count; return ++_database_init_count;
} }
@ -38,52 +33,48 @@ database_shutdown()
} }
_database_init_count--; _database_init_count--;
if (_database_init_count == 0)
{
eina_hash_free(_decls ); _decls = NULL;
eina_hash_free(_declsf ); _declsf = NULL;
}
return _database_init_count; return _database_init_count;
} }
void void
database_decl_add(Eina_Stringshare *name, Eolian_Declaration_Type type, database_decl_add(Eolian *state, Eina_Stringshare *name,
Eolian_Declaration_Type type,
Eina_Stringshare *file, void *ptr) Eina_Stringshare *file, void *ptr)
{ {
Eolian_Declaration *decl = calloc(1, sizeof(Eolian_Declaration)); Eolian_Declaration *decl = calloc(1, sizeof(Eolian_Declaration));
decl->type = type; decl->type = type;
decl->name = name; decl->name = name;
decl->data = ptr; decl->data = ptr;
eina_hash_set(_decls, name, decl); eina_hash_set(state->unit.decls, name, decl);
eina_hash_set(_declsf, file, eina_list_append eina_hash_set(state->decls_f, file, eina_list_append
((Eina_List*)eina_hash_find(_declsf, file), decl)); ((Eina_List*)eina_hash_find(state->decls_f, file), decl));
} }
EAPI const Eolian_Declaration * EAPI const Eolian_Declaration *
eolian_declaration_get_by_name(const Eolian_Unit *unit EINA_UNUSED, const char *name) eolian_declaration_get_by_name(const Eolian_Unit *unit, const char *name)
{ {
if (!_decls) return NULL; if (!unit) return NULL;
Eina_Stringshare *shr = eina_stringshare_add(name); Eina_Stringshare *shr = eina_stringshare_add(name);
const Eolian_Declaration *decl = eina_hash_find(_decls, shr); const Eolian_Declaration *decl = eina_hash_find(unit->state->unit.decls, shr);
eina_stringshare_del(shr); eina_stringshare_del(shr);
return decl; return decl;
} }
EAPI Eina_Iterator * EAPI Eina_Iterator *
eolian_declarations_get_by_file(const Eolian *state EINA_UNUSED, const char *fname) eolian_declarations_get_by_file(const Eolian *state, const char *fname)
{ {
if (!_declsf) return NULL; if (!state) return NULL;
Eina_Stringshare *shr = eina_stringshare_add(fname); Eina_Stringshare *shr = eina_stringshare_add(fname);
Eina_List *l = eina_hash_find(_declsf, shr); Eina_List *l = eina_hash_find(state->decls_f, shr);
eina_stringshare_del(shr); eina_stringshare_del(shr);
if (!l) return NULL; if (!l) return NULL;
return eina_list_iterator_new(l); return eina_list_iterator_new(l);
} }
EAPI Eina_Iterator * EAPI Eina_Iterator *
eolian_all_declarations_get(const Eolian_Unit *unit EINA_UNUSED) eolian_all_declarations_get(const Eolian_Unit *unit)
{ {
return (_decls ? eina_hash_iterator_data_new(_decls) : NULL); return (unit ? eina_hash_iterator_data_new(unit->state->unit.decls) : NULL);
} }
EAPI Eolian_Declaration_Type EAPI Eolian_Declaration_Type
@ -551,6 +542,7 @@ database_unit_init(Eolian *state, Eolian_Unit *unit)
unit->aliases = eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_del)); unit->aliases = eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_del));
unit->structs = eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_del)); unit->structs = eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_del));
unit->enums = eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_del)); unit->enums = eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_del));
unit->decls = eina_hash_stringshared_new(free);
} }
void void
@ -565,6 +557,7 @@ database_unit_del(Eolian_Unit *unit)
eina_hash_free(unit->aliases); eina_hash_free(unit->aliases);
eina_hash_free(unit->structs); eina_hash_free(unit->structs);
eina_hash_free(unit->enums); eina_hash_free(unit->enums);
eina_hash_free(unit->decls);
} }
EAPI Eolian * EAPI Eolian *
@ -591,6 +584,7 @@ eolian_new(void)
state->enums_f = eina_hash_stringshared_new(_hashlist_free); state->enums_f = eina_hash_stringshared_new(_hashlist_free);
state->globals_f = eina_hash_stringshared_new(_hashlist_free); state->globals_f = eina_hash_stringshared_new(_hashlist_free);
state->constants_f = eina_hash_stringshared_new(_hashlist_free); state->constants_f = eina_hash_stringshared_new(_hashlist_free);
state->decls_f = eina_hash_stringshared_new(_hashlist_free);
return state; return state;
} }
@ -618,6 +612,7 @@ eolian_free(Eolian *state)
eina_hash_free(state->enums_f); eina_hash_free(state->enums_f);
eina_hash_free(state->globals_f); eina_hash_free(state->globals_f);
eina_hash_free(state->constants_f); eina_hash_free(state->constants_f);
eina_hash_free(state->decls_f);
free(state); free(state);
} }

View File

@ -31,10 +31,6 @@ extern Eina_Prefix *_eolian_prefix;
#endif #endif
#define DBG(...) EINA_LOG_DOM_DBG(_eolian_log_dom, __VA_ARGS__) #define DBG(...) EINA_LOG_DOM_DBG(_eolian_log_dom, __VA_ARGS__)
/* a hash holding all declarations, for redef checking etc */
extern Eina_Hash *_decls;
extern Eina_Hash *_declsf;
struct _Eolian_Unit struct _Eolian_Unit
{ {
Eolian *state; Eolian *state;
@ -45,6 +41,7 @@ struct _Eolian_Unit
Eina_Hash *aliases; Eina_Hash *aliases;
Eina_Hash *structs; Eina_Hash *structs;
Eina_Hash *enums; Eina_Hash *enums;
Eina_Hash *decls;
}; };
struct _Eolian struct _Eolian
@ -66,6 +63,7 @@ struct _Eolian
Eina_Hash *enums_f; Eina_Hash *enums_f;
Eina_Hash *globals_f; Eina_Hash *globals_f;
Eina_Hash *constants_f; Eina_Hash *constants_f;
Eina_Hash *decls_f;
}; };
typedef struct _Eolian_Object typedef struct _Eolian_Object
@ -322,7 +320,8 @@ int database_shutdown(void);
char *database_class_to_filename(const char *cname); char *database_class_to_filename(const char *cname);
Eina_Bool database_validate(Eolian *state, const Eolian_Unit *src); Eina_Bool database_validate(Eolian *state, const Eolian_Unit *src);
void database_decl_add(Eina_Stringshare *name, Eolian_Declaration_Type type, void database_decl_add(Eolian *state, Eina_Stringshare *name,
Eolian_Declaration_Type type,
Eina_Stringshare *file, void *ptr); Eina_Stringshare *file, void *ptr);
void database_doc_del(Eolian_Documentation *doc); void database_doc_del(Eolian_Documentation *doc);
@ -338,10 +337,10 @@ void database_enum_add(Eolian *state, Eolian_Typedecl *tp);
void database_type_del(Eolian_Type *tp); void database_type_del(Eolian_Type *tp);
void database_typedecl_del(Eolian_Typedecl *tp); void database_typedecl_del(Eolian_Typedecl *tp);
void database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name, Eolian_C_Type_Type ctype); void database_type_to_str(const Eolian_Unit *src, const Eolian_Type *tp, Eina_Strbuf *buf, const char *name, Eolian_C_Type_Type ctype);
void database_typedecl_to_str(const Eolian_Unit *src, const Eolian_Typedecl *tp, Eina_Strbuf *buf); void database_typedecl_to_str(const Eolian_Unit *src, const Eolian_Typedecl *tp, Eina_Strbuf *buf);
Eina_Bool database_type_is_ownable(const Eolian_Type *tp); Eina_Bool database_type_is_ownable(const Eolian_Unit *unit, const Eolian_Type *tp);
/* expressions */ /* expressions */

View File

@ -259,7 +259,7 @@ type_def const void_ {attributes::regular_type_def{"void", {qualifier_info::is_n
inline void type_def::set(Eolian_Type const* eolian_type, Eolian_Unit const* unit, Eolian_C_Type_Type ctype) inline void type_def::set(Eolian_Type const* eolian_type, Eolian_Unit const* unit, Eolian_C_Type_Type ctype)
{ {
c_type = ::eolian_type_c_type_get(eolian_type, ctype); c_type = ::eolian_type_c_type_get(unit, eolian_type, ctype);
// ::eina_stringshare_del(stringshare); // this crashes // ::eina_stringshare_del(stringshare); // this crashes
Eolian_Type const* stp = eolian_type_base_type_get(eolian_type); Eolian_Type const* stp = eolian_type_base_type_get(eolian_type);
has_own = !!::eolian_type_is_owned(eolian_type); has_own = !!::eolian_type_is_owned(eolian_type);
@ -273,7 +273,7 @@ inline void type_def::set(Eolian_Type const* eolian_type, Eolian_Unit const* uni
if (!stp) if (!stp)
{ {
bool is_undefined = false; bool is_undefined = false;
Eolian_Typedecl const* decl = eolian_type_typedecl_get(eolian_type); Eolian_Typedecl const* decl = eolian_type_typedecl_get(unit, eolian_type);
bool is_function_ptr = decl && eolian_typedecl_type_get(decl) == EOLIAN_TYPEDECL_FUNCTION_POINTER; bool is_function_ptr = decl && eolian_typedecl_type_get(decl) == EOLIAN_TYPEDECL_FUNCTION_POINTER;
if(decl && eolian_typedecl_type_get(decl) == EOLIAN_TYPEDECL_ALIAS) if(decl && eolian_typedecl_type_get(decl) == EOLIAN_TYPEDECL_ALIAS)
{ {

View File

@ -710,7 +710,8 @@ M.Type = Node:clone {
end, end,
typedecl_get = function(self) typedecl_get = function(self)
local v = self.type:typedecl_get() -- FIXME: unit
local v = self.type:typedecl_get(eos:unit_get())
if not v then if not v then
return nil return nil
end end
@ -718,7 +719,8 @@ M.Type = Node:clone {
end, end,
aliased_base_get = function(self) aliased_base_get = function(self)
local v = self.type:aliased_base_get() -- FIXME: unit
local v = self.type:aliased_base_get(eos:unit_get())
if not v then if not v then
return nil return nil
end end
@ -894,7 +896,8 @@ M.Typedecl = Node:clone {
end, end,
aliased_base_get = function(self) aliased_base_get = function(self)
local v = self.typedecl:aliased_base_get() -- FIXME: unit
local v = self.typedecl:aliased_base_get(eos:unit_get())
if not v then if not v then
return nil return nil
end end

View File

@ -102,7 +102,7 @@ end
local typeconv = function(tps, expr, isin) local typeconv = function(tps, expr, isin)
if tps:type_get() == type_type.POINTER then if tps:type_get() == type_type.POINTER then
local base = tps:base_type_get() local base = tps:base_type_get()
local f = (isin and known_ptr_in or known_ptr_out)[base:c_type_get(eolian.c_type_type.DEFAULT)] local f = (isin and known_ptr_in or known_ptr_out)[base:c_type_get(gen_unit, eolian.c_type_type.DEFAULT)]
if f then return f(expr) end if f then return f(expr) end
return build_calln(tps, expr, isin) return build_calln(tps, expr, isin)
end end
@ -188,7 +188,7 @@ local Method = Node:clone {
local proto = { local proto = {
name = meth:name_get() name = meth:name_get()
} }
proto.ret_type = rett and rett:c_type_get(eolian.c_type_type.RETURN) or "void" proto.ret_type = rett and rett:c_type_get(gen_unit, eolian.c_type_type.RETURN) or "void"
local args, cargs, vargs = { "self" }, {}, {} local args, cargs, vargs = { "self" }, {}, {}
proto.args, proto.cargs, proto.vargs = args, cargs, vargs proto.args, proto.cargs, proto.vargs = args, cargs, vargs
local rets = {} local rets = {}
@ -206,7 +206,7 @@ local Method = Node:clone {
for v in pars do for v in pars do
local dir, tps, nm = v:direction_get(), v:type_get(), kw_t(v:name_get()) local dir, tps, nm = v:direction_get(), v:type_get(), kw_t(v:name_get())
local tp = tps:c_type_get(eolian.c_type_type.PARAM) local tp = tps:c_type_get(gen_unit, eolian.c_type_type.PARAM)
if dir == param_dir.OUT or dir == param_dir.INOUT then if dir == param_dir.OUT or dir == param_dir.INOUT then
if dir == param_dir.INOUT then if dir == param_dir.INOUT then
args[#args + 1] = nm args[#args + 1] = nm
@ -283,7 +283,7 @@ local Property = Method:clone {
nkeys = #keys, nkeys = #keys,
nvals = #vals nvals = #vals
} }
proto.ret_type = rett and rett:c_type_get(eolian.c_type_type.RETURN) or "void" proto.ret_type = rett and rett:c_type_get(gen_unit, eolian.c_type_type.RETURN) or "void"
local args, cargs, vargs = { "self" }, {}, {} local args, cargs, vargs = { "self" }, {}, {}
proto.args, proto.cargs, proto.vargs = args, cargs, vargs proto.args, proto.cargs, proto.vargs = args, cargs, vargs
local rets = {} local rets = {}
@ -298,7 +298,7 @@ local Property = Method:clone {
for i, v in ipairs(keys) do for i, v in ipairs(keys) do
local nm = kw_t(v:name_get()) local nm = kw_t(v:name_get())
local tps = v:type_get() local tps = v:type_get()
local tp = tps:c_type_get(eolian.c_type_type.PARAM) local tp = tps:c_type_get(gen_unit, eolian.c_type_type.PARAM)
args [#args + 1] = nm args [#args + 1] = nm
cargs[#cargs + 1] = tp .. " " .. nm cargs[#cargs + 1] = tp .. " " .. nm
vargs[#vargs + 1] = typeconv(tps, nm, true) vargs[#vargs + 1] = typeconv(tps, nm, true)
@ -310,13 +310,13 @@ local Property = Method:clone {
if self.isget then if self.isget then
if #vals == 1 and not rett then if #vals == 1 and not rett then
local tps = vals[1]:type_get() local tps = vals[1]:type_get()
proto.ret_type = tps:c_type_get(eolian.c_type_type.PARAM) proto.ret_type = tps:c_type_get(gen_unit, eolian.c_type_type.PARAM)
rets[#rets + 1] = typeconv(tps, "v", false) rets[#rets + 1] = typeconv(tps, "v", false)
else else
for i, v in ipairs(vals) do for i, v in ipairs(vals) do
local dir, tps, nm = v:direction_get(), v:type_get(), local dir, tps, nm = v:direction_get(), v:type_get(),
kw_t(v:name_get()) kw_t(v:name_get())
local tp = tps:c_type_get(eolian.c_type_type.PARAM) local tp = tps:c_type_get(gen_unit, eolian.c_type_type.PARAM)
cargs [#cargs + 1] = tp .. " *" .. nm cargs [#cargs + 1] = tp .. " *" .. nm
vargs [#vargs + 1] = nm vargs [#vargs + 1] = nm
allocs[#allocs + 1] = { tp, nm } allocs[#allocs + 1] = { tp, nm }
@ -327,7 +327,7 @@ local Property = Method:clone {
for i, v in ipairs(vals) do for i, v in ipairs(vals) do
local dir, tps, nm = v:direction_get(), v:type_get(), local dir, tps, nm = v:direction_get(), v:type_get(),
kw_t(v:name_get()) kw_t(v:name_get())
local tp = tps:c_type_get(eolian.c_type_type.PARAM) local tp = tps:c_type_get(gen_unit, eolian.c_type_type.PARAM)
args [#args + 1] = nm args [#args + 1] = nm
cargs[#cargs + 1] = tp .. " " .. nm cargs[#cargs + 1] = tp .. " " .. nm
vargs[#vargs + 1] = typeconv(tps, nm, true) vargs[#vargs + 1] = typeconv(tps, nm, true)

View File

@ -364,7 +364,7 @@ START_TEST(eolian_typedef)
/* Lowest alias base */ /* Lowest alias base */
fail_if(!(tdl = eolian_typedecl_alias_get_by_name(unit, "Evas.Coord3"))); fail_if(!(tdl = eolian_typedecl_alias_get_by_name(unit, "Evas.Coord3")));
fail_if(!(type = eolian_typedecl_aliased_base_get(tdl))); fail_if(!(type = eolian_typedecl_aliased_base_get(unit, tdl)));
fail_if(strcmp(eolian_type_name_get(type), "int")); fail_if(strcmp(eolian_type_name_get(type), "int"));
/* Complex type */ /* Complex type */
@ -372,13 +372,13 @@ START_TEST(eolian_typedef)
fail_if(!(type_name = eolian_typedecl_name_get(tdl))); fail_if(!(type_name = eolian_typedecl_name_get(tdl)));
fail_if(strcmp(type_name, "List_Objects")); fail_if(strcmp(type_name, "List_Objects"));
fail_if(!(type = eolian_typedecl_base_type_get(tdl))); fail_if(!(type = eolian_typedecl_base_type_get(tdl)));
fail_if(!(type_name = eolian_type_c_type_get(type, EOLIAN_C_TYPE_DEFAULT))); fail_if(!(type_name = eolian_type_c_type_get(unit, type, EOLIAN_C_TYPE_DEFAULT)));
fail_if(eolian_type_is_owned(type)); fail_if(eolian_type_is_owned(type));
fail_if(strcmp(type_name, "Eina_List *")); fail_if(strcmp(type_name, "Eina_List *"));
eina_stringshare_del(type_name); eina_stringshare_del(type_name);
fail_if(!(type = eolian_type_base_type_get(type))); fail_if(!(type = eolian_type_base_type_get(type)));
fail_if(!!eolian_type_next_type_get(type)); fail_if(!!eolian_type_next_type_get(type));
fail_if(!(type_name = eolian_type_c_type_get(type, EOLIAN_C_TYPE_DEFAULT))); fail_if(!(type_name = eolian_type_c_type_get(unit, type, EOLIAN_C_TYPE_DEFAULT)));
fail_if(strcmp(type_name, "Eo *")); fail_if(strcmp(type_name, "Eo *"));
fail_if(eolian_type_is_owned(type)); fail_if(eolian_type_is_owned(type));
eina_stringshare_del(type_name); eina_stringshare_del(type_name);
@ -428,21 +428,21 @@ START_TEST(eolian_complex_type)
/* Properties return type */ /* Properties return type */
fail_if(!(fid = eolian_class_function_get_by_name(class, "a", EOLIAN_PROPERTY))); fail_if(!(fid = eolian_class_function_get_by_name(class, "a", EOLIAN_PROPERTY)));
fail_if(!(type = eolian_function_return_type_get(fid, EOLIAN_PROP_SET))); fail_if(!(type = eolian_function_return_type_get(fid, EOLIAN_PROP_SET)));
fail_if(!(type_name = eolian_type_c_type_get(type, EOLIAN_C_TYPE_RETURN))); fail_if(!(type_name = eolian_type_c_type_get(unit, type, EOLIAN_C_TYPE_RETURN)));
fail_if(!eolian_type_is_owned(type)); fail_if(!eolian_type_is_owned(type));
fail_if(eolian_type_builtin_type_get(type) != EOLIAN_TYPE_BUILTIN_LIST); fail_if(eolian_type_builtin_type_get(type) != EOLIAN_TYPE_BUILTIN_LIST);
fail_if(strcmp(type_name, "Eina_List *")); fail_if(strcmp(type_name, "Eina_List *"));
eina_stringshare_del(type_name); eina_stringshare_del(type_name);
fail_if(!(type = eolian_type_base_type_get(type))); fail_if(!(type = eolian_type_base_type_get(type)));
fail_if(!!eolian_type_next_type_get(type)); fail_if(!!eolian_type_next_type_get(type));
fail_if(!(type_name = eolian_type_c_type_get(type, EOLIAN_C_TYPE_DEFAULT))); fail_if(!(type_name = eolian_type_c_type_get(unit, type, EOLIAN_C_TYPE_DEFAULT)));
fail_if(eolian_type_is_owned(type)); fail_if(eolian_type_is_owned(type));
fail_if(eolian_type_builtin_type_get(type) != EOLIAN_TYPE_BUILTIN_ARRAY); fail_if(eolian_type_builtin_type_get(type) != EOLIAN_TYPE_BUILTIN_ARRAY);
fail_if(strcmp(type_name, "Eina_Array *")); fail_if(strcmp(type_name, "Eina_Array *"));
eina_stringshare_del(type_name); eina_stringshare_del(type_name);
fail_if(!(type = eolian_type_base_type_get(type))); fail_if(!(type = eolian_type_base_type_get(type)));
fail_if(!!eolian_type_next_type_get(type)); fail_if(!!eolian_type_next_type_get(type));
fail_if(!(type_name = eolian_type_c_type_get(type, EOLIAN_C_TYPE_DEFAULT))); fail_if(!(type_name = eolian_type_c_type_get(unit, type, EOLIAN_C_TYPE_DEFAULT)));
fail_if(!eolian_type_is_owned(type)); fail_if(!eolian_type_is_owned(type));
fail_if(strcmp(type_name, "Eo *")); fail_if(strcmp(type_name, "Eo *"));
eina_stringshare_del(type_name); eina_stringshare_del(type_name);
@ -453,13 +453,13 @@ START_TEST(eolian_complex_type)
eina_iterator_free(iter); eina_iterator_free(iter);
fail_if(strcmp(eolian_parameter_name_get(param), "value")); fail_if(strcmp(eolian_parameter_name_get(param), "value"));
fail_if(!(type = eolian_parameter_type_get(param))); fail_if(!(type = eolian_parameter_type_get(param)));
fail_if(!(type_name = eolian_type_c_type_get(type, EOLIAN_C_TYPE_PARAM))); fail_if(!(type_name = eolian_type_c_type_get(unit, type, EOLIAN_C_TYPE_PARAM)));
fail_if(!eolian_type_is_owned(type)); fail_if(!eolian_type_is_owned(type));
fail_if(strcmp(type_name, "Eina_List *")); fail_if(strcmp(type_name, "Eina_List *"));
eina_stringshare_del(type_name); eina_stringshare_del(type_name);
fail_if(!(type = eolian_type_base_type_get(type))); fail_if(!(type = eolian_type_base_type_get(type)));
fail_if(!!eolian_type_next_type_get(type)); fail_if(!!eolian_type_next_type_get(type));
fail_if(!(type_name = eolian_type_c_type_get(type, EOLIAN_C_TYPE_DEFAULT))); fail_if(!(type_name = eolian_type_c_type_get(unit, type, EOLIAN_C_TYPE_DEFAULT)));
fail_if(eolian_type_is_owned(type)); fail_if(eolian_type_is_owned(type));
fail_if(strcmp(type_name, "const char *")); fail_if(strcmp(type_name, "const char *"));
eina_stringshare_del(type_name); eina_stringshare_del(type_name);
@ -467,13 +467,13 @@ START_TEST(eolian_complex_type)
/* Methods return type */ /* Methods return type */
fail_if(!(fid = eolian_class_function_get_by_name(class, "foo", EOLIAN_METHOD))); fail_if(!(fid = eolian_class_function_get_by_name(class, "foo", EOLIAN_METHOD)));
fail_if(!(type = eolian_function_return_type_get(fid, EOLIAN_METHOD))); fail_if(!(type = eolian_function_return_type_get(fid, EOLIAN_METHOD)));
fail_if(!(type_name = eolian_type_c_type_get(type, EOLIAN_C_TYPE_RETURN))); fail_if(!(type_name = eolian_type_c_type_get(unit, type, EOLIAN_C_TYPE_RETURN)));
fail_if(!eolian_type_is_owned(type)); fail_if(!eolian_type_is_owned(type));
fail_if(strcmp(type_name, "Eina_List *")); fail_if(strcmp(type_name, "Eina_List *"));
eina_stringshare_del(type_name); eina_stringshare_del(type_name);
fail_if(!(type = eolian_type_base_type_get(type))); fail_if(!(type = eolian_type_base_type_get(type)));
fail_if(!!eolian_type_next_type_get(type)); fail_if(!!eolian_type_next_type_get(type));
fail_if(!(type_name = eolian_type_c_type_get(type, EOLIAN_C_TYPE_DEFAULT))); fail_if(!(type_name = eolian_type_c_type_get(unit, type, EOLIAN_C_TYPE_DEFAULT)));
fail_if(eolian_type_is_owned(type)); fail_if(eolian_type_is_owned(type));
fail_if(eolian_type_builtin_type_get(type) != EOLIAN_TYPE_BUILTIN_STRINGSHARE); fail_if(eolian_type_builtin_type_get(type) != EOLIAN_TYPE_BUILTIN_STRINGSHARE);
fail_if(strcmp(type_name, "Eina_Stringshare *")); fail_if(strcmp(type_name, "Eina_Stringshare *"));
@ -485,7 +485,7 @@ START_TEST(eolian_complex_type)
eina_iterator_free(iter); eina_iterator_free(iter);
fail_if(strcmp(eolian_parameter_name_get(param), "buf")); fail_if(strcmp(eolian_parameter_name_get(param), "buf"));
fail_if(!(type = eolian_parameter_type_get(param))); fail_if(!(type = eolian_parameter_type_get(param)));
fail_if(!(type_name = eolian_type_c_type_get(type, EOLIAN_C_TYPE_PARAM))); fail_if(!(type_name = eolian_type_c_type_get(unit, type, EOLIAN_C_TYPE_PARAM)));
fail_if(!eolian_type_is_owned(type)); fail_if(!eolian_type_is_owned(type));
fail_if(eolian_type_builtin_type_get(type) != EOLIAN_TYPE_BUILTIN_MSTRING); fail_if(eolian_type_builtin_type_get(type) != EOLIAN_TYPE_BUILTIN_MSTRING);
fail_if(strcmp(type_name, "char *")); fail_if(strcmp(type_name, "char *"));
@ -621,7 +621,7 @@ START_TEST(eolian_simple_parsing)
/* Function return */ /* Function return */
tp = eolian_function_return_type_get(fid, EOLIAN_METHOD); tp = eolian_function_return_type_get(fid, EOLIAN_METHOD);
fail_if(!tp); fail_if(!tp);
string = eolian_type_c_type_get(tp, EOLIAN_C_TYPE_RETURN); string = eolian_type_c_type_get(unit, tp, EOLIAN_C_TYPE_RETURN);
fail_if(!string); fail_if(!string);
fail_if(strcmp(string, "char *")); fail_if(strcmp(string, "char *"));
eina_stringshare_del(string); eina_stringshare_del(string);
@ -708,7 +708,7 @@ START_TEST(eolian_struct)
fail_if(!(field = eolian_typedecl_struct_field_get(tdl, "something"))); fail_if(!(field = eolian_typedecl_struct_field_get(tdl, "something")));
fail_if(!(ftype = eolian_typedecl_struct_field_type_get(field))); fail_if(!(ftype = eolian_typedecl_struct_field_type_get(field)));
fail_if(eolian_type_is_ptr(ftype)); fail_if(eolian_type_is_ptr(ftype));
fail_if(!(type_name = eolian_type_c_type_get(ftype, EOLIAN_C_TYPE_DEFAULT))); fail_if(!(type_name = eolian_type_c_type_get(unit, ftype, EOLIAN_C_TYPE_DEFAULT)));
fail_if(strcmp(type_name, "const char *")); fail_if(strcmp(type_name, "const char *"));
eina_stringshare_del(type_name); eina_stringshare_del(type_name);
@ -724,7 +724,7 @@ START_TEST(eolian_struct)
fail_if(!(type_name = eolian_type_name_get(ftype))); fail_if(!(type_name = eolian_type_name_get(ftype)));
fail_if(strcmp(type_name, "Named")); fail_if(strcmp(type_name, "Named"));
fail_if(eolian_type_type_get(ftype) != EOLIAN_TYPE_REGULAR); fail_if(eolian_type_type_get(ftype) != EOLIAN_TYPE_REGULAR);
fail_if(eolian_typedecl_type_get(eolian_type_typedecl_get(ftype)) fail_if(eolian_typedecl_type_get(eolian_type_typedecl_get(unit, ftype))
!= EOLIAN_TYPEDECL_STRUCT); != EOLIAN_TYPEDECL_STRUCT);
/* opaque struct */ /* opaque struct */
@ -736,7 +736,7 @@ START_TEST(eolian_struct)
fail_if(!(type = eolian_function_return_type_get(func, EOLIAN_METHOD))); fail_if(!(type = eolian_function_return_type_get(func, EOLIAN_METHOD)));
fail_if(eolian_type_type_get(type) != EOLIAN_TYPE_REGULAR); fail_if(eolian_type_type_get(type) != EOLIAN_TYPE_REGULAR);
fail_if(!eolian_type_is_ptr(type)); fail_if(!eolian_type_is_ptr(type));
fail_if(!(tdl = eolian_type_typedecl_get(type))); fail_if(!(tdl = eolian_type_typedecl_get(unit, type)));
fail_if(eolian_typedecl_type_get(tdl) != EOLIAN_TYPEDECL_STRUCT); fail_if(eolian_typedecl_type_get(tdl) != EOLIAN_TYPEDECL_STRUCT);
eolian_free(eos); eolian_free(eos);
@ -1468,20 +1468,20 @@ START_TEST(eolian_function_types)
fail_if(strcmp(eolian_function_name_get(fid), "SimpleFunc")); fail_if(strcmp(eolian_function_name_get(fid), "SimpleFunc"));
fail_if(!(type = eolian_function_return_type_get(fid, EOLIAN_FUNCTION_POINTER))); // void is null_return_type? fail_if(!(type = eolian_function_return_type_get(fid, EOLIAN_FUNCTION_POINTER))); // void is null_return_type?
fail_if(!(type_name = eolian_type_c_type_get(type, EOLIAN_C_TYPE_RETURN))); fail_if(!(type_name = eolian_type_c_type_get(unit, type, EOLIAN_C_TYPE_RETURN)));
fail_if(strcmp(type_name, "const char *")); fail_if(strcmp(type_name, "const char *"));
fail_if(!(iter = (eolian_function_parameters_get(fid)))); fail_if(!(iter = (eolian_function_parameters_get(fid))));
fail_if(!(eina_iterator_next(iter, (void**)&param))); fail_if(!(eina_iterator_next(iter, (void**)&param)));
fail_if(strcmp(eolian_parameter_name_get(param), "a")); fail_if(strcmp(eolian_parameter_name_get(param), "a"));
fail_if(!(type = eolian_parameter_type_get(param))); fail_if(!(type = eolian_parameter_type_get(param)));
fail_if(!(type_name = eolian_type_c_type_get(type, EOLIAN_C_TYPE_PARAM))); fail_if(!(type_name = eolian_type_c_type_get(unit, type, EOLIAN_C_TYPE_PARAM)));
fail_if(strcmp(type_name, "int")); fail_if(strcmp(type_name, "int"));
fail_if(!(eina_iterator_next(iter, (void**)&param))); fail_if(!(eina_iterator_next(iter, (void**)&param)));
fail_if(strcmp(eolian_parameter_name_get(param), "b")); fail_if(strcmp(eolian_parameter_name_get(param), "b"));
fail_if(!(type = eolian_parameter_type_get(param))); fail_if(!(type = eolian_parameter_type_get(param)));
fail_if(!(type_name = eolian_type_c_type_get(type, EOLIAN_C_TYPE_PARAM))); fail_if(!(type_name = eolian_type_c_type_get(unit, type, EOLIAN_C_TYPE_PARAM)));
fail_if(strcmp(type_name, "double")); fail_if(strcmp(type_name, "double"));
fail_if(eina_iterator_next(iter, &dummy)); fail_if(eina_iterator_next(iter, &dummy));
@ -1494,7 +1494,7 @@ START_TEST(eolian_function_types)
fail_if(eolian_function_type_get(fid) != EOLIAN_FUNCTION_POINTER); fail_if(eolian_function_type_get(fid) != EOLIAN_FUNCTION_POINTER);
fail_if(!(type = eolian_function_return_type_get(fid, EOLIAN_FUNCTION_POINTER))); fail_if(!(type = eolian_function_return_type_get(fid, EOLIAN_FUNCTION_POINTER)));
fail_if(!(type_name = eolian_type_c_type_get(type, EOLIAN_C_TYPE_RETURN))); fail_if(!(type_name = eolian_type_c_type_get(unit, type, EOLIAN_C_TYPE_RETURN)));
fail_if(strcmp(type_name, "double")); fail_if(strcmp(type_name, "double"));
fail_if(!(iter = (eolian_function_parameters_get(fid)))); fail_if(!(iter = (eolian_function_parameters_get(fid))));
@ -1504,7 +1504,7 @@ START_TEST(eolian_function_types)
fail_if(!(type = eolian_parameter_type_get(param))); fail_if(!(type = eolian_parameter_type_get(param)));
fail_if(eolian_parameter_direction_get(param) != EOLIAN_IN_PARAM); fail_if(eolian_parameter_direction_get(param) != EOLIAN_IN_PARAM);
fail_if(eolian_type_is_owned(type)); fail_if(eolian_type_is_owned(type));
fail_if(!(type_name = eolian_type_c_type_get(type, EOLIAN_C_TYPE_PARAM))); fail_if(!(type_name = eolian_type_c_type_get(unit, type, EOLIAN_C_TYPE_PARAM)));
fail_if(strcmp(type_name, "const char *")); fail_if(strcmp(type_name, "const char *"));
/*out own string */ /*out own string */
@ -1513,7 +1513,7 @@ START_TEST(eolian_function_types)
fail_if(eolian_parameter_direction_get(param) != EOLIAN_OUT_PARAM); fail_if(eolian_parameter_direction_get(param) != EOLIAN_OUT_PARAM);
fail_if(!(type = eolian_parameter_type_get(param))); fail_if(!(type = eolian_parameter_type_get(param)));
fail_if(!eolian_type_is_owned(type)); fail_if(!eolian_type_is_owned(type));
fail_if(!(type_name = eolian_type_c_type_get(type, EOLIAN_C_TYPE_PARAM))); fail_if(!(type_name = eolian_type_c_type_get(unit, type, EOLIAN_C_TYPE_PARAM)));
fail_if(strcmp(type_name, "char *")); fail_if(strcmp(type_name, "char *"));
fail_if(eina_iterator_next(iter, &dummy)); fail_if(eina_iterator_next(iter, &dummy));
@ -1536,7 +1536,7 @@ START_TEST(eolian_function_types)
fail_if(eolian_type_is_owned(type)); fail_if(eolian_type_is_owned(type));
fail_if(!(type_name = eolian_type_name_get(type))); fail_if(!(type_name = eolian_type_name_get(type)));
fail_if(strcmp(type_name, "VoidFunc")); fail_if(strcmp(type_name, "VoidFunc"));
fail_if(!(arg_decl = eolian_type_typedecl_get(type))); fail_if(!(arg_decl = eolian_type_typedecl_get(unit, type)));
fail_if(eolian_typedecl_type_get(arg_decl) != EOLIAN_TYPEDECL_FUNCTION_POINTER); fail_if(eolian_typedecl_type_get(arg_decl) != EOLIAN_TYPEDECL_FUNCTION_POINTER);
fail_if(!(eina_iterator_next(iter, (void**)&param))); fail_if(!(eina_iterator_next(iter, (void**)&param)));
@ -1547,7 +1547,7 @@ START_TEST(eolian_function_types)
fail_if(eolian_type_type_get(type) != EOLIAN_TYPE_REGULAR); fail_if(eolian_type_type_get(type) != EOLIAN_TYPE_REGULAR);
fail_if(!(type_name = eolian_type_name_get(type))); fail_if(!(type_name = eolian_type_name_get(type)));
fail_if(strcmp(type_name, "SimpleFunc")); fail_if(strcmp(type_name, "SimpleFunc"));
fail_if(!(arg_decl = eolian_type_typedecl_get(type))); fail_if(!(arg_decl = eolian_type_typedecl_get(unit, type)));
fail_if(eolian_typedecl_type_get(arg_decl) != EOLIAN_TYPEDECL_FUNCTION_POINTER); fail_if(eolian_typedecl_type_get(arg_decl) != EOLIAN_TYPEDECL_FUNCTION_POINTER);
fail_if(eina_iterator_next(iter, &dummy)); fail_if(eina_iterator_next(iter, &dummy));
@ -1589,7 +1589,7 @@ START_TEST(eolian_function_as_arguments)
fail_if(eolian_type_is_owned(type)); fail_if(eolian_type_is_owned(type));
fail_if(!(type_name = eolian_type_name_get(type))); fail_if(!(type_name = eolian_type_name_get(type)));
fail_if(strcmp(type_name, "SimpleFunc")); fail_if(strcmp(type_name, "SimpleFunc"));
fail_if(!(arg_decl = eolian_type_typedecl_get(type))); fail_if(!(arg_decl = eolian_type_typedecl_get(unit, type)));
fail_if(eolian_typedecl_type_get(arg_decl) != EOLIAN_TYPEDECL_FUNCTION_POINTER); fail_if(eolian_typedecl_type_get(arg_decl) != EOLIAN_TYPEDECL_FUNCTION_POINTER);
fail_if(eina_iterator_next(iter, &dummy)); fail_if(eina_iterator_next(iter, &dummy));