Skip to content

Commit

Permalink
This commit will be squashed.
Browse files Browse the repository at this point in the history
JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg [email protected]
  • Loading branch information
zherczeg committed May 11, 2016
1 parent af33305 commit 5eae47c
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 62 deletions.
14 changes: 14 additions & 0 deletions jerry-core/ecma/base/ecma-globals.h
Original file line number Diff line number Diff line change
Expand Up @@ -142,12 +142,26 @@ typedef int32_t ecma_integer_value_t;
/**
* Maximum integer number for an ecma value
*/
#if CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT32
#define ECMA_INTEGER_NUMBER_MAX 0x7fffff
#else /* CONFIG_ECMA_NUMBER_TYPE != CONFIG_ECMA_NUMBER_FLOAT32 */
#define ECMA_INTEGER_NUMBER_MAX 0x7ffffff
#endif /* CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT32 */

/**
* Minimum integer number for an ecma value
*/
#if CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT32
#define ECMA_INTEGER_NUMBER_MIN -0x7fffff
#else /* CONFIG_ECMA_NUMBER_TYPE != CONFIG_ECMA_NUMBER_FLOAT32 */
#define ECMA_INTEGER_NUMBER_MIN -0x8000000
#endif /* CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT32 */

/**
* Checks whether the integer number is in the integer number range.
*/
#define ECMA_IS_INTEGER_NUMBER(num) \
(ECMA_INTEGER_NUMBER_MIN <= (num) && (num) <= ECMA_INTEGER_NUMBER_MAX)

/**
* Internal properties' identifiers.
Expand Down
96 changes: 34 additions & 62 deletions jerry-core/ecma/base/ecma-helpers-value.c
Original file line number Diff line number Diff line change
Expand Up @@ -314,8 +314,7 @@ ecma_make_simple_value (const ecma_simple_value_t simple_value) /**< simple valu
inline ecma_value_t __attr_const___ __attr_always_inline___
ecma_make_integer_value (ecma_integer_value_t integer_value) /**< integer number to be encoded */
{
JERRY_ASSERT (ECMA_INTEGER_NUMBER_MIN <= integer_value
&& integer_value <= ECMA_INTEGER_NUMBER_MAX);
JERRY_ASSERT (ECMA_IS_INTEGER_NUMBER (integer_value));

return (ecma_value_t) ((integer_value << ECMA_DIRECT_SHIFT) | ECMA_TYPE_DIRECT);
} /* ecma_make_integer_value */
Expand All @@ -326,11 +325,11 @@ ecma_make_integer_value (ecma_integer_value_t integer_value) /**< integer number
* @return ecma-value
*/
static ecma_value_t __attr_const___
ecma_create_float_number (ecma_number_t ecma_num) /**< value of the float number */
ecma_create_float_number (ecma_number_t ecma_number) /**< value of the float number */
{
ecma_number_t *ecma_num_p = ecma_alloc_number ();

*ecma_num_p = ecma_num;
*ecma_num_p = ecma_number;

return ecma_pointer_to_ecma_value (ecma_num_p) | ECMA_TYPE_FLOAT;
} /* ecma_create_float_number */
Expand All @@ -339,19 +338,19 @@ ecma_create_float_number (ecma_number_t ecma_num) /**< value of the float number
* Create a new float number.
*
* This function is intended to create floating point constants when it is
* known that ecma_num is not an integer number, e.g. 0.5, NaN, or -infinity.
* known that ecma_number is not an integer number, e.g. 0.5, NaN, or -infinity.
* Calling this function is faster than ecma_make_number_value since no
* checks are performed on the input apart from a debug assert.
*
* @return ecma-value
*/
inline ecma_value_t __attr_always_inline___
ecma_make_float_number_value (ecma_number_t ecma_num) /**< value of the float number */
ecma_make_float_number_value (ecma_number_t ecma_number) /**< value of the float number */
{
/* Simple check to ensure that ecma_num cannot be converted to integer. */
JERRY_ASSERT (((ecma_number_t) (ecma_integer_value_t) ecma_num) != ecma_num);
/* Simple check to ensure that ecma_number cannot be converted to integer. */
JERRY_ASSERT (((ecma_number_t) (ecma_integer_value_t) ecma_number) != ecma_number);

return ecma_create_float_number (ecma_num);
return ecma_create_float_number (ecma_number);
} /* ecma_make_float_number_value */

/**
Expand All @@ -360,7 +359,7 @@ ecma_make_float_number_value (ecma_number_t ecma_num) /**< value of the float nu
* @return true, if it is +0.0, false otherwise
*/
static inline bool __attr_const___ __attr_always_inline___
ecma_is_number_equals_to_positive_zero (ecma_number_t ecma_num) /**< number */
ecma_is_number_equals_to_positive_zero (ecma_number_t ecma_number) /**< number */
{
#if CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT32
union
Expand All @@ -369,7 +368,7 @@ ecma_is_number_equals_to_positive_zero (ecma_number_t ecma_num) /**< number */
ecma_number_t float_value;
} u;

u.float_value = ecma_num;
u.float_value = ecma_number;

return u.u32_value == 0;
#else /* CONFIG_ECMA_NUMBER_TYPE != CONFIG_ECMA_NUMBER_FLOAT32 */
Expand All @@ -379,7 +378,7 @@ ecma_is_number_equals_to_positive_zero (ecma_number_t ecma_num) /**< number */
ecma_number_t float_value;
} u;

