@@ -475,7 +475,8 @@ static void jl_collect_edges(jl_array_t *edges, jl_array_t *ext_targets, jl_arra
475
475
// and compute the old methods list, ready for serialization
476
476
jl_value_t * matches = NULL ;
477
477
jl_array_t * callee_ids = NULL ;
478
- JL_GC_PUSH2 (& matches , & callee_ids );
478
+ jl_value_t * sig = NULL ;
479
+ JL_GC_PUSH3 (& matches , & callee_ids , & sig );
479
480
for (size_t i = 0 ; i < l ; i += 2 ) {
480
481
jl_array_t * callees = (jl_array_t * )jl_array_ptr_ref (edges , i + 1 );
481
482
size_t l = jl_array_len (callees );
@@ -519,14 +520,17 @@ static void jl_collect_edges(jl_array_t *edges, jl_array_t *ext_targets, jl_arra
519
520
}
520
521
}
521
522
else {
522
- jl_value_t * sig ;
523
- if (jl_is_method_instance (callee ))
524
- sig = ((jl_method_instance_t * )callee )-> specTypes ;
525
- else
523
+ if (jl_is_method_instance (callee )) {
524
+ jl_method_instance_t * mi = (jl_method_instance_t * )callee ;
525
+ sig = jl_type_intersection (mi -> def .method -> sig , (jl_value_t * )mi -> specTypes );
526
+ }
527
+ else {
526
528
sig = callee ;
529
+ }
527
530
int ambig = 0 ;
528
531
matches = jl_matching_methods ((jl_tupletype_t * )sig , jl_nothing ,
529
532
INT32_MAX , 0 , world , & min_valid , & max_valid , & ambig );
533
+ sig = NULL ;
530
534
if (matches == jl_nothing ) {
531
535
callee_ids = NULL ; // invalid
532
536
break ;
@@ -840,7 +844,8 @@ static jl_array_t *jl_verify_edges(jl_array_t *targets, size_t minworld)
840
844
memset (jl_array_data (maxvalids ), 0 , l * sizeof (size_t ));
841
845
jl_value_t * loctag = NULL ;
842
846
jl_value_t * matches = NULL ;
843
- JL_GC_PUSH3 (& maxvalids , & matches , & loctag );
847
+ jl_value_t * sig = NULL ;
848
+ JL_GC_PUSH4 (& maxvalids , & matches , & sig , & loctag );
844
849
for (i = 0 ; i < l ; i ++ ) {
845
850
jl_value_t * invokesig = jl_array_ptr_ref (targets , i * 3 );
846
851
jl_value_t * callee = jl_array_ptr_ref (targets , i * 3 + 1 );
@@ -867,18 +872,21 @@ static jl_array_t *jl_verify_edges(jl_array_t *targets, size_t minworld)
867
872
}
868
873
}
869
874
else {
870
- jl_value_t * sig ;
871
- if (jl_is_method_instance (callee ))
872
- sig = ((jl_method_instance_t * )callee )-> specTypes ;
873
- else
875
+ if (jl_is_method_instance (callee )) {
876
+ jl_method_instance_t * mi = (jl_method_instance_t * )callee ;
877
+ sig = jl_type_intersection (mi -> def .method -> sig , (jl_value_t * )mi -> specTypes );
878
+ }
879
+ else {
874
880
sig = callee ;
881
+ }
875
882
assert (jl_is_array (expected ));
876
883
int ambig = 0 ;
877
884
// TODO: possibly need to included ambiguities too (for the optimizer correctness)?
878
885
// len + 1 is to allow us to log causes of invalidation (SnoopCompile's @snoopr)
879
886
matches = jl_matching_methods ((jl_tupletype_t * )sig , jl_nothing ,
880
887
_jl_debug_method_invalidation ? INT32_MAX : jl_array_len (expected ),
881
888
0 , minworld , & min_valid , & max_valid , & ambig );
889
+ sig = NULL ;
882
890
if (matches == jl_nothing ) {
883
891
max_valid = 0 ;
884
892
}
0 commit comments