Skip to content

Commit 2ae2884

Browse files
committed
move intn_to_term_size to term.h
This function is required in any place a new bigint term needs to be created. Also rename it to `term_intn_to_term_size`. Signed-off-by: Davide Bettio <davide@uninstall.it>
1 parent 2766c05 commit 2ae2884

File tree

3 files changed

+22
-40
lines changed

3 files changed

+22
-40
lines changed

src/libAtomVM/bif.c

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -713,25 +713,6 @@ term bif_erlang_sub_2(Context *ctx, uint32_t fail_label, int live, term arg1, te
713713
}
714714
}
715715

716-
static inline void intn_to_term_size(size_t n, size_t *intn_data_size, size_t *rounded_num_len)
717-
{
718-
size_t bytes = n * sizeof(intn_digit_t);
719-
size_t rounded = ((bytes + 7) >> 3) << 3;
720-
*intn_data_size = rounded / sizeof(term);
721-
722-
if (*intn_data_size == BOXED_TERMS_REQUIRED_FOR_INT64) {
723-
// we need to distinguish between "small" boxed integers, that are integers
724-
// up to int64, and bigger integers.
725-
// The real difference is that "small" boxed integers use 2-complement,
726-
// real bigints not (and also endianess might differ).
727-
// So we force real bigints to be > BOXED_TERMS_REQUIRED_FOR_INT64 terms
728-
*intn_data_size = BOXED_TERMS_REQUIRED_FOR_INT64 + 1;
729-
rounded = *intn_data_size * sizeof(term);
730-
}
731-
732-
*rounded_num_len = rounded / sizeof(intn_digit_t);
733-
}
734-
735716
static term make_bigint(Context *ctx, uint32_t fail_label, uint32_t live,
736717
const intn_digit_t bigres[], size_t bigres_len, intn_integer_sign_t sign)
737718
{
@@ -744,7 +725,7 @@ static term make_bigint(Context *ctx, uint32_t fail_label, uint32_t live,
744725
if (!intn_fits_int64(bigres, count, sign)) {
745726
size_t intn_data_size;
746727
size_t rounded_res_len;
747-
intn_to_term_size(count, &intn_data_size, &rounded_res_len);
728+
term_intn_to_term_size(count, &intn_data_size, &rounded_res_len);
748729

749730
if (UNLIKELY(memory_ensure_free_with_roots(
750731
ctx, BOXED_INTN_SIZE(intn_data_size), live, ctx->x, MEMORY_CAN_SHRINK)

src/libAtomVM/nifs.c

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1905,30 +1905,11 @@ static term nif_erlang_binary_to_atom_1(Context *ctx, int argc, term argv[])
19051905
return result;
19061906
}
19071907

1908-
static inline void intn_to_term_size(size_t n, size_t *intn_data_size, size_t *rounded_num_len)
1909-
{
1910-
size_t bytes = n * sizeof(intn_digit_t);
1911-
size_t rounded = ((bytes + 7) >> 3) << 3;
1912-
*intn_data_size = rounded / sizeof(term);
1913-
1914-
if (*intn_data_size == BOXED_TERMS_REQUIRED_FOR_INT64) {
1915-
// we need to distinguish between "small" boxed integers, that are integers
1916-
// up to int64, and bigger integers.
1917-
// The real difference is that "small" boxed integers use 2-complement,
1918-
// real bigints not (and also endianess might differ).
1919-
// So we force real bigints to be > BOXED_TERMS_REQUIRED_FOR_INT64 terms
1920-
*intn_data_size = BOXED_TERMS_REQUIRED_FOR_INT64 + 1;
1921-
rounded = *intn_data_size * sizeof(term);
1922-
}
1923-
1924-
*rounded_num_len = rounded / sizeof(intn_digit_t);
1925-
}
1926-
19271908
static term make_bigint(Context *ctx, const intn_digit_t bigres[], size_t bigres_len, intn_integer_sign_t sign)
19281909
{
19291910
size_t intn_data_size;
19301911
size_t rounded_res_len;
1931-
intn_to_term_size(bigres_len, &intn_data_size, &rounded_res_len);
1912+
term_intn_to_term_size(bigres_len, &intn_data_size, &rounded_res_len);
19321913

19331914
if (UNLIKELY(memory_ensure_free(ctx, BOXED_INTN_SIZE(intn_data_size)) != MEMORY_GC_OK)) {
19341915
RAISE_ERROR(OUT_OF_MEMORY_ATOM);

src/libAtomVM/term.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include <stdlib.h>
3838
#include <string.h>
3939

40+
#include "intn.h"
4041
#include "memory.h"
4142
#include "refc_binary.h"
4243
#include "utils.h"
@@ -985,6 +986,25 @@ static inline size_t term_intn_size(term t)
985986
return term_get_size_from_boxed_header(boxed_value[0]);
986987
}
987988

989+
static inline void term_intn_to_term_size(size_t n, size_t *intn_data_size, size_t *rounded_num_len)
990+
{
991+
size_t bytes = n * sizeof(intn_digit_t);
992+
size_t rounded = ((bytes + 7) >> 3) << 3;
993+
*intn_data_size = rounded / sizeof(term);
994+
995+
if (*intn_data_size == BOXED_TERMS_REQUIRED_FOR_INT64) {
996+
// we need to distinguish between "small" boxed integers, that are integers
997+
// up to int64, and bigger integers.
998+
// The real difference is that "small" boxed integers use 2-complement,
999+
// real bigints not (and also endianess might differ).
1000+
// So we force real bigints to be > BOXED_TERMS_REQUIRED_FOR_INT64 terms
1001+
*intn_data_size = BOXED_TERMS_REQUIRED_FOR_INT64 + 1;
1002+
rounded = *intn_data_size * sizeof(term);
1003+
}
1004+
1005+
*rounded_num_len = rounded / sizeof(intn_digit_t);
1006+
}
1007+
9881008
static inline term term_from_catch_label(unsigned int module_index, unsigned int label)
9891009
{
9901010
return (term) ((module_index << 24) | (label << 6) | TERM_CATCH_TAG);

0 commit comments

Comments
 (0)