@@ -1642,7 +1642,7 @@ static int invalidate_mt_cache(jl_typemap_entry_t *oldentry, void *closure0)
16421642 jl_value_t * loctag = NULL ;
16431643 JL_GC_PUSH1 (& loctag );
16441644 jl_array_ptr_1d_push (_jl_debug_method_invalidation , (jl_value_t * )mi );
1645- loctag = jl_cstr_to_string ("mt " );
1645+ loctag = jl_cstr_to_string ("invalidate_mt_cache " );
16461646 jl_gc_wb (_jl_debug_method_invalidation , loctag );
16471647 jl_array_ptr_1d_push (_jl_debug_method_invalidation , loctag );
16481648 JL_GC_POP ();
@@ -1693,12 +1693,33 @@ JL_DLLEXPORT void jl_method_table_disable(jl_methtable_t *mt, jl_method_t *metho
16931693 jl_typemap_visitor (mt -> cache , invalidate_mt_cache , (void * )& mt_cache_env );
16941694 // Invalidate the backedges
16951695 jl_svec_t * specializations = methodentry -> func .method -> specializations ;
1696+ int invalidated = 0 ;
1697+ jl_value_t * loctag = NULL ;
1698+ JL_GC_PUSH1 (& loctag );
16961699 size_t i , l = jl_svec_len (specializations );
16971700 for (i = 0 ; i < l ; i ++ ) {
16981701 jl_method_instance_t * mi = (jl_method_instance_t * )jl_svecref (specializations , i );
1699- if (mi )
1700- invalidate_backedges (mi , methodentry -> max_world );
1702+ if (mi ) {
1703+ invalidated = 1 ;
1704+ if (invalidate_backedges (mi , methodentry -> max_world ))
1705+ if (_jl_debug_method_invalidation ) {
1706+ if (!loctag ) {
1707+ loctag = jl_cstr_to_string ("jl_method_table_disable" );
1708+ jl_gc_wb (_jl_debug_method_invalidation , loctag );
1709+ }
1710+ jl_array_ptr_1d_push (_jl_debug_method_invalidation , loctag );
1711+ }
1712+ }
1713+ }
1714+ if (invalidated && _jl_debug_method_invalidation ) {
1715+ jl_array_ptr_1d_push (_jl_debug_method_invalidation , (jl_value_t * )method );
1716+ if (!loctag ) {
1717+ loctag = jl_cstr_to_string ("jl_method_table_disable" );
1718+ jl_gc_wb (_jl_debug_method_invalidation , loctag );
1719+ }
1720+ jl_array_ptr_1d_push (_jl_debug_method_invalidation , loctag );
17011721 }
1722+ JL_GC_POP ();
17021723 JL_UNLOCK (& mt -> writelock );
17031724}
17041725
@@ -1713,7 +1734,8 @@ JL_DLLEXPORT void jl_method_table_insert(jl_methtable_t *mt, jl_method_t *method
17131734 method -> primary_world = ++ jl_world_counter ;
17141735 size_t max_world = method -> primary_world - 1 ;
17151736 int invalidated = 0 ;
1716- JL_GC_PUSH1 (& oldvalue );
1737+ jl_value_t * loctag = NULL ; // debug info for invalidation
1738+ JL_GC_PUSH2 (& oldvalue , & loctag );
17171739 JL_LOCK (& mt -> writelock );
17181740 // first delete the existing entry (we'll disable it later)
17191741 struct jl_typemap_assoc search = {(jl_value_t * )type , method -> primary_world , NULL , 0 , ~(size_t )0 };
@@ -1739,12 +1761,11 @@ JL_DLLEXPORT void jl_method_table_insert(jl_methtable_t *mt, jl_method_t *method
17391761 for (i = 1 ; i < na ; i += 2 ) {
17401762 jl_value_t * backedgetyp = backedges [i - 1 ];
17411763 if (!jl_has_empty_intersection (backedgetyp , (jl_value_t * )type )) {
1742- if (_jl_debug_method_invalidation ) {
1743- jl_array_ptr_1d_push (_jl_debug_method_invalidation , (jl_value_t * )backedgetyp );
1744- }
17451764 jl_method_instance_t * backedge = (jl_method_instance_t * )backedges [i ];
17461765 invalidate_method_instance (backedge , max_world , 0 );
17471766 invalidated = 1 ;
1767+ if (_jl_debug_method_invalidation )
1768+ jl_array_ptr_1d_push (_jl_debug_method_invalidation , (jl_value_t * )backedgetyp );
17481769 }
17491770 else {
17501771 backedges [ins ++ ] = backedges [i - 1 ];
@@ -1790,13 +1811,27 @@ JL_DLLEXPORT void jl_method_table_insert(jl_methtable_t *mt, jl_method_t *method
17901811 for (i = 0 ; i < l ; i ++ ) {
17911812 jl_method_instance_t * mi = (jl_method_instance_t * )jl_svecref (specializations , i );
17921813 if (mi != NULL && !jl_has_empty_intersection (type , (jl_value_t * )mi -> specTypes ))
1793- if (invalidate_backedges (mi , max_world ))
1814+ if (invalidate_backedges (mi , max_world )) {
17941815 invalidated = 1 ;
1816+ if (_jl_debug_method_invalidation ) {
1817+ jl_array_ptr_1d_push (_jl_debug_method_invalidation , (jl_value_t * )mi );
1818+ if (!loctag ) {
1819+ loctag = jl_cstr_to_string ("jl_method_table_insert" );
1820+ jl_gc_wb (_jl_debug_method_invalidation , loctag );
1821+ }
1822+ jl_array_ptr_1d_push (_jl_debug_method_invalidation , loctag );
1823+ }
1824+ }
17951825 }
17961826 }
17971827 }
17981828 if (invalidated && _jl_debug_method_invalidation ) {
17991829 jl_array_ptr_1d_push (_jl_debug_method_invalidation , (jl_value_t * )method );
1830+ if (!loctag ) {
1831+ loctag = jl_cstr_to_string ("jl_method_table_insert" );
1832+ jl_gc_wb (_jl_debug_method_invalidation , loctag );
1833+ }
1834+ jl_array_ptr_1d_push (_jl_debug_method_invalidation , loctag );
18001835 }
18011836 update_max_args (mt , type );
18021837 JL_UNLOCK (& mt -> writelock );
0 commit comments