@@ -149,6 +149,8 @@ typedef struct {
149
149
150
150
static jl_value_t * jl_idtable_type = NULL ;
151
151
static jl_typename_t * jl_idtable_typename = NULL ;
152
+ static jl_value_t * jl_bigint_type = NULL ;
153
+ static int gmp_limb_size = 0 ;
152
154
static arraylist_t builtin_typenames ;
153
155
154
156
#define write_uint8 (s , n ) ios_putc((n), (s))
@@ -921,6 +923,17 @@ static void jl_serialize_value_(jl_serializer_state *s, jl_value_t *v, int as_li
921
923
for (i = 0 ; i < jl_datatype_nfields (jl_lineinfonode_type ); i ++ )
922
924
jl_serialize_value (s , jl_get_nth_field (v , i ));
923
925
}
926
+ else if (jl_bigint_type && jl_typeis (v , jl_bigint_type )) {
927
+ write_uint8 (s -> s , TAG_SHORT_GENERAL );
928
+ write_uint8 (s -> s , jl_datatype_size (jl_bigint_type ));
929
+ jl_serialize_value (s , jl_bigint_type );
930
+ jl_value_t * sizefield = jl_get_nth_field (v , 1 );
931
+ jl_serialize_value (s , sizefield );
932
+ void * data = jl_unbox_voidpointer (jl_get_nth_field (v , 2 ));
933
+ int32_t sz = jl_unbox_int32 (sizefield );
934
+ size_t nb = (sz == 0 ? 1 : (sz < 0 ? - sz : sz )) * gmp_limb_size ;
935
+ ios_write (s -> s , (char * )data , nb );
936
+ }
924
937
else {
925
938
jl_datatype_t * t = (jl_datatype_t * )jl_typeof (v );
926
939
void * data = jl_data_ptr (v );
@@ -1925,6 +1938,17 @@ static jl_value_t *jl_deserialize_value_any(jl_serializer_state *s, uint8_t tag,
1925
1938
int nby = jl_datatype_size (dt );
1926
1939
ios_read (s -> s , (char * )jl_data_ptr (v ), nby );
1927
1940
}
1941
+ else if ((jl_value_t * )dt == jl_bigint_type ) {
1942
+ jl_value_t * sizefield = jl_deserialize_value (s , NULL );
1943
+ int32_t sz = jl_unbox_int32 (sizefield );
1944
+ int32_t nw = (sz == 0 ? 1 : (sz < 0 ? - sz : sz ));
1945
+ size_t nb = nw * gmp_limb_size ;
1946
+ void * buf = jl_gc_counted_malloc (nb );
1947
+ ios_read (s -> s , (char * )buf , nb );
1948
+ jl_set_nth_field (v , 0 , jl_box_int32 (nw ));
1949
+ jl_set_nth_field (v , 1 , sizefield );
1950
+ jl_set_nth_field (v , 2 , jl_box_voidpointer (buf ));
1951
+ }
1928
1952
else {
1929
1953
jl_deserialize_struct (s , v , 0 );
1930
1954
}
@@ -2631,6 +2655,11 @@ JL_DLLEXPORT int jl_save_incremental(const char *fname, jl_array_t *worklist)
2631
2655
backref_table_numel = 1 ;
2632
2656
jl_idtable_type = jl_base_module ? jl_get_global (jl_base_module , jl_symbol ("IdDict" )) : NULL ;
2633
2657
jl_idtable_typename = jl_base_module ? ((jl_datatype_t * )jl_unwrap_unionall ((jl_value_t * )jl_idtable_type ))-> name : NULL ;
2658
+ jl_bigint_type = jl_base_module ? jl_get_global (jl_base_module , jl_symbol ("BigInt" )) : NULL ;
2659
+ if (jl_bigint_type ) {
2660
+ gmp_limb_size = jl_unbox_long (jl_get_global ((jl_module_t * )jl_get_global (jl_base_module , jl_symbol ("GMP" )),
2661
+ jl_symbol ("BITS_PER_LIMB" ))) / 8 ;
2662
+ }
2634
2663
2635
2664
int en = jl_gc_enable (0 ); // edges map is not gc-safe
2636
2665
jl_array_t * lambdas = jl_alloc_vec_any (0 );
@@ -3008,6 +3037,12 @@ static jl_value_t *_jl_restore_incremental(ios_t *f, jl_array_t *mod_array)
3008
3037
ios_skip (f , deplen );
3009
3038
}
3010
3039
3040
+ jl_bigint_type = jl_base_module ? jl_get_global (jl_base_module , jl_symbol ("BigInt" )) : NULL ;
3041
+ if (jl_bigint_type ) {
3042
+ gmp_limb_size = jl_unbox_long (jl_get_global ((jl_module_t * )jl_get_global (jl_base_module , jl_symbol ("GMP" )),
3043
+ jl_symbol ("BITS_PER_LIMB" ))) / 8 ;
3044
+ }
3045
+
3011
3046
// list of world counters of incremental dependencies
3012
3047
arraylist_t dependent_worlds ;
3013
3048
arraylist_new (& dependent_worlds , 0 );
0 commit comments