Skip to content

Commit 014c48b

Browse files
committed
Merge pull request #1933 from bettio/remove-unused-file
Doc and improve bigint term funcs Add more bigint related functions to `term.h`, in order to avoid code duplication. Also document existing ones, and use consistently the `bigint` word. The codebase uses two related but distinct terms: - _intn_ refers to the multi-precision integer implementation (the low-level arithmetic library that operates on arrays of digits) - _bigint_ refers to the term type in AtomVM's type system (boxed integers larger than int64) This separation allows the bigint term interface to remain stable even if the underlying multi-precision implementation changes. Functions in term.h use "bigint" because they work with terms, while intn.h contains the actual arithmetic implementation. Continuation of #1930 These changes are made under both the "Apache 2.0" and the "GNU Lesser General Public License 2.1 or later" license terms (dual license). SPDX-License-Identifier: Apache-2.0 OR LGPL-2.1-or-later
2 parents a1aa48b + 10ce113 commit 014c48b

File tree

7 files changed

+268
-99
lines changed

7 files changed

+268
-99
lines changed

src/libAtomVM/bif.c

Lines changed: 32 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -79,16 +79,10 @@
7979
#define INT64_MAX_AS_AVM_FLOAT 9223372036854775295.0 // 0x43DFFFFFFFFFFFFF = 2^62 * 1.1...1b
8080
#endif
8181

82-
// intn.h and term.h headers are decoupled. We check here that sign enum values are matching.
83-
_Static_assert(
84-
(int) TermPositiveInteger == (int) IntNPositiveInteger, "term/intn definition mismatch");
85-
_Static_assert(
86-
(int) TermNegativeInteger == (int) IntNNegativeInteger, "term/intn definition mismatch");
87-
8882
static term make_bigint(Context *ctx, uint32_t fail_label, uint32_t live,
8983
const intn_digit_t bigres[], size_t bigres_len, intn_integer_sign_t sign);
9084

