@@ -2646,49 +2646,64 @@ static void jl_prune_binding_backedges(jl_array_t *backedges)
26462646    jl_array_del_end (backedges , n  -  ins );
26472647}
26482648
2649- 
26502649uint_t  bindingkey_hash (size_t  idx , jl_value_t  * data );
2650+ uint_t  speccache_hash (size_t  idx , jl_value_t  * data );
26512651
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 
26532653{
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  =  jl_atomic_load_relaxed (pkeys );
2655+     size_t  l  =  jl_svec_len (keys ), i ;
26582656    if  (l  ==  0 )
26592657        return ;
2658+     arraylist_t  keys_list ;
2659+     arraylist_new (& keys_list , 0 );
26602660    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 )
26632663            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 );
26782677    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 ;
26822681
2683-     idx  =  ptrhash_get (& serialization_order , bindingkeyset );
2682+     idx  =  ptrhash_get (& serialization_order , keyset );
26842683    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 );
26922707}
26932708
26942709static  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,
32533268        // step 1.5: prune (garbage collect) some special weak references known caches 
32543269        for  (i  =  0 ; i  <  serialization_queue .len ; i ++ ) {
32553270            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 )
32773277                    jl_prune_module_bindings ((jl_module_t * )v );
3278-                 }
32793278            }
3280-             // Not else 
3281-             if  (jl_is_typename (v )) {
3279+             else  if  (jl_is_typename (v )) {
32823280                jl_typename_t  * tn  =  (jl_typename_t * )v ;
32833281                jl_atomic_store_relaxed (& tn -> cache ,
32843282                    jl_prune_type_cache_hash (jl_atomic_load_relaxed (& tn -> cache )));
0 commit comments