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:
Daniel Kolesa 2019-02-17 02:11:02 +01:00
parent b59d2e049c
commit 9674dadbda
3 changed files with 21 additions and 42 deletions

View File

@ -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);

View File

@ -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 {

View File

@ -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