Introducing ECMA_OP_TO_NUMBER_TRY_CATCH and ECMA_OP_TO_NUMBER_FINALIZE macroses.
- the ECMA_OP_TO_NUMBER_TRY_CATCH macro gets number from given value,
converting the value to number if it's type is different,
and catching possible conversion exceptions;
- using the macroses instead of ecma_op_to_number to reduce allocator invocations
in several routines with arguments that are likely to be numbers.
This commit is contained in:
@@ -101,18 +101,16 @@ static ecma_completion_value_t
|
||||
ecma_builtin_global_object_is_nan (ecma_value_t this_arg __unused, /**< this argument */
|
||||
ecma_value_t arg) /**< routine's first argument */
|
||||
{
|
||||
ecma_completion_value_t ret_value;
|
||||
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
|
||||
|
||||
ECMA_TRY_CATCH (num_value, ecma_op_to_number (arg), ret_value);
|
||||
ECMA_OP_TO_NUMBER_TRY_CATCH (arg_num, arg, ret_value);
|
||||
|
||||
ecma_number_t *num_p = ecma_get_number_from_completion_value (num_value);
|
||||
|
||||
bool is_nan = ecma_number_is_nan (*num_p);
|
||||
bool is_nan = ecma_number_is_nan (arg_num);
|
||||
|
||||
ret_value = ecma_make_simple_completion_value (is_nan ? ECMA_SIMPLE_VALUE_TRUE
|
||||
: ECMA_SIMPLE_VALUE_FALSE);
|
||||
|
||||
ECMA_FINALIZE (num_value);
|
||||
ECMA_OP_TO_NUMBER_FINALIZE (arg_num);
|
||||
|
||||
return ret_value;
|
||||
} /* ecma_builtin_global_object_is_nan */
|
||||
@@ -130,19 +128,17 @@ static ecma_completion_value_t
|
||||
ecma_builtin_global_object_is_finite (ecma_value_t this_arg __unused, /**< this argument */
|
||||
ecma_value_t arg) /**< routine's first argument */
|
||||
{
|
||||
ecma_completion_value_t ret_value;
|
||||
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
|
||||
|
||||
ECMA_TRY_CATCH (num_value, ecma_op_to_number (arg), ret_value);
|
||||
ECMA_OP_TO_NUMBER_TRY_CATCH (arg_num, arg, ret_value);
|
||||
|
||||
ecma_number_t *num_p = ecma_get_number_from_completion_value (num_value);
|
||||
|
||||
bool is_finite = !(ecma_number_is_nan (*num_p)
|
||||
|| ecma_number_is_infinity (*num_p));
|
||||
bool is_finite = !(ecma_number_is_nan (arg_num)
|
||||
|| ecma_number_is_infinity (arg_num));
|
||||
|
||||
ret_value = ecma_make_simple_completion_value (is_finite ? ECMA_SIMPLE_VALUE_TRUE
|
||||
: ECMA_SIMPLE_VALUE_FALSE);
|
||||
|
||||
ECMA_FINALIZE (num_value);
|
||||
ECMA_OP_TO_NUMBER_FINALIZE (arg_num);
|
||||
|
||||
return ret_value;
|
||||
} /* ecma_builtin_global_object_is_finite */
|
||||
|
||||
@@ -58,16 +58,12 @@ static ecma_completion_value_t
|
||||
ecma_builtin_math_object_abs (ecma_value_t this_arg __unused, /**< 'this' argument */
|
||||
ecma_value_t arg) /**< routine's argument */
|
||||
{
|
||||
ecma_completion_value_t ret_value;
|
||||
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
|
||||
|
||||
ECMA_TRY_CATCH (arg_num_value,
|
||||
ecma_op_to_number (arg),
|
||||
ret_value);
|
||||
ECMA_OP_TO_NUMBER_TRY_CATCH (arg_num, arg, ret_value);
|
||||
|
||||
ecma_number_t *num_p = ecma_alloc_number ();
|
||||
|
||||
const ecma_number_t arg_num = *ecma_get_number_from_completion_value (arg_num_value);
|
||||
|
||||
if (ecma_number_is_nan (arg_num))
|
||||
{
|
||||
*num_p = arg_num;
|
||||
@@ -79,7 +75,7 @@ ecma_builtin_math_object_abs (ecma_value_t this_arg __unused, /**< 'this' argume
|
||||
|
||||
ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p));
|
||||
|
||||
ECMA_FINALIZE (arg_num_value);
|
||||
ECMA_OP_TO_NUMBER_FINALIZE (arg_num);
|
||||
|
||||
return ret_value;
|
||||
} /* ecma_builtin_math_object_abs */
|
||||
@@ -178,16 +174,12 @@ static ecma_completion_value_t
|
||||
ecma_builtin_math_object_cos (ecma_value_t this_arg __unused, /**< 'this' argument */
|
||||
ecma_value_t arg) /**< routine's argument */
|
||||
{
|
||||
ecma_completion_value_t ret_value;
|
||||
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
|
||||
|
||||
ECMA_TRY_CATCH (arg_num_value,
|
||||
ecma_op_to_number (arg),
|
||||
ret_value);
|
||||
ECMA_OP_TO_NUMBER_TRY_CATCH (arg_num, arg, ret_value);
|
||||
|
||||
ecma_number_t *num_p = ecma_alloc_number ();
|
||||
|
||||
const ecma_number_t arg_num = *ecma_get_number_from_completion_value (arg_num_value);
|
||||
|
||||
if (ecma_number_is_nan (arg_num)
|
||||
|| ecma_number_is_infinity (arg_num))
|
||||
{
|
||||
@@ -232,7 +224,7 @@ ecma_builtin_math_object_cos (ecma_value_t this_arg __unused, /**< 'this' argume
|
||||
|
||||
ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p));
|
||||
|
||||
ECMA_FINALIZE (arg_num_value);
|
||||
ECMA_OP_TO_NUMBER_FINALIZE (arg_num);
|
||||
|
||||
return ret_value;
|
||||
} /* ecma_builtin_math_object_cos */
|
||||
@@ -250,16 +242,12 @@ static ecma_completion_value_t
|
||||
ecma_builtin_math_object_exp (ecma_value_t this_arg __unused, /**< 'this' argument */
|
||||
ecma_value_t arg) /**< routine's argument */
|
||||
{
|
||||
ecma_completion_value_t ret_value;
|
||||
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
|
||||
|
||||
ECMA_TRY_CATCH (arg_num_value,
|
||||
ecma_op_to_number (arg),
|
||||
ret_value);
|
||||
ECMA_OP_TO_NUMBER_TRY_CATCH (arg_num, arg, ret_value);
|
||||
|
||||
ecma_number_t *num_p = ecma_alloc_number ();
|
||||
|
||||
const ecma_number_t arg_num = *ecma_get_number_from_completion_value (arg_num_value);
|
||||
|
||||
if (ecma_number_is_nan (arg_num))
|
||||
{
|
||||
*num_p = arg_num;
|
||||
@@ -286,7 +274,7 @@ ecma_builtin_math_object_exp (ecma_value_t this_arg __unused, /**< 'this' argume
|
||||
|
||||
ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p));
|
||||
|
||||
ECMA_FINALIZE (arg_num_value);
|
||||
ECMA_OP_TO_NUMBER_FINALIZE (arg_num);
|
||||
|
||||
return ret_value;
|
||||
} /* ecma_builtin_math_object_exp */
|
||||
@@ -320,16 +308,12 @@ static ecma_completion_value_t
|
||||
ecma_builtin_math_object_log (ecma_value_t this_arg __unused, /**< 'this' argument */
|
||||
ecma_value_t arg) /**< routine's argument */
|
||||
{
|
||||
ecma_completion_value_t ret_value;
|
||||
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
|
||||
|
||||
ECMA_TRY_CATCH (arg_num_value,
|
||||
ecma_op_to_number (arg),
|
||||
ret_value);
|
||||
ECMA_OP_TO_NUMBER_TRY_CATCH (arg_num, arg, ret_value);
|
||||
|
||||
ecma_number_t *num_p = ecma_alloc_number ();
|
||||
|
||||
const ecma_number_t arg_num = *ecma_get_number_from_completion_value (arg_num_value);
|
||||
|
||||
if (ecma_number_is_nan (arg_num))
|
||||
{
|
||||
*num_p = arg_num;
|
||||
@@ -353,7 +337,7 @@ ecma_builtin_math_object_log (ecma_value_t this_arg __unused, /**< 'this' argume
|
||||
|
||||
ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p));
|
||||
|
||||
ECMA_FINALIZE (arg_num_value);
|
||||
ECMA_OP_TO_NUMBER_FINALIZE (arg_num);
|
||||
|
||||
return ret_value;
|
||||
} /* ecma_builtin_math_object_log */
|
||||
@@ -382,14 +366,10 @@ ecma_builtin_math_object_max (ecma_value_t this_arg __unused, /**< 'this' argume
|
||||
arg_index < args_number;
|
||||
arg_index++)
|
||||
{
|
||||
ECMA_TRY_CATCH (arg_num_value,
|
||||
ecma_op_to_number (args[arg_index]),
|
||||
ret_value);
|
||||
ECMA_OP_TO_NUMBER_TRY_CATCH (arg_num, args[arg_index], ret_value);
|
||||
|
||||
if (!is_just_convert)
|
||||
{
|
||||
ecma_number_t arg_num = *ecma_get_number_from_completion_value (arg_num_value);
|
||||
|
||||
if (unlikely (ecma_number_is_nan (arg_num)))
|
||||
{
|
||||
ret_num = arg_num;
|
||||
@@ -431,7 +411,7 @@ ecma_builtin_math_object_max (ecma_value_t this_arg __unused, /**< 'this' argume
|
||||
}
|
||||
}
|
||||
|
||||
ECMA_FINALIZE (arg_num_value);
|
||||
ECMA_OP_TO_NUMBER_FINALIZE (arg_num);
|
||||
|
||||
if (ecma_is_completion_value_throw (ret_value))
|
||||
{
|
||||
@@ -473,14 +453,10 @@ ecma_builtin_math_object_min (ecma_value_t this_arg __unused, /**< 'this' argume
|
||||
arg_index < args_number;
|
||||
arg_index++)
|
||||
{
|
||||
ECMA_TRY_CATCH (arg_num_value,
|
||||
ecma_op_to_number (args[arg_index]),
|
||||
ret_value);
|
||||
ECMA_OP_TO_NUMBER_TRY_CATCH (arg_num, args[arg_index], ret_value);
|
||||
|
||||
if (!is_just_convert)
|
||||
{
|
||||
ecma_number_t arg_num = *ecma_get_number_from_completion_value (arg_num_value);
|
||||
|
||||
if (unlikely (ecma_number_is_nan (arg_num)))
|
||||
{
|
||||
ret_num = arg_num;
|
||||
@@ -522,7 +498,7 @@ ecma_builtin_math_object_min (ecma_value_t this_arg __unused, /**< 'this' argume
|
||||
}
|
||||
}
|
||||
|
||||
ECMA_FINALIZE (arg_num_value);
|
||||
ECMA_OP_TO_NUMBER_FINALIZE (arg_num);
|
||||
|
||||
if (ecma_is_completion_value_throw (ret_value))
|
||||
{
|
||||
@@ -554,20 +530,13 @@ ecma_builtin_math_object_pow (ecma_value_t this_arg __unused, /**< 'this' argume
|
||||
ecma_value_t arg1, /**< first routine's argument */
|
||||
ecma_value_t arg2) /**< second routine's argument */
|
||||
{
|
||||
ecma_completion_value_t ret_value;
|
||||
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
|
||||
|
||||
ECMA_TRY_CATCH (arg1_num_value,
|
||||
ecma_op_to_number (arg1),
|
||||
ret_value);
|
||||
ECMA_TRY_CATCH (arg2_num_value,
|
||||
ecma_op_to_number (arg2),
|
||||
ret_value);
|
||||
ECMA_OP_TO_NUMBER_TRY_CATCH (x, arg1, ret_value);
|
||||
ECMA_OP_TO_NUMBER_TRY_CATCH (y, arg2, ret_value);
|
||||
|
||||
ecma_number_t *num_p = ecma_alloc_number ();
|
||||
|
||||
const ecma_number_t x = *ecma_get_number_from_completion_value (arg1_num_value);
|
||||
const ecma_number_t y = *ecma_get_number_from_completion_value (arg2_num_value);
|
||||
|
||||
if (ecma_number_is_nan (y)
|
||||
|| (ecma_number_is_nan (x)
|
||||
&& !ecma_number_is_zero (y)))
|
||||
@@ -775,8 +744,8 @@ ecma_builtin_math_object_pow (ecma_value_t this_arg __unused, /**< 'this' argume
|
||||
|
||||
ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p));
|
||||
|
||||
ECMA_FINALIZE (arg2_num_value);
|
||||
ECMA_FINALIZE (arg1_num_value);
|
||||
ECMA_OP_TO_NUMBER_FINALIZE (y);
|
||||
ECMA_OP_TO_NUMBER_FINALIZE (x);
|
||||
|
||||
return ret_value;
|
||||
} /* ecma_builtin_math_object_pow */
|
||||
@@ -835,16 +804,12 @@ static ecma_completion_value_t
|
||||
ecma_builtin_math_object_round (ecma_value_t this_arg __unused, /**< 'this' argument */
|
||||
ecma_value_t arg) /**< routine's argument */
|
||||
{
|
||||
ecma_completion_value_t ret_value;
|
||||
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
|
||||
|
||||
ECMA_TRY_CATCH (arg_num_value,
|
||||
ecma_op_to_number (arg),
|
||||
ret_value);
|
||||
ECMA_OP_TO_NUMBER_TRY_CATCH (arg_num, arg, ret_value);
|
||||
|
||||
ecma_number_t *num_p = ecma_alloc_number ();
|
||||
|
||||
const ecma_number_t arg_num = *ecma_get_number_from_completion_value (arg_num_value);
|
||||
|
||||
if (ecma_number_is_nan (arg_num)
|
||||
|| ecma_number_is_zero (arg_num)
|
||||
|| ecma_number_is_infinity (arg_num))
|
||||
@@ -875,7 +840,7 @@ ecma_builtin_math_object_round (ecma_value_t this_arg __unused, /**< 'this' argu
|
||||
|
||||
ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p));
|
||||
|
||||
ECMA_FINALIZE (arg_num_value);
|
||||
ECMA_OP_TO_NUMBER_FINALIZE (arg_num);
|
||||
|
||||
return ret_value;
|
||||
} /* ecma_builtin_math_object_round */
|
||||
@@ -893,16 +858,12 @@ static ecma_completion_value_t
|
||||
ecma_builtin_math_object_sin (ecma_value_t this_arg __unused, /**< 'this' argument */
|
||||
ecma_value_t arg) /**< routine's argument */
|
||||
{
|
||||
ecma_completion_value_t ret_value;
|
||||
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
|
||||
|
||||
ECMA_TRY_CATCH (arg_num_value,
|
||||
ecma_op_to_number (arg),
|
||||
ret_value);
|
||||
ECMA_OP_TO_NUMBER_TRY_CATCH (arg_num, arg, ret_value);
|
||||
|
||||
ecma_number_t *num_p = ecma_alloc_number ();
|
||||
|
||||
const ecma_number_t arg_num = *ecma_get_number_from_completion_value (arg_num_value);
|
||||
|
||||
if (ecma_number_is_nan (arg_num)
|
||||
|| ecma_number_is_infinity (arg_num))
|
||||
{
|
||||
@@ -947,7 +908,7 @@ ecma_builtin_math_object_sin (ecma_value_t this_arg __unused, /**< 'this' argume
|
||||
|
||||
ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p));
|
||||
|
||||
ECMA_FINALIZE (arg_num_value);
|
||||
ECMA_OP_TO_NUMBER_FINALIZE (arg_num);
|
||||
|
||||
return ret_value;
|
||||
} /* ecma_builtin_math_object_sin */
|
||||
@@ -965,13 +926,10 @@ static ecma_completion_value_t
|
||||
ecma_builtin_math_object_sqrt (ecma_value_t this_arg __unused, /**< 'this' argument */
|
||||
ecma_value_t arg) /**< routine's argument */
|
||||
{
|
||||
ecma_completion_value_t ret_value;
|
||||
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
|
||||
|
||||
ECMA_TRY_CATCH (arg_num_value,
|
||||
ecma_op_to_number (arg),
|
||||
ret_value);
|
||||
ECMA_OP_TO_NUMBER_TRY_CATCH (arg_num, arg, ret_value);
|
||||
|
||||
const ecma_number_t arg_num = *ecma_get_number_from_completion_value (arg_num_value);
|
||||
ecma_number_t ret_num;
|
||||
|
||||
if (ecma_number_is_nan (arg_num)
|
||||
@@ -1000,7 +958,7 @@ ecma_builtin_math_object_sqrt (ecma_value_t this_arg __unused, /**< 'this' argum
|
||||
|
||||
ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p));
|
||||
|
||||
ECMA_FINALIZE (arg_num_value);
|
||||
ECMA_OP_TO_NUMBER_FINALIZE (arg_num);
|
||||
|
||||
return ret_value;
|
||||
} /* ecma_builtin_math_object_sqrt */
|
||||
|
||||
@@ -70,14 +70,9 @@ ecma_builtin_string_object_from_char_code (ecma_value_t this_arg __unused, /**<
|
||||
arg_index < args_number;
|
||||
arg_index++)
|
||||
{
|
||||
ECMA_TRY_CATCH (arg_num_value,
|
||||
ecma_op_to_number (args[arg_index]),
|
||||
ret_value);
|
||||
ECMA_OP_TO_NUMBER_TRY_CATCH (arg_num, args[arg_index], ret_value);
|
||||
|
||||
JERRY_ASSERT (ecma_is_value_number (ecma_get_completion_value_value (arg_num_value)));
|
||||
ecma_number_t *arg_num_p = ecma_get_number_from_completion_value (arg_num_value);
|
||||
|
||||
uint32_t uint32_char_code = ecma_number_to_uint32 (*arg_num_p);
|
||||
uint32_t uint32_char_code = ecma_number_to_uint32 (arg_num);
|
||||
uint16_t uint16_char_code = (uint16_t) uint32_char_code;
|
||||
|
||||
#if CONFIG_ECMA_CHAR_ENCODING == CONFIG_ECMA_CHAR_ASCII
|
||||
@@ -93,7 +88,7 @@ ecma_builtin_string_object_from_char_code (ecma_value_t this_arg __unused, /**<
|
||||
ret_zt_str_p [arg_index] = (ecma_char_t) uint16_char_code;
|
||||
#endif /* CONFIG_ECMA_CHAR_ENCODING == CONFIG_ECMA_CHAR_UTF16 */
|
||||
|
||||
ECMA_FINALIZE (arg_num_value);
|
||||
ECMA_OP_TO_NUMBER_FINALIZE (arg_num);
|
||||
|
||||
if (ecma_is_completion_value_throw (ret_value))
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user