From 0e2dee5b2efcb192d6ff34d5bcf8f470f4cfe691 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Wed, 27 May 2015 11:00:08 +0100 Subject: [PATCH] eolian: make sure CLASS/COMPLEX type is always pointer backed --- src/lib/eolian/eo_parser.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c index 5ab85e2144..48a102fd92 100644 --- a/src/lib/eolian/eo_parser.c +++ b/src/lib/eolian/eo_parser.c @@ -686,7 +686,7 @@ _parse_dep(Eo_Lexer *ls, const char *fname, const char *name) } static Eolian_Type * -parse_type_void(Eo_Lexer *ls) +parse_type_void_base(Eo_Lexer *ls, Eina_Bool noptr) { Eolian_Type *def; const char *ctype; @@ -701,7 +701,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_base(ls, EINA_TRUE); FILL_BASE(def->base, ls, line, col); def->is_const = EINA_TRUE; check_match(ls, ')', '(', pline, pcol); @@ -715,7 +715,7 @@ parse_type_void(Eo_Lexer *ls) pcolumn = ls->column; check_next(ls, '('); eo_lexer_context_push(ls); - def = parse_type_void(ls); + def = parse_type_void_base(ls, EINA_TRUE); if (def->type != EOLIAN_TYPE_POINTER) { eo_lexer_context_restore(ls); @@ -735,7 +735,7 @@ parse_type_void(Eo_Lexer *ls) pcolumn = ls->column; check_next(ls, '('); eo_lexer_context_push(ls); - def = parse_type_void(ls); + def = parse_type_void_base(ls, EINA_TRUE); if (def->type != EOLIAN_TYPE_POINTER) { eo_lexer_context_restore(ls); @@ -823,6 +823,9 @@ parse_type_void(Eo_Lexer *ls) } } parse_ptr: + /* check: complex/class type must always be behind a pointer */ + if (!noptr && ((def->type == EOLIAN_TYPE_CLASS) || (def->type == EOLIAN_TYPE_COMPLEX))) + check(ls, '*'); while (ls->t.token == '*') { Eolian_Type *pdef; @@ -837,6 +840,12 @@ parse_ptr: return def; } +static Eolian_Type * +parse_type_void(Eo_Lexer *ls) +{ + return parse_type_void_base(ls, EINA_FALSE); +} + static Eolian_Type * parse_typedef(Eo_Lexer *ls) {