@@ -23,29 +23,29 @@ static int jl_is_any(jl_value_t *t1)
2323 return t1 == (jl_value_t * )jl_any_type ;
2424}
2525
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
2727{
2828 if (jl_is_unionall (t1 ))
2929 t1 = jl_unwrap_unionall (t1 );
3030 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 );
3232 }
3333 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 );
3535 }
3636 else if (t1 == jl_bottom_type || t1 == (jl_value_t * )jl_typeofbottom_type || t1 == (jl_value_t * )jl_typeofbottom_type -> super ) {
3737 return (jl_value_t * )jl_typeofbottom_type -> name ; // put Union{} and typeof(Union{}) and Type{Union{}} together for convenience
3838 }
3939 else if (jl_is_datatype (t1 )) {
4040 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 ;
4444 }
4545 else if (jl_is_uniontype (t1 )) {
4646 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 );
4949 if (tn1 == tn2 )
5050 return tn1 ;
5151 // 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)
7171 }
7272 else if (jl_is_datatype (t1 )) {
7373 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 )
7575 return 1 ;
7676 return 0 ;
7777 }
@@ -81,8 +81,8 @@ static int jl_type_extract_name_precise(jl_value_t *t1, int invariant)
8181 return 0 ;
8282 if (!jl_type_extract_name_precise (u1 -> b , invariant ))
8383 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 );
8686 if (tn1 == tn2 )
8787 return 1 ;
8888 return 0 ;
@@ -469,7 +469,7 @@ static int jl_typemap_intersection_memory_visitor(jl_genericmemory_t *a, jl_valu
469469 tydt = (jl_datatype_t * )ttype ;
470470 }
471471 else if (ttype ) {
472- ttype = jl_type_extract_name (ttype );
472+ ttype = jl_type_extract_name (ttype , tparam & 1 );
473473 tydt = ttype ? (jl_datatype_t * )jl_unwrap_unionall (((jl_typename_t * )ttype )-> wrapper ) : NULL ;
474474 }
475475 if (tydt == jl_any_type )
@@ -641,7 +641,7 @@ int jl_typemap_intersection_visitor(jl_typemap_t *map, int offs,
641641 if (maybe_type && !maybe_kind ) {
642642 typetype = jl_unwrap_unionall (ty );
643643 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 ;
645645 if (!typetype )
646646 exclude_typeofbottom = !jl_subtype ((jl_value_t * )jl_typeofbottom_type , ty );
647647 else if (jl_is_typevar (typetype ))
@@ -717,7 +717,7 @@ int jl_typemap_intersection_visitor(jl_typemap_t *map, int offs,
717717 }
718718 }
719719 else {
720- jl_value_t * name = jl_type_extract_name (ty );
720+ jl_value_t * name = jl_type_extract_name (ty , 0 );
721721 if (name && jl_type_extract_name_precise (ty , 0 )) {
722722 // direct lookup of leaf types
723723 jl_value_t * ml = mtcache_hash_lookup (cachearg1 , name );
@@ -782,7 +782,7 @@ int jl_typemap_intersection_visitor(jl_typemap_t *map, int offs,
782782 }
783783 jl_genericmemory_t * name1 = jl_atomic_load_relaxed (& cache -> name1 );
784784 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 );
786786 if (name && jl_type_extract_name_precise (ty , 0 )) {
787787 jl_datatype_t * super = (jl_datatype_t * )jl_unwrap_unionall (((jl_typename_t * )name )-> wrapper );
788788 // direct lookup of concrete types
@@ -1003,7 +1003,7 @@ jl_typemap_entry_t *jl_typemap_assoc_by_type(
10031003 // now look at the optimized TypeName caches
10041004 jl_genericmemory_t * tname = jl_atomic_load_relaxed (& cache -> tname );
10051005 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 ;
10071007 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
10081008 jl_datatype_t * super = (jl_datatype_t * )jl_unwrap_unionall (((jl_typename_t * )a0 )-> wrapper );
10091009 while (1 ) {
@@ -1042,7 +1042,7 @@ jl_typemap_entry_t *jl_typemap_assoc_by_type(
10421042 jl_genericmemory_t * name1 = jl_atomic_load_relaxed (& cache -> name1 );
10431043 if (name1 != (jl_genericmemory_t * )jl_an_empty_memory_any ) {
10441044 if (ty ) {
1045- jl_value_t * a0 = jl_type_extract_name (ty );
1045+ jl_value_t * a0 = jl_type_extract_name (ty , 0 );
10461046 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
10471047 jl_datatype_t * super = (jl_datatype_t * )jl_unwrap_unionall (((jl_typename_t * )a0 )-> wrapper );
10481048 while (1 ) {
@@ -1200,7 +1200,7 @@ jl_typemap_entry_t *jl_typemap_level_assoc_exact(jl_typemap_level_t *cache, jl_v
12001200 }
12011201 jl_genericmemory_t * tname = jl_atomic_load_relaxed (& cache -> tname );
12021202 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 );
12041204 if (name ) {
12051205 if (ty != (jl_value_t * )jl_datatype_type )
12061206 a1 = jl_unwrap_unionall (((jl_typename_t * )name )-> wrapper );
@@ -1447,12 +1447,12 @@ static void jl_typemap_level_insert_(
14471447 jl_value_t * a0 ;
14481448 t1 = jl_unwrap_unionall (t1 );
14491449 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 );
14511451 jl_datatype_t * super = a0 ? (jl_datatype_t * )jl_unwrap_unionall (((jl_typename_t * )a0 )-> wrapper ) : jl_any_type ;
14521452 jl_typemap_memory_insert_ (map , & cache -> tname , (jl_value_t * )super -> name , newrec , (jl_value_t * )cache , 1 , offs , NULL );
14531453 return ;
14541454 }
1455- a0 = jl_type_extract_name (t1 );
1455+ a0 = jl_type_extract_name (t1 , 0 );
14561456 if (a0 && a0 != (jl_value_t * )jl_any_type -> name ) {
14571457 jl_typemap_memory_insert_ (map , & cache -> name1 , a0 , newrec , (jl_value_t * )cache , 0 , offs , NULL );
14581458 return ;
0 commit comments