Skip to content

Commit 1a3940c

Browse files
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 [email protected]
1 parent bac7908 commit 1a3940c

File tree

3 files changed

+29
-12
lines changed

3 files changed

+29
-12
lines changed

jerry-core/ecma/base/ecma-helpers-number.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,33 @@ ecma_number_trunc (ecma_number_t num) /**< ecma-number */
707707
}
708708
} /* ecma_number_trunc */
709709

710+
/**
711+
* Calculate remainder of division of two numbers,
712+
* as specified in ECMA-262 v5, 11.5.3, item 6.
713+
*
714+
* Note:
715+
* operands shouldn't contain NaN, Infinity, or zero.
716+
*
717+
* @return number - calculated remainder.
718+
*/
719+
ecma_number_t
720+
ecma_number_calc_remainder (ecma_number_t left_num, /**< left operand */
721+
ecma_number_t right_num) /**< right operand */
722+
{
723+
ecma_number_t n = left_num, d = right_num;
724+
725+
JERRY_ASSERT (!ecma_number_is_nan (n)
726+
&& !ecma_number_is_zero (n)
727+
&& !ecma_number_is_infinity (n));
728+
JERRY_ASSERT (!ecma_number_is_nan (d)
729+
&& !ecma_number_is_zero (d)
730+
&& !ecma_number_is_infinity (d));
731+
732+
ecma_number_t q = ecma_number_trunc (ecma_number_divide (n, d));
733+
734+
return ecma_number_substract (n, ecma_number_multiply (d, q));
735+
} /* ecma_number_calc_remainder */
736+
710737
/**
711738
* ECMA-number addition.
712739
*

jerry-core/ecma/base/ecma-helpers.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ extern ecma_number_t ecma_number_get_prev (ecma_number_t num);
185185
extern ecma_number_t ecma_number_get_next (ecma_number_t num);
186186
extern ecma_number_t ecma_number_negate (ecma_number_t num);
187187
extern ecma_number_t ecma_number_trunc (ecma_number_t num);
188+
extern ecma_number_t ecma_number_calc_remainder (ecma_number_t left_num, ecma_number_t right_num);
188189
extern ecma_number_t ecma_number_add (ecma_number_t left_num, ecma_number_t right_num);
189190
extern ecma_number_t ecma_number_substract (ecma_number_t left_num, ecma_number_t right_num);
190191
extern ecma_number_t ecma_number_multiply (ecma_number_t left_num, ecma_number_t right_num);

jerry-core/ecma/operations/ecma-number-arithmetic.cpp

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@ ecma_number_t
3838
ecma_op_number_remainder (ecma_number_t left_num, /**< left operand */
3939
ecma_number_t right_num) /**< right operand */
4040
{
41-
TODO (Check precision);
42-
4341
ecma_number_t n = left_num, d = right_num;
4442

4543
if (ecma_number_is_nan (n)
@@ -56,16 +54,7 @@ ecma_op_number_remainder (ecma_number_t left_num, /**< left operand */
5654
return n;
5755
}
5856

59-
JERRY_ASSERT (!ecma_number_is_nan (n)
60-
&& !ecma_number_is_zero (n)
61-
&& !ecma_number_is_infinity (n));
62-
JERRY_ASSERT (!ecma_number_is_nan (d)
63-
&& !ecma_number_is_zero (d)
64-
&& !ecma_number_is_infinity (d));
65-
66-
ecma_number_t q = ecma_number_trunc (ecma_number_divide (n, d));
67-
68-
return ecma_number_substract (n, ecma_number_multiply (d, q));
57+
return ecma_number_calc_remainder (n, d);
6958
} /* ecma_op_number_remainder */
7059

7160
/**

0 commit comments

Comments
 (0)