diff --git a/src/libecmaobjects/ecma-helpers-number.c b/src/libecmaobjects/ecma-helpers-number.c index 88ef788f2..ba70cd665 100644 --- a/src/libecmaobjects/ecma-helpers-number.c +++ b/src/libecmaobjects/ecma-helpers-number.c @@ -409,6 +409,44 @@ ecma_number_negate (ecma_number_t num) /**< ecma-number */ return u.value; } /* ecma_number_negate */ +/** + * Truncate fractional part of the number + * + * @return integer part of the number + */ +ecma_number_t +ecma_number_trunc (ecma_number_t num) /**< ecma-number */ +{ + uint64_t fraction; + int32_t exponent; + const int32_t dot_shift = ecma_number_get_fraction_and_exponent (num, &fraction, &exponent); + const bool sign = ecma_number_is_negative (num); + + if (exponent < 0) + { + return 0; + } + else if (exponent < dot_shift) + { + fraction &= ~((1ull << (dot_shift - exponent)) - 1); + + ecma_number_t tmp = ecma_number_make_normal_positive_from_fraction_and_exponent (fraction, + exponent); + if (sign) + { + return ecma_number_negate (tmp); + } + else + { + return tmp; + } + } + else + { + return num; + } +} /* ecma_number_trunc */ + /** * ECMA-number addition. * diff --git a/src/libecmaobjects/ecma-helpers.h b/src/libecmaobjects/ecma-helpers.h index 3af035148..6e95f8e99 100644 --- a/src/libecmaobjects/ecma-helpers.h +++ b/src/libecmaobjects/ecma-helpers.h @@ -137,12 +137,15 @@ extern bool ecma_number_is_nan (ecma_number_t num); extern bool ecma_number_is_negative (ecma_number_t num); extern bool ecma_number_is_zero (ecma_number_t num); extern bool ecma_number_is_infinity (ecma_number_t num); -extern int32_t ecma_number_get_fraction_and_exponent (ecma_number_t num, - uint64_t *out_fraction_p, - int32_t *out_exponent_p); -extern ecma_number_t ecma_number_make_normal_positive_from_fraction_and_exponent (uint64_t fraction, - int32_t exponent); +extern int32_t +ecma_number_get_fraction_and_exponent (ecma_number_t num, + uint64_t *out_fraction_p, + int32_t *out_exponent_p); +extern ecma_number_t +ecma_number_make_normal_positive_from_fraction_and_exponent (uint64_t fraction, + int32_t exponent); 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_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/src/libecmaoperations/ecma-number-arithmetic.c b/src/libecmaoperations/ecma-number-arithmetic.c index b523b9df0..4e6681d1f 100644 --- a/src/libecmaoperations/ecma-number-arithmetic.c +++ b/src/libecmaoperations/ecma-number-arithmetic.c @@ -63,29 +63,7 @@ ecma_op_number_remainder (ecma_number_t left_num, /**< left operand */ && !ecma_number_is_zero (d) && !ecma_number_is_infinity (d)); - ecma_number_t q = ecma_number_divide (n, d); - - uint64_t fraction; - int32_t exponent; - const int32_t dot_shift = ecma_number_get_fraction_and_exponent (q, &fraction, &exponent); - const bool sign = ecma_number_is_negative (q); - - if (exponent < 0) - { - return n; - } - - if (exponent < dot_shift) - { - fraction &= ~((1ull << (dot_shift - exponent)) - 1); - - q = ecma_number_make_normal_positive_from_fraction_and_exponent (fraction, - exponent); - if (sign) - { - q = ecma_number_negate (q); - } - } + ecma_number_t q = ecma_number_trunc (ecma_number_divide (n, d)); return ecma_number_substract (n, ecma_number_multiply (d, q)); } /* ecma_op_number_remainder */