Skip to content

Commit 0ded8b7

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

File tree

1 file changed

+43
-8
lines changed

1 file changed

+43
-8
lines changed

src/gf.c

Lines changed: 43 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,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

Comments
 (0)