@@ -23,29 +23,29 @@ static int jl_is_any(jl_value_t *t1)
23
23
return t1 == (jl_value_t * )jl_any_type ;
24
24
}
25
25
26
- static jl_value_t * jl_type_extract_name (jl_value_t * t1 JL_PROPAGATES_ROOT ) JL_NOTSAFEPOINT
26
+ static jl_value_t * jl_type_extract_name (jl_value_t * t1 JL_PROPAGATES_ROOT , int invariant ) JL_NOTSAFEPOINT
27
27
{
28
28
if (jl_is_unionall (t1 ))
29
29
t1 = jl_unwrap_unionall (t1 );
30
30
if (jl_is_vararg (t1 )) {
31
- return jl_type_extract_name (jl_unwrap_vararg (t1 ));
31
+ return jl_type_extract_name (jl_unwrap_vararg (t1 ), invariant );
32
32
}
33
33
else if (jl_is_typevar (t1 )) {
34
- return jl_type_extract_name (((jl_tvar_t * )t1 )-> ub );
34
+ return jl_type_extract_name (((jl_tvar_t * )t1 )-> ub , invariant );
35
35
}
36
36
else if (t1 == jl_bottom_type || t1 == (jl_value_t * )jl_typeofbottom_type || t1 == (jl_value_t * )jl_typeofbottom_type -> super ) {
37
37
return (jl_value_t * )jl_typeofbottom_type -> name ; // put Union{} and typeof(Union{}) and Type{Union{}} together for convenience
38
38
}
39
39
else if (jl_is_datatype (t1 )) {
40
40
jl_datatype_t * dt = (jl_datatype_t * )t1 ;
41
- if (! jl_is_kind (t1 ))
42
- return (jl_value_t * )dt -> name ;
43
- return NULL ;
41
+ if (jl_is_kind (t1 ) && ! invariant )
42
+ return (jl_value_t * )jl_type_typename ;
43
+ return ( jl_value_t * ) dt -> name ;
44
44
}
45
45
else if (jl_is_uniontype (t1 )) {
46
46
jl_uniontype_t * u1 = (jl_uniontype_t * )t1 ;
47
- jl_value_t * tn1 = jl_type_extract_name (u1 -> a );
48
- jl_value_t * tn2 = jl_type_extract_name (u1 -> b );
47
+ jl_value_t * tn1 = jl_type_extract_name (u1 -> a , invariant );
48
+ jl_value_t * tn2 = jl_type_extract_name (u1 -> b , invariant );
49
49
if (tn1 == tn2 )
50
50
return tn1 ;
51
51
// TODO: if invariant is false, instead find the nearest common ancestor
@@ -71,7 +71,7 @@ static int jl_type_extract_name_precise(jl_value_t *t1, int invariant)
71
71
}
72
72
else if (jl_is_datatype (t1 )) {
73
73
jl_datatype_t * dt = (jl_datatype_t * )t1 ;
74
- if (( invariant || !dt -> name -> abstract ) && ! jl_is_kind ( t1 ) )
74
+ if (invariant || !dt -> name -> abstract || dt -> name == jl_type_typename )
75
75
return 1 ;
76
76
return 0 ;
77
77
}
@@ -81,8 +81,8 @@ static int jl_type_extract_name_precise(jl_value_t *t1, int invariant)
81
81
return 0 ;
82
82
if (!jl_type_extract_name_precise (u1 -> b , invariant ))
83
83
return 0 ;
84
- jl_value_t * tn1 = jl_type_extract_name (u1 -> a );
85
- jl_value_t * tn2 = jl_type_extract_name (u1 -> b );
84
+ jl_value_t * tn1 = jl_type_extract_name (u1 -> a , invariant );
85
+ jl_value_t * tn2 = jl_type_extract_name (u1 -> b , invariant );
86
86
if (tn1 == tn2 )
87
87
return 1 ;
88
88
return 0 ;
@@ -469,7 +469,7 @@ static int jl_typemap_intersection_memory_visitor(jl_genericmemory_t *a, jl_valu
469
469
tydt = (jl_datatype_t * )ttype ;
470
470
}
471
471
else if (ttype ) {
472
- ttype = jl_type_extract_name (ttype );
472
+ ttype = jl_type_extract_name (ttype , tparam & 1 );
473
473
tydt = ttype ? (jl_datatype_t * )jl_unwrap_unionall (((jl_typename_t * )ttype )-> wrapper ) : NULL ;
474
474
}
475
475
if (tydt == jl_any_type )
@@ -641,7 +641,7 @@ int jl_typemap_intersection_visitor(jl_typemap_t *map, int offs,
641
641
if (maybe_type && !maybe_kind ) {
642
642
typetype = jl_unwrap_unionall (ty );
643
643
typetype = jl_is_type_type (typetype ) ? jl_tparam0 (typetype ) : NULL ;
644
- name = typetype ? jl_type_extract_name (typetype ) : NULL ;
644
+ name = typetype ? jl_type_extract_name (typetype , 1 ) : NULL ;
645
645
if (!typetype )
646
646
exclude_typeofbottom = !jl_subtype ((jl_value_t * )jl_typeofbottom_type , ty );
647
647
else if (jl_is_typevar (typetype ))
@@ -717,7 +717,7 @@ int jl_typemap_intersection_visitor(jl_typemap_t *map, int offs,
717
717
}
718
718
}
719
719
else {
720
- jl_value_t * name = jl_type_extract_name (ty );
720
+ jl_value_t * name = jl_type_extract_name (ty , 0 );
721
721
if (name && jl_type_extract_name_precise (ty , 0 )) {
722
722
// direct lookup of leaf types
723
723
jl_value_t * ml = mtcache_hash_lookup (cachearg1 , name );
@@ -782,7 +782,7 @@ int jl_typemap_intersection_visitor(jl_typemap_t *map, int offs,
782
782
}
783
783
jl_genericmemory_t * name1 = jl_atomic_load_relaxed (& cache -> name1 );
784
784
if (name1 != (jl_genericmemory_t * )jl_an_empty_memory_any ) {
785
- jl_value_t * name = jl_type_extract_name (ty );
785
+ jl_value_t * name = jl_type_extract_name (ty , 0 );
786
786
if (name && jl_type_extract_name_precise (ty , 0 )) {
787
787
jl_datatype_t * super = (jl_datatype_t * )jl_unwrap_unionall (((jl_typename_t * )name )-> wrapper );
788
788
// direct lookup of concrete types
@@ -1003,7 +1003,7 @@ jl_typemap_entry_t *jl_typemap_assoc_by_type(
1003
1003
// now look at the optimized TypeName caches
1004
1004
jl_genericmemory_t * tname = jl_atomic_load_relaxed (& cache -> tname );
1005
1005
if (tname != (jl_genericmemory_t * )jl_an_empty_memory_any ) {
1006
- jl_value_t * a0 = ty && jl_is_type_type (ty ) ? jl_type_extract_name (jl_tparam0 (ty )) : NULL ;
1006
+ jl_value_t * a0 = ty && jl_is_type_type (ty ) ? jl_type_extract_name (jl_tparam0 (ty ), 1 ) : NULL ;
1007
1007
if (a0 ) { // TODO: if we start analyzing Union types in jl_type_extract_name, then a0 might be over-approximated here, leading us to miss possible subtypes
1008
1008
jl_datatype_t * super = (jl_datatype_t * )jl_unwrap_unionall (((jl_typename_t * )a0 )-> wrapper );
1009
1009
while (1 ) {
@@ -1042,7 +1042,7 @@ jl_typemap_entry_t *jl_typemap_assoc_by_type(
1042
1042
jl_genericmemory_t * name1 = jl_atomic_load_relaxed (& cache -> name1 );
1043
1043
if (name1 != (jl_genericmemory_t * )jl_an_empty_memory_any ) {
1044
1044
if (ty ) {
1045
- jl_value_t * a0 = jl_type_extract_name (ty );
1045
+ jl_value_t * a0 = jl_type_extract_name (ty , 0 );
1046
1046
if (a0 ) { // TODO: if we start analyzing Union types in jl_type_extract_name, then a0 might be over-approximated here, leading us to miss possible subtypes
1047
1047
jl_datatype_t * super = (jl_datatype_t * )jl_unwrap_unionall (((jl_typename_t * )a0 )-> wrapper );
1048
1048
while (1 ) {
@@ -1200,7 +1200,7 @@ jl_typemap_entry_t *jl_typemap_level_assoc_exact(jl_typemap_level_t *cache, jl_v
1200
1200
}
1201
1201
jl_genericmemory_t * tname = jl_atomic_load_relaxed (& cache -> tname );
1202
1202
if (jl_is_kind (ty ) && tname != (jl_genericmemory_t * )jl_an_empty_memory_any ) {
1203
- jl_value_t * name = jl_type_extract_name (a1 );
1203
+ jl_value_t * name = jl_type_extract_name (a1 , 1 );
1204
1204
if (name ) {
1205
1205
if (ty != (jl_value_t * )jl_datatype_type )
1206
1206
a1 = jl_unwrap_unionall (((jl_typename_t * )name )-> wrapper );
@@ -1447,12 +1447,12 @@ static void jl_typemap_level_insert_(
1447
1447
jl_value_t * a0 ;
1448
1448
t1 = jl_unwrap_unionall (t1 );
1449
1449
if (jl_is_type_type (t1 )) {
1450
- a0 = jl_type_extract_name (jl_tparam0 (t1 ));
1450
+ a0 = jl_type_extract_name (jl_tparam0 (t1 ), 1 );
1451
1451
jl_datatype_t * super = a0 ? (jl_datatype_t * )jl_unwrap_unionall (((jl_typename_t * )a0 )-> wrapper ) : jl_any_type ;
1452
1452
jl_typemap_memory_insert_ (map , & cache -> tname , (jl_value_t * )super -> name , newrec , (jl_value_t * )cache , 1 , offs , NULL );
1453
1453
return ;
1454
1454
}
1455
- a0 = jl_type_extract_name (t1 );
1455
+ a0 = jl_type_extract_name (t1 , 0 );
1456
1456
if (a0 && a0 != (jl_value_t * )jl_any_type -> name ) {
1457
1457
jl_typemap_memory_insert_ (map , & cache -> name1 , a0 , newrec , (jl_value_t * )cache , 0 , offs , NULL );
1458
1458
return ;
0 commit comments