From 06ebfc52ed2358552267fd175a422a7563aa424b Mon Sep 17 00:00:00 2001 From: Zoltan Herczeg Date: Thu, 1 Feb 2018 11:31:17 +0100 Subject: [PATCH] Simplify ECMA_OP_TO_NUMBER_TRY_CATCH macro. (#2185) JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com --- jerry-core/ecma/operations/ecma-conversion.c | 128 +++++++++++++----- jerry-core/ecma/operations/ecma-conversion.h | 1 + .../ecma/operations/ecma-try-catch-macro.h | 25 +--- 3 files changed, 98 insertions(+), 56 deletions(-) diff --git a/jerry-core/ecma/operations/ecma-conversion.c b/jerry-core/ecma/operations/ecma-conversion.c index 431462381..685de0472 100644 --- a/jerry-core/ecma/operations/ecma-conversion.c +++ b/jerry-core/ecma/operations/ecma-conversion.c @@ -247,59 +247,117 @@ ecma_op_to_number (ecma_value_t value) /**< ecma value */ { return value; } - else if (ecma_is_value_float_number (value)) + + if (ecma_is_value_float_number (value)) { return ecma_copy_value (value); } - else if (ecma_is_value_string (value)) + + if (ecma_is_value_string (value)) { ecma_string_t *str_p = ecma_get_string_from_value (value); return ecma_make_number_value (ecma_string_to_number (str_p)); } - else if (ecma_is_value_object (value)) + + if (ecma_is_value_object (value)) { - ecma_value_t ret_value = ECMA_VALUE_EMPTY; + ecma_value_t primitive_value = ecma_op_to_primitive (value, ECMA_PREFERRED_TYPE_NUMBER); - ECMA_TRY_CATCH (primitive_value, - ecma_op_to_primitive (value, ECMA_PREFERRED_TYPE_NUMBER), - ret_value); - - ret_value = ecma_op_to_number (primitive_value); - - ECMA_FINALIZE (primitive_value); + if (ECMA_IS_VALUE_ERROR (primitive_value)) + { + return primitive_value; + } + ecma_value_t ret_value = ecma_op_to_number (primitive_value); + ecma_fast_free_value (primitive_value); return ret_value; } + + if (ecma_is_value_undefined (value)) + { + return ecma_make_nan_value (); + } + + ecma_integer_value_t num = 0; + + if (ecma_is_value_null (value)) + { + num = 0; + } else { - int16_t num = 0; + JERRY_ASSERT (ecma_is_value_boolean (value)); - if (ecma_is_value_undefined (value)) - { - return ecma_make_nan_value (); - } - else if (ecma_is_value_null (value)) - { - num = 0; - } - else - { - JERRY_ASSERT (ecma_is_value_boolean (value)); - - if (ecma_is_value_true (value)) - { - num = 1; - } - else - { - num = 0; - } - } - - return ecma_make_integer_value (num); + num = ecma_is_value_true (value) ? 1 : 0; } + + return ecma_make_integer_value (num); } /* ecma_op_to_number */ +/** + * Helper to get the number contained in an ecma value. + * + * See also: + * ECMA-262 v5, 9.3 + * + * @return ECMA_VALUE_EMPTY if successful + * conversion error otherwise + * Returned value must be freed with ecma_free_value + */ +ecma_value_t +ecma_get_number (ecma_value_t value, ecma_number_t *number_p) +{ + if (ecma_is_value_integer_number (value)) + { + *number_p = ecma_get_integer_from_value (value); + return ECMA_VALUE_EMPTY; + } + + if (ecma_is_value_float_number (value)) + { + *number_p = ecma_get_float_from_value (value); + return ECMA_VALUE_EMPTY; + } + + if (ecma_is_value_string (value)) + { + ecma_string_t *str_p = ecma_get_string_from_value (value); + *number_p = ecma_string_to_number (str_p); + return ECMA_VALUE_EMPTY; + } + + if (ecma_is_value_object (value)) + { + ecma_value_t primitive_value = ecma_op_to_primitive (value, ECMA_PREFERRED_TYPE_NUMBER); + + if (ECMA_IS_VALUE_ERROR (primitive_value)) + { + return primitive_value; + } + + ecma_value_t ret_value = ecma_get_number (primitive_value, number_p); + ecma_fast_free_value (primitive_value); + return ret_value; + } + + if (ecma_is_value_undefined (value)) + { + *number_p = ecma_number_make_nan (); + return ECMA_VALUE_EMPTY; + } + + if (ecma_is_value_null (value)) + { + *number_p = 0; + return ECMA_VALUE_EMPTY; + } + + JERRY_ASSERT (ecma_is_value_boolean (value)); + + *number_p = ecma_is_value_true (value) ? 1 : 0; + return ECMA_VALUE_EMPTY; +} /* ecma_get_number */ + /** * ToString operation. * diff --git a/jerry-core/ecma/operations/ecma-conversion.h b/jerry-core/ecma/operations/ecma-conversion.h index 056b2550f..ce00ffe6d 100644 --- a/jerry-core/ecma/operations/ecma-conversion.h +++ b/jerry-core/ecma/operations/ecma-conversion.h @@ -42,6 +42,7 @@ bool ecma_op_same_value (ecma_value_t x, ecma_value_t y); ecma_value_t ecma_op_to_primitive (ecma_value_t value, ecma_preferred_type_hint_t preferred_type); bool ecma_op_to_boolean (ecma_value_t value); ecma_value_t ecma_op_to_number (ecma_value_t value); +ecma_value_t ecma_get_number (ecma_value_t value, ecma_number_t *number_p); ecma_value_t ecma_op_to_string (ecma_value_t value); ecma_value_t ecma_op_to_object (ecma_value_t value); diff --git a/jerry-core/ecma/operations/ecma-try-catch-macro.h b/jerry-core/ecma/operations/ecma-try-catch-macro.h index 69fec7e3f..b97f1e907 100644 --- a/jerry-core/ecma/operations/ecma-try-catch-macro.h +++ b/jerry-core/ecma/operations/ecma-try-catch-macro.h @@ -66,23 +66,10 @@ */ #define ECMA_OP_TO_NUMBER_TRY_CATCH(num_var, value, return_value) \ JERRY_ASSERT (return_value == ECMA_VALUE_EMPTY); \ - ecma_number_t num_var = ecma_number_make_nan (); \ - if (ecma_is_value_number (value)) \ - { \ - num_var = ecma_get_number_from_value (value); \ - } \ - else \ - { \ - ECMA_TRY_CATCH (to_number_value, \ - ecma_op_to_number (value), \ - return_value); \ - \ - num_var = ecma_get_number_from_value (to_number_value); \ - \ - ECMA_FINALIZE (to_number_value); \ - } \ + ecma_number_t num_var; \ + return_value = ecma_get_number (value, &num_var); \ \ - if (ecma_is_value_empty (return_value)) \ + if (likely (ecma_is_value_empty (return_value))) \ { /** @@ -92,10 +79,6 @@ * Each ECMA_OP_TO_NUMBER_TRY_CATCH should be followed by ECMA_OP_TO_NUMBER_FINALIZE * with same argument as corresponding ECMA_OP_TO_NUMBER_TRY_CATCH's first argument. */ -#define ECMA_OP_TO_NUMBER_FINALIZE(num_var) } \ - else \ - { \ - JERRY_ASSERT (ecma_number_is_nan (num_var)); \ - } +#define ECMA_OP_TO_NUMBER_FINALIZE(num_var) } #endif /* !ECMA_TRY_CATCH_MACRO_H */