@@ -2523,7 +2523,7 @@ static void jl_prepare_serialization_data(jl_array_t *mod_array, jl_array_t *new
25232523static void jl_save_system_image_to_stream (ios_t * f , jl_array_t * mod_array ,
25242524 jl_array_t * worklist , jl_array_t * extext_methods ,
25252525 jl_array_t * new_specializations , jl_array_t * method_roots_list ,
2526- jl_array_t * ext_targets , jl_array_t * edges ) JL_GC_DISABLED
2526+ jl_array_t * ext_targets , jl_array_t * edges , jl_array_t * newly_deleted ) JL_GC_DISABLED
25272527{
25282528 htable_new (& field_replace , 0 );
25292529 // strip metadata and IR when requested
@@ -2644,6 +2644,10 @@ static void jl_save_system_image_to_stream(ios_t *f, jl_array_t *mod_array,
26442644 jl_queue_for_serialization (& s , ext_targets );
26452645 jl_queue_for_serialization (& s , edges );
26462646 }
2647+ if (newly_deleted ) {
2648+ jl_queue_for_serialization (& s , newly_deleted );
2649+ }
2650+
26472651 jl_serialize_reachable (& s );
26482652 // step 1.2: ensure all gvars are part of the sysimage too
26492653 record_gvars (& s , & gvars );
@@ -2793,6 +2797,7 @@ static void jl_save_system_image_to_stream(ios_t *f, jl_array_t *mod_array,
27932797 jl_write_value (& s , method_roots_list );
27942798 jl_write_value (& s , ext_targets );
27952799 jl_write_value (& s , edges );
2800+ jl_write_value (& s , newly_deleted );
27962801 }
27972802 write_uint32 (f , jl_array_len (s .link_ids_gctags ));
27982803 ios_write (f , (char * )jl_array_data (s .link_ids_gctags , uint32_t ), jl_array_len (s .link_ids_gctags ) * sizeof (uint32_t ));
@@ -2874,11 +2879,11 @@ JL_DLLEXPORT void jl_create_system_image(void **_native_data, jl_array_t *workli
28742879 }
28752880
28762881 jl_array_t * mod_array = NULL , * extext_methods = NULL , * new_specializations = NULL ;
2877- jl_array_t * method_roots_list = NULL , * ext_targets = NULL , * edges = NULL ;
2882+ jl_array_t * method_roots_list = NULL , * ext_targets = NULL , * edges = NULL , * _newly_deleted = NULL ;
28782883 int64_t checksumpos = 0 ;
28792884 int64_t checksumpos_ff = 0 ;
28802885 int64_t datastartpos = 0 ;
2881- JL_GC_PUSH6 (& mod_array , & extext_methods , & new_specializations , & method_roots_list , & ext_targets , & edges );
2886+ JL_GC_PUSH7 (& mod_array , & extext_methods , & new_specializations , & method_roots_list , & ext_targets , & edges , & _newly_deleted );
28822887
28832888 if (worklist ) {
28842889 mod_array = jl_get_loaded_modules (); // __toplevel__ modules loaded in this session (from Base.loaded_modules_array)
@@ -2925,7 +2930,10 @@ JL_DLLEXPORT void jl_create_system_image(void **_native_data, jl_array_t *workli
29252930 }
29262931 if (_native_data != NULL )
29272932 native_functions = * _native_data ;
2928- jl_save_system_image_to_stream (ff , mod_array , worklist , extext_methods , new_specializations , method_roots_list , ext_targets , edges );
2933+ // Otherwise serialization will be confused.
2934+ if (newly_deleted )
2935+ _newly_deleted = jl_array_copy (newly_deleted );
2936+ jl_save_system_image_to_stream (ff , mod_array , worklist , extext_methods , new_specializations , method_roots_list , ext_targets , edges , _newly_deleted );
29292937 if (_native_data != NULL )
29302938 native_functions = NULL ;
29312939 // make sure we don't run any Julia code concurrently before this point
@@ -3009,6 +3017,7 @@ static void jl_restore_system_image_from_stream_(ios_t *f, jl_image_t *image, jl
30093017 jl_array_t * * extext_methods ,
30103018 jl_array_t * * new_specializations , jl_array_t * * method_roots_list ,
30113019 jl_array_t * * ext_targets , jl_array_t * * edges ,
3020+ jl_array_t * * newly_deleted ,
30123021 char * * base , arraylist_t * ccallable_list , pkgcachesizes * cachesizes ) JL_GC_DISABLED
30133022{
30143023 int en = jl_gc_enable (0 );
@@ -3070,7 +3079,7 @@ static void jl_restore_system_image_from_stream_(ios_t *f, jl_image_t *image, jl
30703079 assert (!ios_eof (f ));
30713080 s .s = f ;
30723081 uintptr_t offset_restored = 0 , offset_init_order = 0 , offset_extext_methods = 0 , offset_new_specializations = 0 , offset_method_roots_list = 0 ;
3073- uintptr_t offset_ext_targets = 0 , offset_edges = 0 ;
3082+ uintptr_t offset_ext_targets = 0 , offset_edges = 0 , offset_newly_deleted = 0 ;
30743083 if (!s .incremental ) {
30753084 size_t i ;
30763085 for (i = 0 ; tags [i ] != NULL ; i ++ ) {
@@ -3104,6 +3113,7 @@ static void jl_restore_system_image_from_stream_(ios_t *f, jl_image_t *image, jl
31043113 offset_method_roots_list = jl_read_offset (& s );
31053114 offset_ext_targets = jl_read_offset (& s );
31063115 offset_edges = jl_read_offset (& s );
3116+ offset_newly_deleted = jl_read_offset (& s );
31073117 }
31083118 s .buildid_depmods_idxs = depmod_to_imageidx (depmods );
31093119 size_t nlinks_gctags = read_uint32 (f );
@@ -3137,6 +3147,7 @@ static void jl_restore_system_image_from_stream_(ios_t *f, jl_image_t *image, jl
31373147 * method_roots_list = (jl_array_t * )jl_delayed_reloc (& s , offset_method_roots_list );
31383148 * ext_targets = (jl_array_t * )jl_delayed_reloc (& s , offset_ext_targets );
31393149 * edges = (jl_array_t * )jl_delayed_reloc (& s , offset_edges );
3150+ * newly_deleted = (jl_array_t * )jl_delayed_reloc (& s , offset_newly_deleted );
31403151 if (!* new_specializations )
31413152 * new_specializations = jl_alloc_vec_any (0 );
31423153 }
@@ -3326,6 +3337,11 @@ static void jl_restore_system_image_from_stream_(ios_t *f, jl_image_t *image, jl
33263337 assert (jl_is_datatype (obj ));
33273338 jl_cache_type_ ((jl_datatype_t * )obj );
33283339 }
3340+
3341+ // Delete methods before inserting new ones.
3342+ if (newly_deleted )
3343+ jl_delete_methods (* newly_deleted );
3344+
33293345 // Perform fixups: things like updating world ages, inserting methods & specializations, etc.
33303346 size_t world = jl_atomic_load_acquire (& jl_world_counter );
33313347 for (size_t i = 0 ; i < s .uniquing_objs .len ; i ++ ) {
@@ -3549,11 +3565,11 @@ static jl_value_t *jl_restore_package_image_from_stream(void* pkgimage_handle, i
35493565 assert (datastartpos > 0 && datastartpos < dataendpos );
35503566 needs_permalloc = jl_options .permalloc_pkgimg || needs_permalloc ;
35513567 jl_value_t * restored = NULL ;
3552- jl_array_t * init_order = NULL , * extext_methods = NULL , * new_specializations = NULL , * method_roots_list = NULL , * ext_targets = NULL , * edges = NULL ;
3568+ jl_array_t * init_order = NULL , * extext_methods = NULL , * new_specializations = NULL , * method_roots_list = NULL , * ext_targets = NULL , * edges = NULL , * newly_deleted = NULL ;
35533569 jl_svec_t * cachesizes_sv = NULL ;
35543570 char * base ;
35553571 arraylist_t ccallable_list ;
3556- JL_GC_PUSH8 (& restored , & init_order , & extext_methods , & new_specializations , & method_roots_list , & ext_targets , & edges , & cachesizes_sv );
3572+ JL_GC_PUSH9 (& restored , & init_order , & extext_methods , & new_specializations , & method_roots_list , & ext_targets , & edges , & newly_deleted , & cachesizes_sv );
35573573
35583574 { // make a permanent in-memory copy of f (excluding the header)
35593575 ios_bufmode (f , bm_none );
@@ -3577,11 +3593,12 @@ static jl_value_t *jl_restore_package_image_from_stream(void* pkgimage_handle, i
35773593 ios_close (f );
35783594 ios_static_buffer (f , sysimg , len );
35793595 pkgcachesizes cachesizes ;
3580- jl_restore_system_image_from_stream_ (f , image , depmods , checksum , (jl_array_t * * )& restored , & init_order , & extext_methods , & new_specializations , & method_roots_list , & ext_targets , & edges , & base , & ccallable_list , & cachesizes );
3596+ jl_restore_system_image_from_stream_ (f , image , depmods , checksum , (jl_array_t * * )& restored , & init_order , & extext_methods , & new_specializations , & method_roots_list , & ext_targets , & edges , & newly_deleted , & base , & ccallable_list , & cachesizes );
35813597 JL_SIGATOMIC_END ();
35823598
35833599 // Insert method extensions
35843600 jl_insert_methods (extext_methods );
3601+
35853602 // No special processing of `new_specializations` is required because recaching handled it
35863603 // Add roots to methods
35873604 jl_copy_roots (method_roots_list , jl_worklist_key ((jl_array_t * )restored ));
@@ -3617,7 +3634,7 @@ static jl_value_t *jl_restore_package_image_from_stream(void* pkgimage_handle, i
36173634static void jl_restore_system_image_from_stream (ios_t * f , jl_image_t * image , uint32_t checksum )
36183635{
36193636 JL_TIMING (LOAD_IMAGE , LOAD_Sysimg );
3620- jl_restore_system_image_from_stream_ (f , image , NULL , checksum | ((uint64_t )0xfdfcfbfa << 32 ), NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL );
3637+ jl_restore_system_image_from_stream_ (f , image , NULL , checksum | ((uint64_t )0xfdfcfbfa << 32 ), NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL );
36213638}
36223639
36233640JL_DLLEXPORT jl_value_t * jl_restore_incremental_from_buf (void * pkgimage_handle , const char * buf , jl_image_t * image , size_t sz , jl_array_t * depmods , int completeinfo , const char * pkgname , int needs_permalloc )
0 commit comments