From 1efaefaabe0e42187c2f1c0d3a107abd44b4cdb8 Mon Sep 17 00:00:00 2001 From: Ruben Ayrapetyan Date: Mon, 22 Jun 2015 15:35:08 +0300 Subject: [PATCH] Extract part of ecma_op_number_remainder (ECMA-262 v5, 11.5.3), corresponding to item 6 (actual remainder calculation, without handling of NaN. Infinity and zero values), as ecma_number_calc_remainder. JerryScript-DCO-1.0-Signed-off-by: Ruben Ayrapetyan r.ayrapetyan@samsung.com --- jerry-core/ecma/base/ecma-helpers-number.cpp | 27 +++++++++++++++++++ jerry-core/ecma/base/ecma-helpers.h | 1 + .../operations/ecma-number-arithmetic.cpp | 13 +-------- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/jerry-core/ecma/base/ecma-helpers-number.cpp b/jerry-core/ecma/base/ecma-helpers-number.cpp index b99a639a4..6a67a17fa 100644 --- a/jerry-core/ecma/base/ecma-helpers-number.cpp +++ b/jerry-core/ecma/base/ecma-helpers-number.cpp @@ -707,6 +707,33 @@ ecma_number_trunc (ecma_number_t num) /**< ecma-number */ } } /* ecma_number_trunc */ +/** + * Calculate remainder of division of two numbers, + * as specified in ECMA-262 v5, 11.5.3, item 6. + * + * Note: + * operands shouldn't contain NaN, Infinity, or zero. + * + * @return number - calculated remainder. + */ +ecma_number_t +ecma_number_calc_remainder (ecma_number_t left_num, /**< left operand */ + ecma_number_t right_num) /**< right operand */ +{ + ecma_number_t n = left_num, d = right_num; + + JERRY_ASSERT (!ecma_number_is_nan (n) + && !ecma_number_is_zero (n) + && !ecma_number_is_infinity (n)); + JERRY_ASSERT (!ecma_number_is_nan (d) + && !ecma_number_is_zero (d) + && !ecma_number_is_infinity (d)); + + ecma_number_t q = ecma_number_trunc (ecma_number_divide (n, d)); + + return ecma_number_substract (n, ecma_number_multiply (d, q)); +} /* ecma_number_calc_remainder */ + /** * ECMA-number addition. * diff --git a/jerry-core/ecma/base/ecma-helpers.h b/jerry-core/ecma/base/ecma-helpers.h index 25c289e7d..987e6345f 100644 --- a/jerry-core/ecma/base/ecma-helpers.h +++ b/jerry-core/ecma/base/ecma-helpers.h @@ -185,6 +185,7 @@ extern ecma_number_t ecma_number_get_prev (ecma_number_t num); extern ecma_number_t ecma_number_get_next (ecma_number_t num); extern ecma_number_t ecma_number_negate (ecma_number_t num); extern ecma_number_t ecma_number_trunc (ecma_number_t num); +extern ecma_number_t ecma_number_calc_remainder (ecma_number_t left_num, ecma_number_t right_num); extern ecma_number_t ecma_number_add (ecma_number_t left_num, ecma_number_t right_num); extern ecma_number_t ecma_number_substract (ecma_number_t left_num, ecma_number_t right_num); extern ecma_number_t ecma_number_multiply (ecma_number_t left_num, ecma_number_t right_num); diff --git a/jerry-core/ecma/operations/ecma-number-arithmetic.cpp b/jerry-core/ecma/operations/ecma-number-arithmetic.cpp index 4e6681d1f..5e517cbaf 100644 --- a/jerry-core/ecma/operations/ecma-number-arithmetic.cpp +++ b/jerry-core/ecma/operations/ecma-number-arithmetic.cpp @@ -38,8 +38,6 @@ ecma_number_t ecma_op_number_remainder (ecma_number_t left_num, /**< left operand */ ecma_number_t right_num) /**< right operand */ { - TODO (Check precision); - ecma_number_t n = left_num, d = right_num; if (ecma_number_is_nan (n) @@ -56,16 +54,7 @@ ecma_op_number_remainder (ecma_number_t left_num, /**< left operand */ return n; } - JERRY_ASSERT (!ecma_number_is_nan (n) - && !ecma_number_is_zero (n) - && !ecma_number_is_infinity (n)); - JERRY_ASSERT (!ecma_number_is_nan (d) - && !ecma_number_is_zero (d) - && !ecma_number_is_infinity (d)); - - ecma_number_t q = ecma_number_trunc (ecma_number_divide (n, d)); - - return ecma_number_substract (n, ecma_number_multiply (d, q)); + return ecma_number_calc_remainder (n, d); } /* ecma_op_number_remainder */ /**