eolian: unary expr eval for floats and add a signed number mask

This adds a new mask for all signed numbers (sint + float) and
fixes unary expr evaluation for floats, as well as fixes eval
error messages.
This commit is contained in:
Daniel Kolesa 2016-12-14 17:28:50 +01:00
parent b4740389f9
commit c813e94606
5 changed files with 19 additions and 14 deletions

View File

@ -109,6 +109,7 @@ ffi.cdef [[
EOLIAN_MASK_STRING = 1 << 4,
EOLIAN_MASK_CHAR = 1 << 5,
EOLIAN_MASK_NULL = 1 << 6,
EOLIAN_MASK_SIGNED = EOLIAN_MASK_SINT | EOLIAN_MASK_FLOAT,
EOLIAN_MASK_NUMBER = EOLIAN_MASK_INT | EOLIAN_MASK_FLOAT,
EOLIAN_MASK_ALL = EOLIAN_MASK_NUMBER | EOLIAN_MASK_BOOL
| EOLIAN_MASK_STRING | EOLIAN_MASK_CHAR
@ -1222,6 +1223,7 @@ M.expression_mask = {
local emask = M.expression_mask
emask.INT = bit.bor(emask.SINT , emask.UINT )
emask.SIGNED = bit.bor(emask.SINT , emask.FLOAT)
emask.NUMBER = bit.bor(emask.INT , emask.FLOAT)
emask.ALL = bit.bor(emask.NUMBER, emask.BOOL,
emask.STRING, emask.CHAR, emask.NULL)

View File

@ -19,7 +19,7 @@ class Efl.Loop.Timer (Efl.Loop_User)
get {
}
values {
in: double(-1); [[The new interval in seconds]]
in: double(-1.0); [[The new interval in seconds]]
}
}
@property pending {

View File

@ -254,6 +254,7 @@ typedef enum
EOLIAN_MASK_STRING = 1 << 4,
EOLIAN_MASK_CHAR = 1 << 5,
EOLIAN_MASK_NULL = 1 << 6,
EOLIAN_MASK_SIGNED = EOLIAN_MASK_SINT | EOLIAN_MASK_FLOAT,
EOLIAN_MASK_NUMBER = EOLIAN_MASK_INT | EOLIAN_MASK_FLOAT,
EOLIAN_MASK_ALL = EOLIAN_MASK_NUMBER | EOLIAN_MASK_BOOL
| EOLIAN_MASK_STRING | EOLIAN_MASK_CHAR

View File

@ -50,7 +50,7 @@ mask_to_str(int mask, char *buf)
}
static Eina_Bool
expr_type_error(const Eolian_Expression *expr, int type, int mask)
expr_type_error(const Eolian_Expression *expr, int mask, int type)
{
char buf[512];
char ebuf[256];
@ -153,9 +153,9 @@ promote(Eolian_Expression *a, Eolian_Expression *b)
assert(a->type && b->type);
/* not a number */
if (a->type >= EOLIAN_EXPR_STRING)
return expr_type_error(a, expr_type_to_mask(a), EOLIAN_MASK_NUMBER);
return expr_type_error(a, EOLIAN_MASK_NUMBER, expr_type_to_mask(a));
if (b->type >= EOLIAN_EXPR_STRING)
return expr_type_error(b, expr_type_to_mask(b), EOLIAN_MASK_NUMBER);
return expr_type_error(b, EOLIAN_MASK_NUMBER, expr_type_to_mask(b));
/* no need for promotion */
if (a->type == b->type) return EINA_TRUE;
/* if either operand is floating point, everything has to be */
@ -191,26 +191,28 @@ eval_unary(const Eolian_Expression *expr, Eolian_Expression_Mask mask,
case EOLIAN_UNOP_UNP:
{
/* no-op, but still typecheck */
if (!(mask & EOLIAN_MASK_SINT))
return expr_type_error(expr, EOLIAN_MASK_SINT, mask);
if (!(mask & EOLIAN_MASK_SIGNED))
return expr_type_error(expr, EOLIAN_MASK_SIGNED, mask);
return eval_exp(expr->expr, EOLIAN_MASK_SINT, out);
return eval_exp(expr->expr, EOLIAN_MASK_SIGNED, out);
}
case EOLIAN_UNOP_UNM:
{
Eolian_Expression exp;
if (!(mask & EOLIAN_MASK_SINT))
return expr_type_error(expr, EOLIAN_MASK_SINT, mask);
if (!(mask & EOLIAN_MASK_SIGNED))
return expr_type_error(expr, EOLIAN_MASK_SIGNED, mask);
if (!eval_exp(expr->expr, EOLIAN_MASK_SINT, &exp))
if (!eval_exp(expr->expr, EOLIAN_MASK_SIGNED, &exp))
return EINA_FALSE;
switch (exp.type)
{
case EOLIAN_EXPR_LLONG: exp.value.ll = -(exp.value.ll); break;
case EOLIAN_EXPR_LONG : exp.value.l = -(exp.value.l ); break;
case EOLIAN_EXPR_INT : exp.value.i = -(exp.value.i ); break;
case EOLIAN_EXPR_LLONG : exp.value.ll = -(exp.value.ll); break;
case EOLIAN_EXPR_LONG : exp.value.l = -(exp.value.l ); break;
case EOLIAN_EXPR_INT : exp.value.i = -(exp.value.i ); break;
case EOLIAN_EXPR_FLOAT : exp.value.f = -(exp.value.f ); break;
case EOLIAN_EXPR_DOUBLE: exp.value.d = -(exp.value.d ); break;
default: return EINA_FALSE;
}

View File

@ -51,7 +51,7 @@ class Evas.Text (Efl.Canvas.Object, Efl.Text, Efl.Text.Properties, Efl.Canvas.Fi
get {
}
values {
ellipsis: double(-1); [[The ellipsis. Allowed values: -1.0 or 0.0-1.0]]
ellipsis: double(-1.0); [[The ellipsis. Allowed values: -1.0 or 0.0-1.0]]
}
}
@property bidi_delimiters {