@@ -2205,17 +2205,20 @@ void remove_code_instance_from_validation(jl_code_instance_t *codeinst)
22052205
22062206static void jl_insert_method_instances (jl_array_t * list )
22072207{
2208- size_t i , l = jl_array_len (list ), ll = l ;
2208+ size_t i , l = jl_array_len (list );
22092209 // Validate the MethodInstances
2210+ jl_array_t * valids = jl_alloc_array_1d (jl_array_uint8_type , l );
2211+ memset (jl_array_data (valids ), 1 , l );
22102212 size_t world = jl_atomic_load_acquire (& jl_world_counter );
2211- for (i = 0 ; i < ll ; i ++ ) {
2213+ for (i = 0 ; i < l ; i ++ ) {
22122214 jl_method_instance_t * mi = (jl_method_instance_t * )jl_array_ptr_ref (list , i );
22132215 assert (jl_is_method_instance (mi ));
22142216 if (jl_is_method (mi -> def .method )) {
22152217 // Is this still the method we'd be calling?
22162218 jl_methtable_t * mt = jl_method_table_for (mi -> specTypes );
22172219 jl_value_t * mworld = jl_methtable_lookup (mt , mi -> specTypes , world );
22182220 if (jl_is_method (mworld ) && mi -> def .method != (jl_method_t * )mworld ) {
2221+ jl_array_uint8_set (valids , i , 0 );
22192222 invalidate_backedges (& remove_code_instance_from_validation , mi , world , "jl_insert_method_instance" );
22202223 // The codeinst of this mi haven't yet been removed
22212224 jl_code_instance_t * codeinst = mi -> cache ;
@@ -2227,13 +2230,10 @@ static void jl_insert_method_instances(jl_array_t *list)
22272230 jl_array_ptr_1d_push (_jl_debug_method_invalidation , mworld );
22282231 jl_array_ptr_1d_push (_jl_debug_method_invalidation , jl_cstr_to_string ("jl_method_table_insert" )); // GC disabled
22292232 }
2230- jl_array_ptr_set (list , i , jl_array_ptr_ref (list , ll - 1 ));
2231- jl_array_ptr_set (list , ll - 1 , mi );
2232- ll -- ;
22332233 }
22342234 }
22352235 }
2236- // While it's tempting to just remove the invalidated MIs altogether (loop only up to `ll`) ,
2236+ // While it's tempting to just remove the invalidated MIs altogether,
22372237 // this hurts the ability of SnoopCompile to diagnose problems.
22382238 for (i = 0 ; i < l ; i ++ ) {
22392239 jl_method_instance_t * mi = (jl_method_instance_t * )jl_array_ptr_ref (list , i );
@@ -2280,6 +2280,22 @@ static void jl_insert_method_instances(jl_array_t *list)
22802280 }
22812281 }
22822282 }
2283+ // Additionally, if we have CodeInstance(s) and the running CodeInstance is world-limited, transfer it
2284+ if (mi -> cache && jl_array_uint8_ref (valids , i )) {
2285+ if (!milive -> cache || milive -> cache -> max_world < ~(size_t )0 ) {
2286+ jl_code_instance_t * cilive = milive -> cache , * ci ;
2287+ milive -> cache = mi -> cache ;
2288+ jl_gc_wb (milive , milive -> cache );
2289+ ci = mi -> cache ;
2290+ ci -> def = milive ;
2291+ while (ci -> next ) {
2292+ ci = ci -> next ;
2293+ ci -> def = milive ;
2294+ }
2295+ ci -> next = cilive ;
2296+ jl_gc_wb (ci , ci -> next );
2297+ }
2298+ }
22832299 }
22842300 }
22852301}
0 commit comments