Skip to content

Commit f1b9199

Browse files
committed
More location data and add intersection MethodInstances
1 parent 35394a3 commit f1b9199

File tree

1 file changed

+37
-8
lines changed

1 file changed

+37
-8
lines changed

src/gf.c

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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,27 @@ 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 (!loctag) {
1705+
loctag = jl_cstr_to_string("jl_method_table_disable");
1706+
jl_gc_wb(_jl_debug_method_invalidation, loctag);
1707+
}
1708+
if (invalidate_backedges(mi, methodentry->max_world))
1709+
jl_array_ptr_1d_push(_jl_debug_method_invalidation, loctag);
1710+
}
1711+
}
1712+
if (invalidated && _jl_debug_method_invalidation) {
1713+
jl_array_ptr_1d_push(_jl_debug_method_invalidation, (jl_value_t*)method);
1714+
jl_array_ptr_1d_push(_jl_debug_method_invalidation, loctag);
17011715
}
1716+
JL_GC_POP();
17021717
JL_UNLOCK(&mt->writelock);
17031718
}
17041719

@@ -1713,7 +1728,8 @@ JL_DLLEXPORT void jl_method_table_insert(jl_methtable_t *mt, jl_method_t *method
17131728
method->primary_world = ++jl_world_counter;
17141729
size_t max_world = method->primary_world - 1;
17151730
int invalidated = 0;
1716-
JL_GC_PUSH1(&oldvalue);
1731+
jl_value_t *loctag = NULL; // debug info for invalidation
1732+
JL_GC_PUSH2(&oldvalue, &loctag);
17171733
JL_LOCK(&mt->writelock);
17181734
// first delete the existing entry (we'll disable it later)
17191735
struct jl_typemap_assoc search = {(jl_value_t*)type, method->primary_world, NULL, 0, ~(size_t)0};
@@ -1739,12 +1755,11 @@ JL_DLLEXPORT void jl_method_table_insert(jl_methtable_t *mt, jl_method_t *method
17391755
for (i = 1; i < na; i += 2) {
17401756
jl_value_t *backedgetyp = backedges[i - 1];
17411757
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-
}
17451758
jl_method_instance_t *backedge = (jl_method_instance_t*)backedges[i];
17461759
invalidate_method_instance(backedge, max_world, 0);
17471760
invalidated = 1;
1761+
if (_jl_debug_method_invalidation)
1762+
jl_array_ptr_1d_push(_jl_debug_method_invalidation, (jl_value_t*)backedgetyp);
17481763
}
17491764
else {
17501765
backedges[ins++] = backedges[i - 1];
@@ -1790,13 +1805,27 @@ JL_DLLEXPORT void jl_method_table_insert(jl_methtable_t *mt, jl_method_t *method
17901805
for (i = 0; i < l; i++) {
17911806
jl_method_instance_t *mi = (jl_method_instance_t*)jl_svecref(specializations, i);
17921807
if (mi != NULL && !jl_has_empty_intersection(type, (jl_value_t*)mi->specTypes))
1793-
if (invalidate_backedges(mi, max_world))
1808+
if (invalidate_backedges(mi, max_world)) {
17941809
invalidated = 1;
1810+
if (_jl_debug_method_invalidation) {
1811+
jl_array_ptr_1d_push(_jl_debug_method_invalidation, (jl_value_t*)mi);
1812+
if (!loctag) {
1813+
loctag = jl_cstr_to_string("jl_method_table_insert");
1814+
jl_gc_wb(_jl_debug_method_invalidation, loctag);
1815+
}
1816+
jl_array_ptr_1d_push(_jl_debug_method_invalidation, loctag);
1817+
}
1818+
}
17951819
}
17961820
}
17971821
}
17981822
if (invalidated && _jl_debug_method_invalidation) {
17991823
jl_array_ptr_1d_push(_jl_debug_method_invalidation, (jl_value_t*)method);
1824+
if (!loctag) {
1825+
loctag = jl_cstr_to_string("jl_method_table_insert");
1826+
jl_gc_wb(_jl_debug_method_invalidation, loctag);
1827+
}
1828+
jl_array_ptr_1d_push(_jl_debug_method_invalidation, loctag);
18001829
}
18011830
update_max_args(mt, type);
18021831
JL_UNLOCK(&mt->writelock);

0 commit comments

Comments
 (0)