Implement exponentiation operation. (#3692)
JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
@@ -13,6 +13,8 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include "ecma-conversion.h"
|
||||
#include "lit-char-helpers.h"
|
||||
|
||||
@@ -656,6 +658,31 @@ ecma_number_calc_remainder (ecma_number_t left_num, /**< left operand */
|
||||
return r;
|
||||
} /* ecma_number_calc_remainder */
|
||||
|
||||
/**
|
||||
* Compute power operation according to the ES standard.
|
||||
*
|
||||
* @return x ** y
|
||||
*/
|
||||
ecma_number_t
|
||||
ecma_number_pow (ecma_number_t x, /**< left operand */
|
||||
ecma_number_t y) /**< right operand */
|
||||
{
|
||||
if (ecma_number_is_nan (y) ||
|
||||
(ecma_number_is_infinity (y) && (x == 1.0 || x == -1.0)))
|
||||
{
|
||||
/* Handle differences between ES5.1 and ISO C standards for pow. */
|
||||
return ecma_number_make_nan ();
|
||||
}
|
||||
|
||||
if (ecma_number_is_zero (y))
|
||||
{
|
||||
/* Handle differences between ES5.1 and ISO C standards for pow. */
|
||||
return (ecma_number_t) 1.0;
|
||||
}
|
||||
|
||||
return DOUBLE_TO_ECMA_NUMBER_T (pow (x, y));
|
||||
} /* ecma_number_pow */
|
||||
|
||||
/**
|
||||
* ECMA-integer number multiplication.
|
||||
*
|
||||
|
||||
@@ -400,6 +400,7 @@ ecma_number_t ecma_number_get_prev (ecma_number_t num);
|
||||
ecma_number_t ecma_number_get_next (ecma_number_t num);
|
||||
ecma_number_t ecma_number_trunc (ecma_number_t num);
|
||||
ecma_number_t ecma_number_calc_remainder (ecma_number_t left_num, ecma_number_t right_num);
|
||||
ecma_number_t ecma_number_pow (ecma_number_t x, ecma_number_t y);
|
||||
ecma_value_t ecma_number_parse_int (const lit_utf8_byte_t *string_buff,
|
||||
lit_utf8_size_t string_buff_size,
|
||||
ecma_value_t radix);
|
||||
|
||||
@@ -505,21 +505,7 @@ ecma_builtin_math_dispatch_routine (uint16_t builtin_routine_id, /**< built-in w
|
||||
}
|
||||
case ECMA_MATH_OBJECT_POW:
|
||||
{
|
||||
if (ecma_number_is_nan (y) ||
|
||||
(ecma_number_is_infinity (y) && (x == 1.0 || x == -1.0)))
|
||||
{
|
||||
/* Handle differences between ES5.1 and ISO C standards for pow. */
|
||||
x = ecma_number_make_nan ();
|
||||
}
|
||||
else if (ecma_number_is_zero (y))
|
||||
{
|
||||
/* Handle differences between ES5.1 and ISO C standards for pow. */
|
||||
x = (ecma_number_t) 1.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
x = DOUBLE_TO_ECMA_NUMBER_T (pow (x, y));
|
||||
}
|
||||
x = ecma_number_pow (x, y);
|
||||
break;
|
||||
}
|
||||
#if ENABLED (JERRY_ES2015)
|
||||
|
||||
Reference in New Issue
Block a user