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