q66 pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=2a9be1f5bed19ec109044f4bba40e96c33a6a5a7

commit 2a9be1f5bed19ec109044f4bba40e96c33a6a5a7
Author: Daniel Kolesa <[email protected]>
Date:   Fri Sep 8 14:43:19 2017 +0200

    eolian: move terminated_array typecheck to validate pass
---
 src/lib/eolian/database_validate.c | 24 +++++++++++++++++++++++-
 src/lib/eolian/eo_parser.c         | 21 ---------------------
 2 files changed, 23 insertions(+), 22 deletions(-)

diff --git a/src/lib/eolian/database_validate.c 
b/src/lib/eolian/database_validate.c
index a177443313..9519dee508 100644
--- a/src/lib/eolian/database_validate.c
+++ b/src/lib/eolian/database_validate.c
@@ -128,6 +128,20 @@ _validate_typedecl(const Eolian_Typedecl *tp)
 }
 
 static Eina_Bool
+_type_is_terminatable(const Eolian_Type *tp)
+{
+   if (database_type_is_ownable(tp))
+     return EINA_TRUE;
+   if (tp->type == EOLIAN_TYPE_REGULAR)
+     {
+        int kwid = eo_lexer_keyword_str_to_id(tp->name);
+        /* don't include bool, it only has 2 values so it's useless */
+        return (kwid >= KW_byte && kwid < KW_bool);
+     }
+   return EINA_FALSE;
+}
+
+static Eina_Bool
 _validate_type(const Eolian_Type *tp)
 {
    char buf[256];
@@ -160,8 +174,16 @@ _validate_type(const Eolian_Type *tp)
              }
            return _validate_typedecl(tpp);
         }
-      case EOLIAN_TYPE_STATIC_ARRAY:
       case EOLIAN_TYPE_TERMINATED_ARRAY:
+        if (!_type_is_terminatable(tp->base_type))
+          {
+             snprintf(buf, sizeof(buf),
+                      "invalid base type '%s' for terminated array",
+                      tp->base_type->full_name);
+             return _type_error(tp, buf);
+          }
+        return _validate_type(tp->base_type);
+      case EOLIAN_TYPE_STATIC_ARRAY:
         return _validate_type(tp->base_type);
       case EOLIAN_TYPE_CLASS:
         {
diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c
index a0e5c83c2c..5a3599f9c0 100644
--- a/src/lib/eolian/eo_parser.c
+++ b/src/lib/eolian/eo_parser.c
@@ -684,20 +684,6 @@ _parse_dep(Eo_Lexer *ls, const char *fname, const char 
*name)
      }
 }
 
-static Eina_Bool
-_type_is_terminatable(Eolian_Type *tp)
-{
-   if (database_type_is_ownable(tp))
-     return EINA_TRUE;
-   if (tp->type == EOLIAN_TYPE_REGULAR)
-     {
-        int kwid = eo_lexer_keyword_str_to_id(tp->name);
-        /* don't include bool, it only has 2 values so it's useless */
-        return (kwid >= KW_byte && kwid < KW_bool);
-     }
-   return EINA_FALSE;
-}
-
 static Eolian_Type *
 parse_type_void(Eo_Lexer *ls, Eina_Bool allow_ref, Eina_Bool allow_sarray)
 {
@@ -814,14 +800,7 @@ parse_type_void(Eo_Lexer *ls, Eina_Bool allow_ref, 
Eina_Bool allow_sarray)
         def->type = EOLIAN_TYPE_TERMINATED_ARRAY;
         eo_lexer_get(ls);
         check_next(ls, '<');
-        eo_lexer_context_push(ls);
         def->base_type = parse_type(ls, EINA_FALSE, EINA_FALSE);
-        if (!_type_is_terminatable(def->base_type))
-          {
-             eo_lexer_context_restore(ls);
-             eo_lexer_syntax_error(ls, "terminatable type expected");
-          }
-        eo_lexer_context_pop(ls);
         pop_type(ls);
         check_next(ls, '>');
      }

-- 


Reply via email to