@@ -272,6 +272,7 @@ static int has_backedge_to_worklist(jl_method_instance_t *mi, htable_t *visited)
272
272
for (i = 0 ; i < n ; i ++ ) {
273
273
jl_method_instance_t * be = (jl_method_instance_t * )jl_array_ptr_ref (mi -> backedges , i );
274
274
if (has_backedge_to_worklist (be , visited )) {
275
+ bp = ptrhash_bp (visited , mi ); // re-acquire since rehashing might change the location
275
276
* bp = (void * )((char * )HT_NOTFOUND + 2 ); // found
276
277
return 1 ;
277
278
}
@@ -286,10 +287,10 @@ static size_t queue_external_mis(jl_array_t *list)
286
287
{
287
288
size_t i , n = 0 ;
288
289
htable_t visited ;
289
- htable_new (& visited , 0 );
290
290
if (list ) {
291
291
assert (jl_is_array (list ));
292
292
size_t n0 = jl_array_len (list );
293
+ htable_new (& visited , n0 );
293
294
for (i = 0 ; i < n0 ; i ++ ) {
294
295
jl_method_instance_t * mi = (jl_method_instance_t * )jl_array_ptr_ref (list , i );
295
296
assert (jl_is_method_instance (mi ));
@@ -2640,7 +2641,7 @@ JL_DLLEXPORT int jl_save_incremental(const char *fname, jl_array_t *worklist)
2640
2641
arraylist_new (& reinit_list , 0 );
2641
2642
htable_new (& edges_map , 0 );
2642
2643
htable_new (& backref_table , 5000 );
2643
- htable_new (& external_mis , 0 );
2644
+ htable_new (& external_mis , newly_inferred ? jl_array_len ( newly_inferred ) : 0 );
2644
2645
ptrhash_put (& backref_table , jl_main_module , (char * )HT_NOTFOUND + 1 );
2645
2646
backref_table_numel = 1 ;
2646
2647
jl_idtable_type = jl_base_module ? jl_get_global (jl_base_module , jl_symbol ("IdDict" )) : NULL ;
0 commit comments