91-
static void term_to_bigint(term arg1, intn_digit_t *tmp_buf1, const intn_digit_t **b1,
85+
static void conv_term_to_bigint(term arg1, intn_digit_t *tmp_buf1, const intn_digit_t **b1,
9286
size_t *b1_len, intn_integer_sign_t *b1_sign);
9387

9488
const struct ExportedFunction *bif_registry_get_handler(const char *mfa)
@@ -555,11 +549,11 @@ static term add_maybe_bigint(Context *ctx, uint32_t fail_label, uint32_t live, t
555549
const intn_digit_t *bn1;
556550
size_t bn1_len;
557551
intn_integer_sign_t bn1_sign;
558-
term_to_bigint(arg1, tmp_buf1, &bn1, &bn1_len, &bn1_sign);
552+
conv_term_to_bigint(arg1, tmp_buf1, &bn1, &bn1_len, &bn1_sign);
559553
const intn_digit_t *bn2;
560554
size_t bn2_len;
561555
intn_integer_sign_t bn2_sign;
562-
term_to_bigint(arg2, tmp_buf2, &bn2, &bn2_len, &bn2_sign);
556+
conv_term_to_bigint(arg2, tmp_buf2, &bn2, &bn2_len, &bn2_sign);
563557

564558
size_t bigres_len = INTN_ADD_OUT_LEN(bn1_len, bn2_len);
565559
if (bigres_len > INTN_MAX_RES_LEN) {
@@ -693,11 +687,11 @@ static term sub_maybe_bigint(Context *ctx, uint32_t fail_label, uint32_t live, t
693687
const intn_digit_t *bn1;
694688
size_t bn1_len;
695689
intn_integer_sign_t bn1_sign;
696-
term_to_bigint(arg1, tmp_buf1, &bn1, &bn1_len, &bn1_sign);
690+
conv_term_to_bigint(arg1, tmp_buf1, &bn1, &bn1_len, &bn1_sign);
697691
const intn_digit_t *bn2;
698692
size_t bn2_len;
699693
intn_integer_sign_t bn2_sign;
700-
term_to_bigint(arg2, tmp_buf2, &bn2, &bn2_len, &bn2_sign);
694+
conv_term_to_bigint(arg2, tmp_buf2, &bn2, &bn2_len, &bn2_sign);
701695

702696
size_t bigres_len = INTN_SUB_OUT_LEN(bn1_len, bn2_len);
703697
if (bigres_len > INTN_MAX_RES_LEN) {
@@ -815,18 +809,17 @@ static term make_bigint(Context *ctx, uint32_t fail_label, uint32_t live,
815809
if (!intn_fits_int64(bigres, count, sign)) {
816810
size_t intn_data_size;
817811
size_t rounded_res_len;
818-
term_intn_to_term_size(count, &intn_data_size, &rounded_res_len);
812+
term_bigint_size_requirements(count, &intn_data_size, &rounded_res_len);
819813

820814
if (UNLIKELY(memory_ensure_free_with_roots(
821-
ctx, BOXED_INTN_SIZE(intn_data_size), live, ctx->x, MEMORY_CAN_SHRINK)
815+
ctx, BOXED_BIGINT_HEAP_SIZE(intn_data_size), live, ctx->x, MEMORY_CAN_SHRINK)
822816
!= MEMORY_GC_OK)) {
823817
RAISE_ERROR_BIF(fail_label, OUT_OF_MEMORY_ATOM);
824818
}
825819

826-
term bigres_term = term_create_uninitialized_intn(
820+
term bigres_term = term_create_uninitialized_bigint(
827821
intn_data_size, (term_integer_sign_t) sign, &ctx->heap);
828-
intn_digit_t *dest_buf = (void *) term_intn_data(bigres_term);
829-
intn_copy(bigres, count, dest_buf, rounded_res_len);
822+
term_initialize_bigint(bigres_term, bigres, count, rounded_res_len);
830823

831824
return bigres_term;
832825
} else {
@@ -839,14 +832,12 @@ static term make_bigint(Context *ctx, uint32_t fail_label, uint32_t live,
839832
}
840833
}
841834

842-
static void term_to_bigint(term arg1, intn_digit_t *tmp_buf1, const intn_digit_t **b1,
835+
static void conv_term_to_bigint(term arg1, intn_digit_t *tmp_buf1, const intn_digit_t **b1,
843836
size_t *b1_len, intn_integer_sign_t *b1_sign)
844837
{
845-
if (term_is_boxed_integer(arg1)
846-
&& (term_boxed_size(arg1) > (INTN_INT64_LEN * sizeof(intn_digit_t)) / sizeof(term))) {
847-
*b1 = term_intn_data(arg1);
848-
*b1_len = term_intn_size(arg1) * (sizeof(term) / sizeof(intn_digit_t));
849-
*b1_sign = (intn_integer_sign_t) term_boxed_integer_sign(arg1);
838+
if (term_is_bigint(arg1)) {
839+
term_to_bigint(arg1, b1, b1_len, b1_sign);
840+
850841
} else {
851842
avm_int64_t i64 = term_maybe_unbox_int64(arg1);
852843
intn_from_int64(i64, tmp_buf1, b1_sign);
@@ -874,11 +865,11 @@ static term mul_maybe_bigint(Context *ctx, uint32_t fail_label, uint32_t live, t
874865
const intn_digit_t *bn1;
875866
size_t bn1_len;
876867
intn_integer_sign_t bn1_sign;
877-
term_to_bigint(arg1, tmp_buf1, &bn1, &bn1_len, &bn1_sign);
868+
conv_term_to_bigint(arg1, tmp_buf1, &bn1, &bn1_len, &bn1_sign);
878869
const intn_digit_t *bn2;
879870
size_t bn2_len;
880871
intn_integer_sign_t bn2_sign;
881-
term_to_bigint(arg2, tmp_buf2, &bn2, &bn2_len, &bn2_sign);
872+
conv_term_to_bigint(arg2, tmp_buf2, &bn2, &bn2_len, &bn2_sign);
882873

883874
size_t bigres_len = INTN_MUL_OUT_LEN(bn1_len, bn2_len);
884875
if (bigres_len > INTN_MAX_RES_LEN) {
@@ -1038,11 +1029,11 @@ static term div_maybe_bigint(Context *ctx, uint32_t fail_label, uint32_t live, t
10381029
const intn_digit_t *bn1;
10391030
size_t bn1_len;
10401031
intn_integer_sign_t bn1_sign;
1041-
term_to_bigint(arg1, tmp_buf1, &bn1, &bn1_len, &bn1_sign);
1032+
conv_term_to_bigint(arg1, tmp_buf1, &bn1, &bn1_len, &bn1_sign);
10421033
const intn_digit_t *bn2;
10431034
size_t bn2_len;
10441035
intn_integer_sign_t bn2_sign;
1045-
term_to_bigint(arg2, tmp_buf2, &bn2, &bn2_len, &bn2_sign);
1036+
conv_term_to_bigint(arg2, tmp_buf2, &bn2, &bn2_len, &bn2_sign);
10461037

10471038
int cmp_result = intn_cmp(bn1, bn1_len, bn2, bn2_len);
10481039
if (cmp_result < 0) {
@@ -1146,10 +1137,10 @@ term bif_erlang_div_2(Context *ctx, uint32_t fail_label, int live, term arg1, te
11461137
// that just copies the given term but changes the sign
11471138
static term neg_bigint(Context *ctx, uint32_t fail_label, uint32_t live, term arg1)
11481139
{
1149-
// update when updating term_to_bigint
1150-
intn_digit_t *m = term_intn_data(arg1);
1151-
size_t m_len = term_intn_size(arg1) * (sizeof(term) / sizeof(intn_digit_t));
1152-
intn_integer_sign_t m_sign = (intn_integer_sign_t) term_boxed_integer_sign(arg1);
1140+
const intn_digit_t *m;
1141+
size_t m_len;
1142+
intn_integer_sign_t m_sign;
1143+
term_to_bigint(arg1, &m, &m_len, &m_sign);
11531144

11541145
intn_digit_t tmp_copy[INTN_MAX_RES_LEN];
11551146
memcpy(tmp_copy, m, m_len * sizeof(intn_digit_t));
@@ -1242,9 +1233,10 @@ term bif_erlang_neg_1(Context *ctx, uint32_t fail_label, int live, term arg1)
12421233
// that just copies the given term but changes the sign
12431234
static term abs_bigint(Context *ctx, uint32_t fail_label, uint32_t live, term arg1)
12441235
{
1245-
// update when updating term_to_bigint
1246-
intn_digit_t *m = term_intn_data(arg1);
1247-
size_t m_len = term_intn_size(arg1) * (sizeof(term) / sizeof(intn_digit_t));
1236+
const intn_digit_t *m;
1237+
size_t m_len;
1238+
intn_integer_sign_t discarded_sign;
1239+
term_to_bigint(arg1, &m, &m_len, &discarded_sign);
12481240

12491241
intn_digit_t tmp_copy[INTN_MAX_RES_LEN];
12501242
memcpy(tmp_copy, m, m_len * sizeof(intn_digit_t));
@@ -1359,11 +1351,11 @@ static term rem_maybe_bigint(Context *ctx, uint32_t fail_label, uint32_t live, t
13591351
const intn_digit_t *bn1;
13601352
size_t bn1_len;
13611353
intn_integer_sign_t bn1_sign;
1362-
term_to_bigint(arg1, tmp_buf1, &bn1, &bn1_len, &bn1_sign);
1354+
conv_term_to_bigint(arg1, tmp_buf1, &bn1, &bn1_len, &bn1_sign);
13631355
const intn_digit_t *bn2;
13641356
size_t bn2_len;
13651357
intn_integer_sign_t bn2_sign;
1366-
term_to_bigint(arg2, tmp_buf2, &bn2, &bn2_len, &bn2_sign);
1358+
conv_term_to_bigint(arg2, tmp_buf2, &bn2, &bn2_len, &bn2_sign);
13671359

13681360
int cmp_result = intn_cmp(bn1, bn1_len, bn2, bn2_len);
13691361
if (cmp_result < 0) {
@@ -1622,11 +1614,11 @@ static inline term bitwise_helper(
16221614
const intn_digit_t *m;
16231615
size_t m_len;
16241616
intn_integer_sign_t m_sign;
1625-
term_to_bigint(arg1, tmp_buf1, &m, &m_len, &m_sign);
1617+
conv_term_to_bigint(arg1, tmp_buf1, &m, &m_len, &m_sign);
16261618
const intn_digit_t *n;
16271619
size_t n_len;
16281620
intn_integer_sign_t n_sign;
1629-
term_to_bigint(arg2, tmp_buf2, &n, &n_len, &n_sign);
1621+
conv_term_to_bigint(arg2, tmp_buf2, &n, &n_len, &n_sign);
16301622

16311623
intn_digit_t bigres[INTN_MAX_RES_LEN];
16321624
intn_integer_sign_t bigres_sign;
@@ -1702,7 +1694,7 @@ term bif_erlang_bsl_2(Context *ctx, uint32_t fail_label, int live, term arg1, te
17021694
const intn_digit_t *m;
17031695
size_t m_len;
17041696
intn_integer_sign_t m_sign;
1705-
term_to_bigint(arg1, tmp_buf1, &m, &m_len, &m_sign);
1697+
conv_term_to_bigint(arg1, tmp_buf1, &m, &m_len, &m_sign);
17061698

17071699
intn_digit_t bigres[INTN_MAX_RES_LEN];
17081700
size_t bigres_len = intn_bsl(m, m_len, b, bigres);
@@ -1762,7 +1754,7 @@ term bif_erlang_bsr_2(Context *ctx, uint32_t fail_label, int live, term arg1, te
17621754
const intn_digit_t *m;
17631755
size_t m_len;
17641756
intn_integer_sign_t m_sign;
1765-
term_to_bigint(arg1, tmp_buf1, &m, &m_len, &m_sign);
1757+
conv_term_to_bigint(arg1, tmp_buf1, &m, &m_len, &m_sign);
17661758

17671759
intn_digit_t bigres[INTN_MAX_RES_LEN];
17681760
size_t bigres_len = intn_bsr(m, m_len, m_sign, b, bigres);
@@ -1823,7 +1815,7 @@ static term bnot_boxed_helper(Context *ctx, uint32_t fail_label, uint32_t live,
18231815
const intn_digit_t *m;
18241816
size_t m_len;
18251817
intn_integer_sign_t m_sign;
1826-
term_to_bigint(arg1, tmp_buf1, &m, &m_len, &m_sign);
1818+
conv_term_to_bigint(arg1, tmp_buf1, &m, &m_len, &m_sign);
18271819

18281820
intn_digit_t bigres[INTN_MAX_RES_LEN];
18291821
intn_integer_sign_t bigres_sign;

src/libAtomVM/externalterm.c

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -234,14 +234,12 @@ static int serialize_term(uint8_t *buf, term t, GlobalContext *glb)
234234
return SMALL_BIG_EXT_BASE_SIZE + num_bytes;
235235
}
236236
} else {
237-
size_t intn_size = term_intn_size(t);
238-
size_t digits_per_term = sizeof(term) / sizeof(intn_digit_t);
239-
size_t bigint_len = intn_size * digits_per_term;
240-
const intn_digit_t *bigint = (const intn_digit_t *) term_intn_data(t);
237+
const intn_digit_t *bigint;
238+
size_t bigint_len;
239+
intn_integer_sign_t sign;
240+
term_to_bigint(t, &bigint, &bigint_len, &sign);
241241
size_t num_bytes = intn_required_unsigned_integer_bytes(bigint, bigint_len);
242242
if (buf != NULL) {
243-
intn_integer_sign_t sign = (intn_integer_sign_t) term_boxed_integer_sign(t);
244-
245243
buf[0] = SMALL_BIG_EXT;
246244
buf[1] = num_bytes;
247245
buf[2] = sign == IntNNegativeInteger ? 0x01 : 0x00;
@@ -594,13 +592,12 @@ static term parse_external_terms(const uint8_t *external_term_buf, size_t *eterm
594592

595593
size_t intn_data_size;
596594
size_t rounded_res_len;
597-
term_intn_to_term_size(count, &intn_data_size, &rounded_res_len);
595+
term_bigint_size_requirements(count, &intn_data_size, &rounded_res_len);
598596

599597
intn_integer_sign_t sign = is_negative ? IntNNegativeInteger : IntNPositiveInteger;
600598
term bigint_term
601-
= term_create_uninitialized_intn(intn_data_size, (term_integer_sign_t) sign, heap);
602-
intn_digit_t *dest_buf = (void *) term_intn_data(bigint_term);
603-
intn_copy(bigint, count, dest_buf, rounded_res_len);
599+
= term_create_uninitialized_bigint(intn_data_size, (term_integer_sign_t) sign, heap);
600+
term_initialize_bigint(bigint_term, bigint, count, rounded_res_len);
604601

605602
return bigint_term;
606603
}
@@ -1014,8 +1011,8 @@ static int calculate_heap_usage(const uint8_t *external_term_buf, size_t remaini
10141011
size_t required_digits = intn_required_digits_for_unsigned_integer(num_bytes);
10151012
size_t data_size;
10161013
size_t unused_rounded_len;
1017-
term_intn_to_term_size(required_digits, &data_size, &unused_rounded_len);
1018-
return BOXED_INTN_SIZE(data_size);
1014+
term_bigint_size_requirements(required_digits, &data_size, &unused_rounded_len);
1015+
return BOXED_BIGINT_HEAP_SIZE(data_size);
10191016
}
10201017

10211018
case ATOM_UTF8_EXT:

src/libAtomVM/jit.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -627,17 +627,19 @@ static term jit_alloc_big_integer_fragment(
627627

628628
size_t intn_data_size;
629629
size_t rounded_res_len;
630-
term_intn_to_term_size(digits_len, &intn_data_size, &rounded_res_len);
630+
term_bigint_size_requirements(digits_len, &intn_data_size, &rounded_res_len);
631631

632-
if (UNLIKELY(memory_init_heap(&heap, BOXED_INTN_SIZE(intn_data_size)) != MEMORY_GC_OK)) {
632+
if (UNLIKELY(memory_init_heap(&heap, BOXED_BIGINT_HEAP_SIZE(intn_data_size)) != MEMORY_GC_OK)) {
633633
ctx->x[0] = ERROR_ATOM;
634634
ctx->x[1] = OUT_OF_MEMORY_ATOM;
635635
return term_invalid_term();
636636
}
637637

638638
term bigint_term
639-
= term_create_uninitialized_intn(intn_data_size, (term_integer_sign_t) sign, &heap);
640-
void *digits_mem = term_intn_data(bigint_term);
639+
= term_create_uninitialized_bigint(intn_data_size, (term_integer_sign_t) sign, &heap);
640+
// Assumption: here we assume that bigints have standard boxed term layout
641+
// This code might need to be updated when changing bigint memory layout
642+
void *digits_mem = (void *) (term_to_const_term_ptr(bigint_term) + 1);
641643
// TODO: optimize: just initialize space that will not be used
642644
memset(digits_mem, 0, intn_data_size * sizeof(term));
643645

src/libAtomVM/nifs.c

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2057,16 +2057,15 @@ static term make_bigint(Context *ctx, const intn_digit_t bigres[], size_t bigres
20572057
{
20582058
size_t intn_data_size;
20592059
size_t rounded_res_len;
2060-
term_intn_to_term_size(bigres_len, &intn_data_size, &rounded_res_len);
2060+
term_bigint_size_requirements(bigres_len, &intn_data_size, &rounded_res_len);
20612061

2062-
if (UNLIKELY(memory_ensure_free(ctx, BOXED_INTN_SIZE(intn_data_size)) != MEMORY_GC_OK)) {
2062+
if (UNLIKELY(memory_ensure_free(ctx, BOXED_BIGINT_HEAP_SIZE(intn_data_size)) != MEMORY_GC_OK)) {
20632063
RAISE_ERROR(OUT_OF_MEMORY_ATOM);
20642064
}
20652065

20662066
term bigres_term
2067-
= term_create_uninitialized_intn(intn_data_size, (term_integer_sign_t) sign, &ctx->heap);
2068-
intn_digit_t *dest_buf = (void *) term_intn_data(bigres_term);
2069-
intn_copy(bigres, bigres_len, dest_buf, rounded_res_len);
2067+
= term_create_uninitialized_bigint(intn_data_size, (term_integer_sign_t) sign, &ctx->heap);
2068+
term_initialize_bigint(bigres_term, bigres, bigres_len, rounded_res_len);
20702069

20712070
return bigres_term;
20722071
}
@@ -2396,12 +2395,11 @@ static term integer_to_buf(Context *ctx, int argc, term argv[], char *tmp_buf, s
23962395
}
23972396
#endif
23982397
default: {
2399-
size_t boxed_size = term_intn_size(value);
2400-
size_t digits_per_term = sizeof(term) / sizeof(intn_digit_t);
2401-
const intn_digit_t *intn_buf = (const intn_digit_t *) term_intn_data(value);
2402-
intn_integer_sign_t sign = (intn_integer_sign_t) term_boxed_integer_sign(value);
2403-
*int_buf
2404-
= intn_to_string(intn_buf, boxed_size * digits_per_term, sign, base, int_len);
2398+
const intn_digit_t *intn_buf;
2399+
size_t intn_buf_len;
2400+
intn_integer_sign_t sign;
2401+
term_to_bigint(value, &intn_buf, &intn_buf_len, &sign);
2402+
*int_buf = intn_to_string(intn_buf, intn_buf_len, sign, base, int_len);
24052403
*needs_cleanup = true;
24062404
}
24072405
}

src/libAtomVM/opcodesswitch.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1840,21 +1840,20 @@ static bool maybe_call_native(Context *ctx, atom_index_t module_name, atom_index
18401840

18411841
size_t intn_data_size;
18421842
size_t rounded_res_len;
1843-
term_intn_to_term_size(count, &intn_data_size, &rounded_res_len);
1843+
term_bigint_size_requirements(count, &intn_data_size, &rounded_res_len);
18441844

18451845
Heap heap;
18461846
if (UNLIKELY(
1847-
memory_init_heap(&heap, BOXED_INTN_SIZE(intn_data_size)) != MEMORY_GC_OK)) {
1847+
memory_init_heap(&heap, BOXED_BIGINT_HEAP_SIZE(intn_data_size)) != MEMORY_GC_OK)) {
18481848
ctx->x[0] = ERROR_ATOM;
18491849
ctx->x[1] = OUT_OF_MEMORY_ATOM;
18501850
*out_term = term_invalid_term();
18511851
goto return_size;
18521852
}
18531853

18541854
term bigint_term
1855-
= term_create_uninitialized_intn(intn_data_size, (term_integer_sign_t) sign, &heap);
1856-
intn_digit_t *dest_buf = (void *) term_intn_data(bigint_term);
1857-
intn_copy(bigint, count, dest_buf, rounded_res_len);
1855+
= term_create_uninitialized_bigint(intn_data_size, (term_integer_sign_t) sign, &heap);
1856+
term_initialize_bigint(bigint_term, bigint, count, rounded_res_len);
18581857

18591858
memory_heap_append_heap(&ctx->heap, &heap);
18601859

src/libAtomVM/term.c

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -420,13 +420,12 @@ int term_funprint(PrinterFun *fun, term t, const GlobalContext *global)
420420
return fun->print(fun, AVM_INT64_FMT, term_unbox_int64(t));
421421
#endif
422422
default: {
423-
size_t digits_per_term = sizeof(term) / sizeof(intn_digit_t);
424-
size_t boxed_size = term_intn_size(t);
425-
const intn_digit_t *intn_data = (const intn_digit_t *) term_intn_data(t);
426-
intn_integer_sign_t sign = (intn_integer_sign_t) term_boxed_integer_sign(t);
423+
const intn_digit_t *intn_data;
424+
size_t intn_data_len;
425+
intn_integer_sign_t sign;
426+
term_to_bigint(t, &intn_data, &intn_data_len, &sign);
427427
size_t unused_s_len;
428-
char *s = intn_to_string(
429-
intn_data, boxed_size * digits_per_term, sign, 10, &unused_s_len);
428+
char *s = intn_to_string(intn_data, intn_data_len, sign, 10, &unused_s_len);
430429
if (IS_NULL_PTR(s)) {
431430
return -1;
432431
}
@@ -1087,12 +1086,12 @@ avm_float_t term_conv_to_float(term t)
10871086
return term_unbox_int64(t);
10881087
#endif
10891088
default: {
1090-
const intn_digit_t *num = (intn_digit_t *) term_intn_data(t);
1091-
size_t digits_per_term = (sizeof(term) / sizeof(intn_digit_t));
1092-
size_t len = boxed_size * digits_per_term;
1093-
term_integer_sign_t t_sign = term_boxed_integer_sign(t);
1089+
const intn_digit_t *num;
1090+
size_t num_len;
1091+
intn_integer_sign_t num_sign;
1092+
term_to_bigint(t, &num, &num_len, &num_sign);
10941093

1095-
return intn_to_double(num, len, (intn_integer_sign_t) t_sign);
1094+
return intn_to_double(num, num_len, num_sign);
10961095
}
10971096
}
10981097
} else {

0 commit comments

Comments
 (0)