@@ -1905,6 +1905,31 @@ static term nif_erlang_binary_to_atom_1(Context *ctx, int argc, term argv[])
1905
1905
return result ;
1906
1906
}
1907
1907
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
+ * rounded_num_len = rounded / sizeof (intn_digit_t );
1914
+ }
1915
+
1916
+ static term make_bigint (Context * ctx , const intn_digit_t bigres [], size_t bigres_len )
1917
+ {
1918
+ size_t intn_data_size ;
1919
+ size_t rounded_res_len ;
1920
+ intn_to_term_size (bigres_len , & intn_data_size , & rounded_res_len );
1921
+
1922
+ if (UNLIKELY (memory_ensure_free (ctx , BOXED_INTN_SIZE (intn_data_size )) != MEMORY_GC_OK )) {
1923
+ RAISE_ERROR (OUT_OF_MEMORY_ATOM );
1924
+ }
1925
+
1926
+ term bigres_term = term_create_uninitialized_intn (intn_data_size , & ctx -> heap );
1927
+ intn_digit_t * dest_buf = (void * ) term_intn_data (bigres_term );
1928
+ intn_sign_extend (bigres , bigres_len , rounded_res_len , dest_buf );
1929
+
1930
+ return bigres_term ;
1931
+ }
1932
+
1908
1933
static term nif_erlang_binary_to_integer (Context * ctx , int argc , term argv [])
1909
1934
{
1910
1935
term bin_term = argv [0 ];
@@ -1926,11 +1951,17 @@ static term nif_erlang_binary_to_integer(Context *ctx, int argc, term argv[])
1926
1951
int bin_data_size = term_binary_size (bin_term );
1927
1952
1928
1953
int64_t value ;
1929
- if (int64_parse_ascii_buf (bin_data , bin_data_size , base , BufToInt64NoOptions , & value ) != bin_data_size ) {
1954
+ int parse_res
1955
+ = int64_parse_ascii_buf (bin_data , bin_data_size , base , BufToInt64NoOptions , & value );
1956
+ if (parse_res == bin_data_size ) {
1957
+ return make_maybe_boxed_int64 (ctx , value );
1958
+ } else if (parse_res > 0 ) {
1959
+ intn_digit_t tmp_parsed [INTN_MAX_RES_LEN ];
1960
+ int parsed_digits = intn_parse (bin_data , bin_data_size , base , tmp_parsed );
1961
+ return make_bigint (ctx , tmp_parsed , parsed_digits );
1962
+ } else {
1930
1963
RAISE_ERROR (BADARG_ATOM );
1931
1964
}
1932
-
1933
- return make_maybe_boxed_int64 (ctx , value );
1934
1965
}
1935
1966
1936
1967
static bool is_valid_float_string (const char * str , int len )
0 commit comments