u.float_value = ecma_num;
u.float_value = ecma_number;

return u.u64_value == 0;
#endif /* CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT32 */
Expand All @@ -391,27 +390,18 @@ ecma_is_number_equals_to_positive_zero (ecma_number_t ecma_num) /**< number */
* @return ecma-value
*/
ecma_value_t
ecma_make_number_value (ecma_number_t ecma_num) /**< number to be encoded */
ecma_make_number_value (ecma_number_t ecma_number) /**< number to be encoded */
{
ecma_integer_value_t integer_value = (ecma_integer_value_t) ecma_num;
ecma_integer_value_t integer_value = (ecma_integer_value_t) ecma_number;

if ((ecma_number_t) integer_value == ecma_num)
if ((ecma_number_t) integer_value == ecma_number
&& ((integer_value == 0) ? ecma_is_number_equals_to_positive_zero (ecma_number)
: ECMA_IS_INTEGER_NUMBER (integer_value)))
{
if (integer_value == 0)
{
if (ecma_is_number_equals_to_positive_zero (ecma_num))
{
return ecma_make_integer_value (0);
}
}
else if (ECMA_INTEGER_NUMBER_MIN <= integer_value
&& integer_value <= ECMA_INTEGER_NUMBER_MAX)
{
return ecma_make_integer_value (integer_value);
}
return ecma_make_integer_value (integer_value);
}

return ecma_create_float_number (ecma_num);
return ecma_create_float_number (ecma_number);
} /* ecma_make_number_value */

/**
Expand All @@ -420,15 +410,14 @@ ecma_make_number_value (ecma_number_t ecma_num) /**< number to be encoded */
* @return ecma-value
*/
ecma_value_t
ecma_make_int32_value (int32_t ecma_num) /**< int32 number to be encoded */
ecma_make_int32_value (int32_t int32_number) /**< int32 number to be encoded */
{
if (ECMA_INTEGER_NUMBER_MIN <= ecma_num
&& ecma_num <= ECMA_INTEGER_NUMBER_MAX)
if (ECMA_IS_INTEGER_NUMBER (int32_number))
{
return ecma_make_integer_value ((ecma_integer_value_t) ecma_num);
return ecma_make_integer_value ((ecma_integer_value_t) int32_number);
}

return ecma_create_float_number ((ecma_number_t) ecma_num);
return ecma_create_float_number ((ecma_number_t) int32_number);
} /* ecma_make_int32_value */

/**
Expand All @@ -437,16 +426,14 @@ ecma_make_int32_value (int32_t ecma_num) /**< int32 number to be encoded */
* @return ecma-value
*/
ecma_value_t
ecma_make_uint32_value (uint32_t ecma_num) /**< uint32 number to be encoded */
ecma_make_uint32_value (uint32_t uint32_number) /**< uint32 number to be encoded */
{
if (ecma_num <= ECMA_INTEGER_NUMBER_MAX)
if (uint32_number <= ECMA_INTEGER_NUMBER_MAX)
{
ecma_integer_value_t integer_value = (ecma_integer_value_t) ecma_num;

return (ecma_value_t) ((integer_value << ECMA_DIRECT_SHIFT) | ECMA_TYPE_DIRECT);
return ecma_make_integer_value ((ecma_integer_value_t) uint32_number);
}

return ecma_create_float_number ((ecma_number_t) ecma_num);
return ecma_create_float_number ((ecma_number_t) uint32_number);
} /* ecma_make_uint32_value */

/**
Expand Down Expand Up @@ -693,32 +680,17 @@ ecma_value_assign_number (ecma_value_t *value_p, /**< [in, out] ecma value */
{
ecma_integer_value_t integer_value = (ecma_integer_value_t) ecma_number;

if ((ecma_number_t) integer_value == ecma_number)
if ((ecma_number_t) integer_value == ecma_number
&& ((integer_value == 0) ? ecma_is_number_equals_to_positive_zero (ecma_number)
: ECMA_IS_INTEGER_NUMBER (integer_value)))
{
if (integer_value == 0)
{
if (ecma_is_number_equals_to_positive_zero (ecma_number))
{
if (ecma_get_value_type_field (*value_p) != ECMA_TYPE_DIRECT
&& ecma_get_value_type_field (*value_p) != ECMA_TYPE_OBJECT)
{
ecma_free_value (*value_p);
}
*value_p = ecma_make_integer_value (0);
return;
}
}
else if (ECMA_INTEGER_NUMBER_MIN <= integer_value
&& integer_value <= ECMA_INTEGER_NUMBER_MAX)
if (ecma_get_value_type_field (*value_p) != ECMA_TYPE_DIRECT
&& ecma_get_value_type_field (*value_p) != ECMA_TYPE_OBJECT)
{
if (ecma_get_value_type_field (*value_p) != ECMA_TYPE_DIRECT
&& ecma_get_value_type_field (*value_p) != ECMA_TYPE_OBJECT)
{
ecma_free_value (*value_p);
}
*value_p = ecma_make_integer_value (integer_value);
return;
ecma_free_value (*value_p);
}
*value_p = ecma_make_integer_value (integer_value);
return;
}

ecma_value_assign_float_number (value_p, ecma_number);
Expand Down

0 comments on commit 5eae47c

Please sign in to comment.