mirror of
https://github.com/jerryscript-project/jerryscript.git
synced 2025-12-15 16:29:21 +00:00
The removal of these macros enabled cppcheck to reveal new errors. These errors are also fixed by the patch. JerryScript-DCO-1.0-Signed-off-by: Robert Fancsik frobert@inf.u-szeged.hu
141 lines
5.3 KiB
C
141 lines
5.3 KiB
C
/* Copyright JS Foundation and other contributors, http://js.foundation
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef ECMA_BIG_UINT_H
|
|
#define ECMA_BIG_UINT_H
|
|
|
|
#include "ecma-globals.h"
|
|
|
|
#if JERRY_BUILTIN_BIGINT
|
|
|
|
/**
|
|
* Limit of BigUInt memory allocation in JerryScript.
|
|
*/
|
|
#define ECMA_BIGINT_MAX_SIZE 0x10000
|
|
|
|
/**
|
|
* Unsigned type which can hold two digits.
|
|
*/
|
|
typedef uint64_t ecma_bigint_two_digits_t;
|
|
|
|
/**
|
|
* Shift used by left/right shifting of a value.
|
|
*/
|
|
#define ECMA_BIGINT_DIGIT_SHIFT 5
|
|
|
|
/**
|
|
* Return with the digits of a BigInt value.
|
|
*/
|
|
#define ECMA_BIGINT_GET_DIGITS(value_p, offset) \
|
|
((ecma_bigint_digit_t *) (((uint8_t *) (value_p)) + sizeof (ecma_extended_primitive_t) + (offset)))
|
|
|
|
/**
|
|
* Return with the digits of a BigInt value.
|
|
*/
|
|
#define ECMA_BIGINT_GET_LAST_DIGIT(value_p, size) \
|
|
*ECMA_BIGINT_GET_DIGITS (value_p, size - sizeof (ecma_bigint_digit_t))
|
|
|
|
/**
|
|
* Returns true if size is an odd number.
|
|
*/
|
|
#define ECMA_BIGINT_SIZE_IS_ODD(size) \
|
|
(((size) & sizeof (ecma_bigint_digit_t)) != 0)
|
|
|
|
/**
|
|
* Returns a two digit value where the high digit is set to the passed digit.
|
|
*/
|
|
#define ECMA_BIGINT_HIGH_DIGIT(digit) \
|
|
(((ecma_bigint_two_digits_t) digit) << (8 * sizeof (ecma_bigint_digit_t)))
|
|
|
|
/**
|
|
* Tells whether a number (usually a digit or uint32_t value) is an odd number.
|
|
*/
|
|
#define ECMA_BIGINT_NUMBER_IS_ODD(number) ((number & 0x1) != 0)
|
|
|
|
/**
|
|
* Bitwise operation types.
|
|
*/
|
|
typedef enum
|
|
{
|
|
ECMA_BIG_UINT_BITWISE_AND, /**< bitwise 'and' operation */
|
|
ECMA_BIG_UINT_BITWISE_OR, /**< bitwise 'or' operation */
|
|
ECMA_BIG_UINT_BITWISE_XOR, /**< bitwise 'xor' operation */
|
|
ECMA_BIG_UINT_BITWISE_AND_NOT, /**< bitwise 'and not' operation */
|
|
} ecma_big_uint_bitwise_operation_types_t;
|
|
|
|
/**
|
|
* Returns with the type of the operation.
|
|
*/
|
|
#define ECMA_BIGINT_BITWISE_GET_OPERATION_TYPE(operation_and_options) \
|
|
((operation_and_options) & 0xf)
|
|
|
|
/**
|
|
* Options for bitwise operations.
|
|
*/
|
|
typedef enum
|
|
{
|
|
ECMA_BIG_UINT_BITWISE_DECREASE_LEFT = (1 << 4), /**< subtract 1 from left value */
|
|
ECMA_BIG_UINT_BITWISE_DECREASE_RIGHT = (1 << 5), /**< subtract 1 from right value */
|
|
ECMA_BIG_UINT_BITWISE_INCREASE_RESULT = (1 << 6), /**< add 1 to the result */
|
|
} ecma_big_uint_bitwise_options_t;
|
|
|
|
/**
|
|
* Subtract 1 from both left and right values.
|
|
*/
|
|
#define ECMA_BIG_UINT_BITWISE_DECREASE_BOTH \
|
|
(ECMA_BIG_UINT_BITWISE_DECREASE_LEFT | ECMA_BIG_UINT_BITWISE_DECREASE_RIGHT)
|
|
|
|
ecma_extended_primitive_t *ecma_bigint_create (uint32_t size);
|
|
ecma_extended_primitive_t *ecma_big_uint_extend (ecma_extended_primitive_t *value_p, ecma_bigint_digit_t digit);
|
|
|
|
ecma_bigint_digit_t ecma_big_uint_count_leading_zero (ecma_bigint_digit_t digit);
|
|
|
|
int ecma_big_uint_compare (ecma_extended_primitive_t *left_value_p, ecma_extended_primitive_t *right_value_p);
|
|
|
|
ecma_extended_primitive_t *ecma_big_uint_mul_digit (ecma_extended_primitive_t *value_p,
|
|
ecma_bigint_digit_t mul, ecma_bigint_digit_t add);
|
|
|
|
uint8_t *ecma_big_uint_to_string (ecma_extended_primitive_t *value_p, uint32_t radix,
|
|
uint32_t *char_start_p, uint32_t *char_size_p);
|
|
|
|
ecma_extended_primitive_t *ecma_big_uint_increase (ecma_extended_primitive_t *value_p);
|
|
ecma_extended_primitive_t *ecma_big_uint_decrease (ecma_extended_primitive_t *value_p);
|
|
|
|
ecma_extended_primitive_t *ecma_big_uint_add (ecma_extended_primitive_t *left_value_p,
|
|
ecma_extended_primitive_t *right_value_p);
|
|
ecma_extended_primitive_t *ecma_big_uint_sub (ecma_extended_primitive_t *left_value_p,
|
|
ecma_extended_primitive_t *right_value_p);
|
|
ecma_extended_primitive_t *ecma_big_uint_mul (ecma_extended_primitive_t *left_value_p,
|
|
ecma_extended_primitive_t *right_value_p);
|
|
ecma_extended_primitive_t *ecma_big_uint_div_mod (ecma_extended_primitive_t *dividend_value_p,
|
|
ecma_extended_primitive_t *divisor_value_p,
|
|
bool is_mod);
|
|
|
|
ecma_extended_primitive_t *ecma_big_uint_shift_left (ecma_extended_primitive_t *left_value_p, uint32_t right_value);
|
|
ecma_extended_primitive_t *ecma_big_uint_shift_right (ecma_extended_primitive_t *left_value_p, uint32_t right_value,
|
|
bool increase_result);
|
|
|
|
#if JERRY_ESNEXT
|
|
ecma_extended_primitive_t *ecma_big_uint_pow (ecma_extended_primitive_t *left_value_p, uint32_t right_value);
|
|
#endif /* JERRY_ESNEXT */
|
|
|
|
ecma_extended_primitive_t *ecma_big_uint_bitwise_op (uint32_t operation_and_options,
|
|
ecma_extended_primitive_t *left_value_p,
|
|
ecma_extended_primitive_t *right_value_p);
|
|
|
|
#endif /* JERRY_BUILTIN_BIGINT */
|
|
|
|
#endif /* ECMA_BIG_UINT_H */
|