forked from enlightenment/efl
eolian: restrict usage of ptr() to directly used types
That means, it can only now be used on parameters and struct fields, never aliased within typedefs. This simplifies the logic so that we don't have ptr metadata buried several layers deep.
This commit is contained in:
parent
b59d2e049c
commit
9674dadbda
|
@ -404,14 +404,14 @@ parse_expr(Eo_Lexer *ls)
|
|||
return parse_expr_bin(ls, 1);
|
||||
}
|
||||
|
||||
static Eolian_Type *parse_type_void(Eo_Lexer *ls);
|
||||
static Eolian_Type *parse_type_void(Eo_Lexer *ls, Eina_Bool allow_ptr);
|
||||
|
||||
static Eolian_Type *
|
||||
parse_type(Eo_Lexer *ls)
|
||||
parse_type(Eo_Lexer *ls, Eina_Bool allow_ptr)
|
||||
{
|
||||
Eolian_Type *ret;
|
||||
eo_lexer_context_push(ls);
|
||||
ret = parse_type_void(ls);
|
||||
ret = parse_type_void(ls, allow_ptr);
|
||||
if (ret->type == EOLIAN_TYPE_VOID)
|
||||
{
|
||||
eo_lexer_context_restore(ls);
|
||||
|
@ -464,7 +464,7 @@ parse_struct(Eo_Lexer *ls, const char *name, Eina_Bool is_extern,
|
|||
eolian_object_ref(&fdef->base);
|
||||
eo_lexer_get(ls);
|
||||
check_next(ls, ':');
|
||||
tp = parse_type(ls);
|
||||
tp = parse_type(ls, EINA_TRUE);
|
||||
FILL_BASE(fdef->base, ls, fline, fcol, STRUCT_FIELD);
|
||||
fdef->type = eo_lexer_type_release(ls, tp);
|
||||
fdef->base.name = eina_stringshare_ref(fname);
|
||||
|
@ -628,7 +628,7 @@ parse_struct_attrs(Eo_Lexer *ls, Eina_Bool is_enum, Eina_Bool *is_extern,
|
|||
}
|
||||
|
||||
static Eolian_Type *
|
||||
parse_type_void(Eo_Lexer *ls)
|
||||
parse_type_void(Eo_Lexer *ls, Eina_Bool allow_ptr)
|
||||
{
|
||||
Eolian_Type *def;
|
||||
Eina_Strbuf *buf;
|
||||
|
@ -642,7 +642,7 @@ parse_type_void(Eo_Lexer *ls)
|
|||
pline = ls->line_number;
|
||||
pcol = ls->column;
|
||||
check_next(ls, '(');
|
||||
def = parse_type_void(ls);
|
||||
def = parse_type_void(ls, allow_ptr);
|
||||
FILL_BASE(def->base, ls, line, col, TYPE);
|
||||
def->is_const = EINA_TRUE;
|
||||
check_match(ls, ')', '(', pline, pcol);
|
||||
|
@ -650,12 +650,14 @@ parse_type_void(Eo_Lexer *ls)
|
|||
}
|
||||
case KW_ptr:
|
||||
{
|
||||
if (!allow_ptr)
|
||||
break;
|
||||
int pline, pcol;
|
||||
eo_lexer_get(ls);
|
||||
pline = ls->line_number;
|
||||
pcol = ls->column;
|
||||
check_next(ls, '(');
|
||||
def = parse_type_void(ls);
|
||||
def = parse_type_void(ls, EINA_FALSE);
|
||||
FILL_BASE(def->base, ls, line, col, TYPE);
|
||||
def->is_ptr = EINA_TRUE;
|
||||
check_match(ls, ')', '(', pline, pcol);
|
||||
|
@ -668,7 +670,7 @@ parse_type_void(Eo_Lexer *ls)
|
|||
pline = ls->line_number;
|
||||
pcol = ls->column;
|
||||
check_next(ls, '(');
|
||||
def = parse_type_void(ls);
|
||||
def = parse_type_void(ls, allow_ptr);
|
||||
FILL_BASE(def->base, ls, line, col, TYPE);
|
||||
def->legacy = EINA_TRUE;
|
||||
check_match(ls, ')', '(', pline, pcol);
|
||||
|
@ -681,7 +683,7 @@ parse_type_void(Eo_Lexer *ls)
|
|||
pline = ls->line_number;
|
||||
pcolumn = ls->column;
|
||||
check_next(ls, '(');
|
||||
def = parse_type_void(ls);
|
||||
def = parse_type_void(ls, allow_ptr);
|
||||
check_next(ls, ',');
|
||||
check(ls, TOK_VALUE);
|
||||
def->freefunc = eina_stringshare_ref(ls->t.value.s);
|
||||
|
@ -721,16 +723,16 @@ parse_type_void(Eo_Lexer *ls)
|
|||
int bline = ls->line_number, bcol = ls->column;
|
||||
check_next(ls, '<');
|
||||
if (tpid == KW_future)
|
||||
def->base_type = eo_lexer_type_release(ls, parse_type_void(ls));
|
||||
def->base_type = eo_lexer_type_release(ls, parse_type_void(ls, EINA_TRUE));
|
||||
else
|
||||
def->base_type = eo_lexer_type_release(ls, parse_type(ls));
|
||||
def->base_type = eo_lexer_type_release(ls, parse_type(ls, EINA_TRUE));
|
||||
if ((def->base_type->owned = (ls->t.kw == KW_at_owned)))
|
||||
eo_lexer_get(ls);
|
||||
if (tpid == KW_hash)
|
||||
{
|
||||
check_next(ls, ',');
|
||||
def->base_type->next_type =
|
||||
eo_lexer_type_release(ls, parse_type(ls));
|
||||
eo_lexer_type_release(ls, parse_type(ls, EINA_TRUE));
|
||||
if ((def->base_type->next_type->owned = (ls->t.kw == KW_at_owned)))
|
||||
eo_lexer_get(ls);
|
||||
}
|
||||
|
@ -802,7 +804,7 @@ parse_typedef(Eo_Lexer *ls)
|
|||
}
|
||||
eo_lexer_context_pop(ls);
|
||||
check_next(ls, ':');
|
||||
def->base_type = eo_lexer_type_release(ls, parse_type(ls));
|
||||
def->base_type = eo_lexer_type_release(ls, parse_type(ls, EINA_FALSE));
|
||||
check_next(ls, ';');
|
||||
FILL_DOC(ls, def, doc);
|
||||
eo_lexer_dtor_pop(ls);
|
||||
|
@ -835,7 +837,7 @@ parse_variable(Eo_Lexer *ls, Eina_Bool global)
|
|||
}
|
||||
eo_lexer_context_pop(ls);
|
||||
check_next(ls, ':');
|
||||
def->base_type = eo_lexer_type_release(ls, parse_type(ls));
|
||||
def->base_type = eo_lexer_type_release(ls, parse_type(ls, EINA_TRUE));
|
||||
/* constants are required to have a value */
|
||||
if (!global)
|
||||
check(ls, '=');
|
||||
|
@ -870,9 +872,9 @@ parse_return(Eo_Lexer *ls, Eo_Ret_Def *ret, Eina_Bool allow_void,
|
|||
eo_lexer_get(ls);
|
||||
check_next(ls, ':');
|
||||
if (allow_void)
|
||||
ret->type = parse_type_void(ls);
|
||||
ret->type = parse_type_void(ls, EINA_TRUE);
|
||||
else
|
||||
ret->type = parse_type(ls);
|
||||
ret->type = parse_type(ls, EINA_TRUE);
|
||||
ret->doc = NULL;
|
||||
ret->default_ret_val = NULL;
|
||||
ret->warn_unused = EINA_FALSE;
|
||||
|
@ -940,9 +942,9 @@ parse_param(Eo_Lexer *ls, Eina_List **params, Eina_Bool allow_inout,
|
|||
eo_lexer_get(ls);
|
||||
check_next(ls, ':');
|
||||
if (par->param_dir == EOLIAN_OUT_PARAM || par->param_dir == EOLIAN_INOUT_PARAM)
|
||||
par->type = eo_lexer_type_release(ls, parse_type_void(ls));
|
||||
par->type = eo_lexer_type_release(ls, parse_type_void(ls, EINA_TRUE));
|
||||
else
|
||||
par->type = eo_lexer_type_release(ls, parse_type(ls));
|
||||
par->type = eo_lexer_type_release(ls, parse_type(ls, EINA_TRUE));
|
||||
if ((is_vals || (par->param_dir == EOLIAN_OUT_PARAM)) && (ls->t.token == '('))
|
||||
{
|
||||
int line = ls->line_number, col = ls->column;
|
||||
|
@ -1775,7 +1777,7 @@ parse_event(Eo_Lexer *ls)
|
|||
}
|
||||
end:
|
||||
check_next(ls, ':');
|
||||
ev->type = eo_lexer_type_release(ls, parse_type_void(ls));
|
||||
ev->type = eo_lexer_type_release(ls, parse_type_void(ls, EINA_TRUE));
|
||||
ev->type->owned = has_owned;
|
||||
check(ls, ';');
|
||||
eo_lexer_get(ls);
|
||||
|
|
|
@ -6,18 +6,10 @@ struct @free(test_free) Named2 {
|
|||
field: int;
|
||||
}
|
||||
|
||||
/* typedef */
|
||||
type Typedef1: int;
|
||||
type @free(def_free) Typedef2: int;
|
||||
|
||||
/* opaque */
|
||||
struct Opaque1;
|
||||
struct @free(opaque_free) Opaque2;
|
||||
|
||||
/* pointers */
|
||||
type Pointer1: ptr(char);
|
||||
type Pointer2: free(ptr(char), ptr_free);
|
||||
|
||||
class Free_Func {
|
||||
methods {
|
||||
foo {
|
||||
|
|
|
@ -981,7 +981,6 @@ EFL_START_TEST(eolian_free_func)
|
|||
{
|
||||
const Eolian_Class *class;
|
||||
const Eolian_Typedecl *tdl;
|
||||
const Eolian_Type *type;
|
||||
const Eolian_Unit *unit;
|
||||
|
||||
Eolian_State *eos = eolian_state_new();
|
||||
|
@ -1000,26 +999,12 @@ EFL_START_TEST(eolian_free_func)
|
|||
fail_if(!(tdl = eolian_unit_struct_by_name_get(unit, "Named2")));
|
||||
fail_if(strcmp(eolian_typedecl_free_func_get(tdl), "test_free"));
|
||||
|
||||
/* typedef */
|
||||
fail_if(!(tdl = eolian_unit_alias_by_name_get(unit, "Typedef1")));
|
||||
fail_if(eolian_typedecl_free_func_get(tdl));
|
||||
fail_if(!(tdl = eolian_unit_alias_by_name_get(unit, "Typedef2")));
|
||||
fail_if(strcmp(eolian_typedecl_free_func_get(tdl), "def_free"));
|
||||
|
||||
/* opaque struct */
|
||||
fail_if(!(tdl = eolian_unit_struct_by_name_get(unit, "Opaque1")));
|
||||
fail_if(eolian_typedecl_free_func_get(tdl));
|
||||
fail_if(!(tdl = eolian_unit_struct_by_name_get(unit, "Opaque2")));
|
||||
fail_if(strcmp(eolian_typedecl_free_func_get(tdl), "opaque_free"));
|
||||
|
||||
/* pointer */
|
||||
fail_if(!(tdl = eolian_unit_alias_by_name_get(unit, "Pointer1")));
|
||||
fail_if(!(type = eolian_typedecl_base_type_get(tdl)));
|
||||
fail_if(eolian_type_free_func_get(type));
|
||||
fail_if(!(tdl = eolian_unit_alias_by_name_get(unit, "Pointer2")));
|
||||
fail_if(!(type = eolian_typedecl_base_type_get(tdl)));
|
||||
fail_if(strcmp(eolian_type_free_func_get(type), "ptr_free"));
|
||||
|
||||
eolian_state_free(eos);
|
||||
}
|
||||
EFL_END_TEST
|
||||
|
|
Loading…
Reference in New Issue