@@ -2646,49 +2646,64 @@ static void jl_prune_binding_backedges(jl_array_t *backedges)
2646
2646
jl_array_del_end (backedges , n - ins );
2647
2647
}
2648
2648
2649
-
2650
2649
uint_t bindingkey_hash (size_t idx , jl_value_t * data );
2650
+ uint_t speccache_hash (size_t idx , jl_value_t * data );
2651
2651
2652
- static void jl_prune_module_bindings ( jl_module_t * m ) JL_GC_DISABLED
2652
+ static void jl_prune_idset (_Atomic ( jl_svec_t * ) * pkeys , _Atomic ( jl_genericmemory_t * ) * pkeyset , uint_t ( * key_hash )( size_t , jl_value_t * ), jl_value_t * parent ) JL_GC_DISABLED
2653
2653
{
2654
- jl_svec_t * bindings = jl_atomic_load_relaxed (& m -> bindings );
2655
- size_t l = jl_svec_len (bindings ), i ;
2656
- arraylist_t bindings_list ;
2657
- arraylist_new (& bindings_list , 0 );
2654
+ jl_svec_t * keys = * pkeys ;
2655
+ size_t l = jl_svec_len (keys ), i ;
2658
2656
if (l == 0 )
2659
2657
return ;
2658
+ arraylist_t keys_list ;
2659
+ arraylist_new (& keys_list , 0 );
2660
2660
for (i = 0 ; i < l ; i ++ ) {
2661
- jl_value_t * ti = jl_svecref (bindings , i );
2662
- if (ti == jl_nothing )
2661
+ jl_value_t * k = jl_svecref (keys , i );
2662
+ if (k == jl_nothing )
2663
2663
continue ;
2664
- jl_binding_t * ref = ((jl_binding_t * )ti );
2665
- if (ptrhash_get (& serialization_order , ref ) != HT_NOTFOUND )
2666
- arraylist_push (& bindings_list , ref );
2667
- }
2668
- jl_genericmemory_t * bindingkeyset = jl_atomic_load_relaxed (& m -> bindingkeyset );
2669
- _Atomic(jl_genericmemory_t * )bindingkeyset2 ;
2670
- jl_atomic_store_relaxed (& bindingkeyset2 , (jl_genericmemory_t * )jl_an_empty_memory_any );
2671
- jl_svec_t * bindings2 = jl_alloc_svec_uninit (bindings_list .len );
2672
- for (i = 0 ; i < bindings_list .len ; i ++ ) {
2673
- jl_binding_t * ref = (jl_binding_t * )bindings_list .items [i ];
2674
- jl_svecset (bindings2 , i , ref );
2675
- jl_smallintset_insert (& bindingkeyset2 , (jl_value_t * )m , bindingkey_hash , i , (jl_value_t * )bindings2 );
2676
- }
2677
- void * idx = ptrhash_get (& serialization_order , bindings );
2664
+ if (ptrhash_get (& serialization_order , k ) != HT_NOTFOUND )
2665
+ arraylist_push (& keys_list , k );
2666
+ }
2667
+ jl_genericmemory_t * keyset = jl_atomic_load_relaxed (pkeyset );
2668
+ _Atomic(jl_genericmemory_t * )keyset2 ;
2669
+ jl_atomic_store_relaxed (& keyset2 , (jl_genericmemory_t * )jl_an_empty_memory_any );
2670
+ jl_svec_t * keys2 = jl_alloc_svec_uninit (keys_list .len );
2671
+ for (i = 0 ; i < keys_list .len ; i ++ ) {
2672
+ jl_binding_t * ref = (jl_binding_t * )keys_list .items [i ];
2673
+ jl_svecset (keys2 , i , ref );
2674
+ jl_smallintset_insert (& keyset2 , parent , key_hash , i , (jl_value_t * )keys2 );
2675
+ }
2676
+ void * idx = ptrhash_get (& serialization_order , keys );
2678
2677
assert (idx != HT_NOTFOUND && idx != (void * )(uintptr_t )-1 );
2679
- assert (serialization_queue .items [(char * )idx - 1 - (char * )HT_NOTFOUND ] == bindings );
2680
- ptrhash_put (& serialization_order , bindings2 , idx );
2681
- serialization_queue .items [(char * )idx - 1 - (char * )HT_NOTFOUND ] = bindings2 ;
2678
+ assert (serialization_queue .items [(char * )idx - 1 - (char * )HT_NOTFOUND ] == keys );
2679
+ ptrhash_put (& serialization_order , keys2 , idx );
2680
+ serialization_queue .items [(char * )idx - 1 - (char * )HT_NOTFOUND ] = keys2 ;
2682
2681
2683
- idx = ptrhash_get (& serialization_order , bindingkeyset );
2682
+ idx = ptrhash_get (& serialization_order , keyset );
2684
2683
assert (idx != HT_NOTFOUND && idx != (void * )(uintptr_t )-1 );
2685
- assert (serialization_queue .items [(char * )idx - 1 - (char * )HT_NOTFOUND ] == bindingkeyset );
2686
- ptrhash_put (& serialization_order , jl_atomic_load_relaxed (& bindingkeyset2 ), idx );
2687
- serialization_queue .items [(char * )idx - 1 - (char * )HT_NOTFOUND ] = jl_atomic_load_relaxed (& bindingkeyset2 );
2688
- jl_atomic_store_relaxed (& m -> bindings , bindings2 );
2689
- jl_atomic_store_relaxed (& m -> bindingkeyset , jl_atomic_load_relaxed (& bindingkeyset2 ));
2690
- jl_gc_wb (m , bindings2 );
2691
- jl_gc_wb (m , jl_atomic_load_relaxed (& bindingkeyset2 ));
2684
+ assert (serialization_queue .items [(char * )idx - 1 - (char * )HT_NOTFOUND ] == keyset );
2685
+ ptrhash_put (& serialization_order , jl_atomic_load_relaxed (& keyset2 ), idx );
2686
+ serialization_queue .items [(char * )idx - 1 - (char * )HT_NOTFOUND ] = jl_atomic_load_relaxed (& keyset2 );
2687
+ jl_atomic_store_relaxed (pkeys , keys2 );
2688
+ jl_gc_wb (parent , keys2 );
2689
+ jl_atomic_store_relaxed (pkeyset , jl_atomic_load_relaxed (& keyset2 ));
2690
+ jl_gc_wb (parent , jl_atomic_load_relaxed (& keyset2 ));
2691
+ }
2692
+
2693
+ static void jl_prune_method_specializations (jl_method_t * m ) JL_GC_DISABLED
2694
+ {
2695
+ jl_value_t * specializations_ = jl_atomic_load_relaxed (& m -> specializations );
2696
+ if (!jl_is_svec (specializations_ )) {
2697
+ if (ptrhash_get (& serialization_order , specializations_ ) == HT_NOTFOUND )
2698
+ record_field_change ((jl_value_t * * )& m -> specializations , (jl_value_t * )jl_emptysvec );
2699
+ return ;
2700
+ }
2701
+ jl_prune_idset ((_Atomic (jl_svec_t * )* )& m -> specializations , & m -> speckeyset , speccache_hash , (jl_value_t * )m );
2702
+ }
2703
+
2704
+ static void jl_prune_module_bindings (jl_module_t * m ) JL_GC_DISABLED
2705
+ {
2706
+ jl_prune_idset (& m -> bindings , & m -> bindingkeyset , bindingkey_hash , (jl_value_t * )m );
2692
2707
}
2693
2708
2694
2709
static void strip_slotnames (jl_array_t * slotnames , int n )
@@ -3253,32 +3268,15 @@ static void jl_save_system_image_to_stream(ios_t *f, jl_array_t *mod_array,
3253
3268
// step 1.5: prune (garbage collect) some special weak references known caches
3254
3269
for (i = 0 ; i < serialization_queue .len ; i ++ ) {
3255
3270
jl_value_t * v = (jl_value_t * )serialization_queue .items [i ];
3256
- if (jl_options .trim ) {
3257
- if (jl_is_method (v )) {
3258
- jl_method_t * m = (jl_method_t * )v ;
3259
- jl_value_t * specializations_ = jl_atomic_load_relaxed (& m -> specializations );
3260
- if (!jl_is_svec (specializations_ )) {
3261
- if (ptrhash_get (& serialization_order , specializations_ ) == HT_NOTFOUND )
3262
- record_field_change ((jl_value_t * * )& m -> specializations , (jl_value_t * )jl_emptysvec );
3263
- continue ;
3264
- }
3265
-
3266
- jl_svec_t * specializations = (jl_svec_t * )specializations_ ;
3267
- size_t l = jl_svec_len (specializations ), i ;
3268
- for (i = 0 ; i < l ; i ++ ) {
3269
- jl_value_t * mi = jl_svecref (specializations , i );
3270
- if (mi == jl_nothing )
3271
- continue ;
3272
- if (ptrhash_get (& serialization_order , mi ) == HT_NOTFOUND )
3273
- jl_svecset (specializations , i , jl_nothing );
3274
- }
3275
- }
3276
- else if (jl_is_module (v )) {
3271
+ if (jl_is_method (v )) {
3272
+ if (jl_options .trim )
3273
+ jl_prune_method_specializations ((jl_method_t * )v );
3274
+ }
3275
+ else if (jl_is_module (v )) {
3276
+ if (jl_options .trim )
3277
3277
jl_prune_module_bindings ((jl_module_t * )v );
3278
- }
3279
3278
}
3280
- // Not else
3281
- if (jl_is_typename (v )) {
3279
+ else if (jl_is_typename (v )) {
3282
3280
jl_typename_t * tn = (jl_typename_t * )v ;
3283
3281
jl_atomic_store_relaxed (& tn -> cache ,
3284
3282
jl_prune_type_cache_hash (jl_atomic_load_relaxed (& tn -> cache )));
0 commit comments