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-
8882static 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
9488const 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
11471138static 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
12431234static 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 ;
0 commit comments