summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Kolesa <d.kolesa@osg.samsung.com>2018-01-16 15:30:58 +0100
committerDaniel Kolesa <d.kolesa@osg.samsung.com>2018-01-16 16:37:52 +0100
commit29a9b9ad44ee7ec34f288d623542fc624d9fa410 (patch)
tree32f8af8914c49cdb35228a54179ed6191809c1a7
parent5555726fef16e8e1c5ec907e0fcdcadeecea694c (diff)
downloadefl-29a9b9ad44ee7ec34f288d623542fc624d9fa410.tar.gz
eolian: expose _eval_type to internals
-rw-r--r--src/lib/eolian/database_expr.c75
-rw-r--r--src/lib/eolian/database_expr_api.c79
-rw-r--r--src/lib/eolian/eolian_database.h1
3 files changed, 79 insertions, 76 deletions
diff --git a/src/lib/eolian/database_expr.c b/src/lib/eolian/database_expr.c
index f22a09e308..eb2dc17e37 100644
--- a/src/lib/eolian/database_expr.c
+++ b/src/lib/eolian/database_expr.c
@@ -7,6 +7,7 @@
#include <Eina.h>
#include "eolian_database.h"
#include "eolian_priv.h"
+#include "eo_lexer.h"
static Eina_Bool
node_error(const Eolian_Object *obj, const char *msg)
@@ -575,6 +576,80 @@ database_expr_eval(const Eolian_Unit *unit, const Eolian_Expression *expr,
return ret;
}
+Eolian_Value
+database_expr_eval_type(const Eolian_Unit *unit, const Eolian_Expression *expr,
+ const Eolian_Type *type)
+{
+ Eolian_Value err;
+ err.type = EOLIAN_EXPR_UNKNOWN;
+ if (!type)
+ return err;
+ switch (type->type)
+ {
+ case EOLIAN_TYPE_CLASS:
+ return database_expr_eval(unit, expr, EOLIAN_MASK_NULL);
+ case EOLIAN_TYPE_REGULAR:
+ {
+ if (database_type_is_ownable(unit, type))
+ return database_expr_eval(unit, expr, EOLIAN_MASK_NULL);
+ int kw = eo_lexer_keyword_str_to_id(type->name);
+ if (!kw || kw < KW_byte || kw >= KW_void)
+ {
+ const Eolian_Typedecl *base = database_type_decl_find(unit, type);
+ if (!base)
+ return err;
+ if (base->type == EOLIAN_TYPEDECL_ALIAS)
+ return database_expr_eval_type(unit, expr, eolian_typedecl_base_type_get(base));
+ else if (base->type == EOLIAN_TYPEDECL_ENUM)
+ return database_expr_eval(unit, expr, EOLIAN_MASK_INT);
+ return err;
+ }
+ switch (kw)
+ {
+ case KW_byte:
+ case KW_short:
+ case KW_int:
+ case KW_long:
+ case KW_llong:
+ case KW_int8:
+ case KW_int16:
+ case KW_int32:
+ case KW_int64:
+ case KW_int128:
+ case KW_ssize:
+ case KW_intptr:
+ case KW_ptrdiff:
+ return database_expr_eval(unit, expr, EOLIAN_MASK_SINT);
+ case KW_ubyte:
+ case KW_ushort:
+ case KW_uint:
+ case KW_ulong:
+ case KW_ullong:
+ case KW_uint8:
+ case KW_uint16:
+ case KW_uint32:
+ case KW_uint64:
+ case KW_uint128:
+ case KW_size:
+ case KW_uintptr:
+ case KW_time:
+ return database_expr_eval(unit, expr, EOLIAN_MASK_UINT);
+ case KW_float:
+ case KW_double:
+ return database_expr_eval(unit, expr, EOLIAN_MASK_FLOAT);
+ case KW_bool:
+ return database_expr_eval(unit, expr, EOLIAN_MASK_BOOL);
+ case KW_char:
+ return database_expr_eval(unit, expr, EOLIAN_MASK_CHAR);
+ default:
+ return err;
+ }
+ }
+ default:
+ return err;
+ }
+}
+
void
database_expr_del(Eolian_Expression *expr)
{
diff --git a/src/lib/eolian/database_expr_api.c b/src/lib/eolian/database_expr_api.c
index 791d59e104..b1fadcb6ce 100644
--- a/src/lib/eolian/database_expr_api.c
+++ b/src/lib/eolian/database_expr_api.c
@@ -3,7 +3,8 @@
#endif
#include <Eina.h>
-#include "eo_lexer.h"
+
+#include "eolian_database.h"
EAPI Eolian_Value
eolian_expression_eval(const Eolian_Unit *unit, const Eolian_Expression *expr,
@@ -15,80 +16,6 @@ eolian_expression_eval(const Eolian_Unit *unit, const Eolian_Expression *expr,
return database_expr_eval(unit, expr, m);
}
-static Eolian_Value
-_eval_type(const Eolian_Unit *unit, const Eolian_Expression *expr,
- const Eolian_Type *type)
-{
- Eolian_Value err;
- err.type = EOLIAN_EXPR_UNKNOWN;
- if (!type)
- return err;
- switch (type->type)
- {
- case EOLIAN_TYPE_CLASS:
- return database_expr_eval(unit, expr, EOLIAN_MASK_NULL);
- case EOLIAN_TYPE_REGULAR:
- {
- if (database_type_is_ownable(unit, type))
- return database_expr_eval(unit, expr, EOLIAN_MASK_NULL);
- int kw = eo_lexer_keyword_str_to_id(type->name);
- if (!kw || kw < KW_byte || kw >= KW_void)
- {
- const Eolian_Typedecl *base = database_type_decl_find(unit, type);
- if (!base)
- return err;
- if (base->type == EOLIAN_TYPEDECL_ALIAS)
- return _eval_type(unit, expr, eolian_typedecl_base_type_get(base));
- else if (base->type == EOLIAN_TYPEDECL_ENUM)
- return database_expr_eval(unit, expr, EOLIAN_MASK_INT);
- return err;
- }
- switch (kw)
- {
- case KW_byte:
- case KW_short:
- case KW_int:
- case KW_long:
- case KW_llong:
- case KW_int8:
- case KW_int16:
- case KW_int32:
- case KW_int64:
- case KW_int128:
- case KW_ssize:
- case KW_intptr:
- case KW_ptrdiff:
- return database_expr_eval(unit, expr, EOLIAN_MASK_SINT);
- case KW_ubyte:
- case KW_ushort:
- case KW_uint:
- case KW_ulong:
- case KW_ullong:
- case KW_uint8:
- case KW_uint16:
- case KW_uint32:
- case KW_uint64:
- case KW_uint128:
- case KW_size:
- case KW_uintptr:
- case KW_time:
- return database_expr_eval(unit, expr, EOLIAN_MASK_UINT);
- case KW_float:
- case KW_double:
- return database_expr_eval(unit, expr, EOLIAN_MASK_FLOAT);
- case KW_bool:
- return database_expr_eval(unit, expr, EOLIAN_MASK_BOOL);
- case KW_char:
- return database_expr_eval(unit, expr, EOLIAN_MASK_CHAR);
- default:
- return err;
- }
- }
- default:
- return err;
- }
-}
-
EAPI Eolian_Value
eolian_expression_eval_type(const Eolian_Unit *unit,
const Eolian_Expression *expr,
@@ -97,7 +24,7 @@ eolian_expression_eval_type(const Eolian_Unit *unit,
Eolian_Value err;
err.type = EOLIAN_EXPR_UNKNOWN;
EINA_SAFETY_ON_NULL_RETURN_VAL(expr, err);
- return _eval_type(unit, expr, type);
+ return database_expr_eval_type(unit, expr, type);
}
static void
diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h
index 5f804a5aa9..23a569206a 100644
--- a/src/lib/eolian/eolian_database.h
+++ b/src/lib/eolian/eolian_database.h
@@ -348,6 +348,7 @@ Eina_Bool database_type_is_ownable(const Eolian_Unit *unit, const Eolian_Type *t
/* expressions */
Eolian_Value database_expr_eval(const Eolian_Unit *unit, const Eolian_Expression *expr, Eolian_Expression_Mask mask);
+Eolian_Value database_expr_eval_type(const Eolian_Unit *unit, const Eolian_Expression *expr, const Eolian_Type *type);
void database_expr_del(Eolian_Expression *expr);
void database_expr_print(Eolian_Expression *expr);