@@ -897,19 +897,19 @@ struct _jl_typestack_t;
897
897
typedef struct _jl_typestack_t jl_typestack_t ;
898
898
899
899
static jl_value_t * inst_datatype_inner (jl_datatype_t * dt , jl_svec_t * p , jl_value_t * * iparams , size_t ntp ,
900
- int cacheable , jl_typestack_t * stack , jl_typeenv_t * env );
900
+ jl_typestack_t * stack , jl_typeenv_t * env );
901
901
902
902
// Build an environment mapping a TypeName's parameters to parameter values.
903
903
// This is the environment needed for instantiating a type's supertype and field types.
904
904
static jl_value_t * inst_datatype_env (jl_value_t * dt , jl_svec_t * p , jl_value_t * * iparams , size_t ntp ,
905
- int cacheable , jl_typestack_t * stack , jl_typeenv_t * env , int c )
905
+ jl_typestack_t * stack , jl_typeenv_t * env , int c )
906
906
{
907
907
if (jl_is_datatype (dt ))
908
- return inst_datatype_inner ((jl_datatype_t * )dt , p , iparams , ntp , cacheable , stack , env );
908
+ return inst_datatype_inner ((jl_datatype_t * )dt , p , iparams , ntp , stack , env );
909
909
assert (jl_is_unionall (dt ));
910
910
jl_unionall_t * ua = (jl_unionall_t * )dt ;
911
911
jl_typeenv_t e = { ua -> var , iparams [c ], env };
912
- return inst_datatype_env (ua -> body , p , iparams , ntp , cacheable , stack , & e , c + 1 );
912
+ return inst_datatype_env (ua -> body , p , iparams , ntp , stack , & e , c + 1 );
913
913
}
914
914
915
915
jl_value_t * jl_apply_type (jl_value_t * tc , jl_value_t * * params , size_t n )
@@ -925,14 +925,7 @@ jl_value_t *jl_apply_type(jl_value_t *tc, jl_value_t **params, size_t n)
925
925
jl_value_t * u = jl_unwrap_unionall (tc );
926
926
if (jl_is_datatype (u ) && n == jl_nparams ((jl_datatype_t * )u ) &&
927
927
((jl_datatype_t * )u )-> name -> wrapper == tc ) {
928
- int cacheable = 1 ;
929
- for (i = 0 ; i < n ; i ++ ) {
930
- if (jl_has_free_typevars (params [i ])) {
931
- cacheable = 0 ;
932
- break ;
933
- }
934
- }
935
- return inst_datatype_env (tc , NULL , params , n , cacheable , NULL , NULL , 0 );
928
+ return inst_datatype_env (tc , NULL , params , n , NULL , NULL , 0 );
936
929
}
937
930
}
938
931
JL_GC_PUSH1 (& tc );
@@ -1002,8 +995,8 @@ jl_datatype_t *jl_apply_cmpswap_type(jl_value_t *dt)
1002
995
jl_value_t * params [2 ];
1003
996
jl_value_t * names = jl_atomic_load_relaxed (& cmpswap_names );
1004
997
if (names == NULL ) {
1005
- params [0 ] = jl_symbol ("old" );
1006
- params [1 ] = jl_symbol ("success" );
998
+ params [0 ] = ( jl_value_t * ) jl_symbol ("old" );
999
+ params [1 ] = ( jl_value_t * ) jl_symbol ("success" );
1007
1000
jl_value_t * lnames = jl_f_tuple (NULL , params , 2 );
1008
1001
if (jl_atomic_cmpswap (& cmpswap_names , & names , lnames ))
1009
1002
names = jl_atomic_load_relaxed (& cmpswap_names ); // == lnames
@@ -1012,7 +1005,7 @@ jl_datatype_t *jl_apply_cmpswap_type(jl_value_t *dt)
1012
1005
params [1 ] = (jl_value_t * )jl_bool_type ;
1013
1006
jl_datatype_t * tuptyp = jl_apply_tuple_type_v (params , 2 );
1014
1007
JL_GC_PROMISE_ROOTED (tuptyp ); // (JL_ALWAYS_LEAFTYPE)
1015
- jl_datatype_t * rettyp = (jl_datatype_t * )jl_apply_type2 (jl_namedtuple_type , names , tuptyp );
1008
+ jl_datatype_t * rettyp = (jl_datatype_t * )jl_apply_type2 (( jl_value_t * ) jl_namedtuple_type , names , ( jl_value_t * ) tuptyp );
1016
1009
JL_GC_PROMISE_ROOTED (rettyp ); // (JL_ALWAYS_LEAFTYPE)
1017
1010
return rettyp ;
1018
1011
}
@@ -1343,18 +1336,32 @@ jl_value_t *normalize_unionalls(jl_value_t *t)
1343
1336
static jl_value_t * _jl_instantiate_type_in_env (jl_value_t * ty , jl_unionall_t * env , jl_value_t * * vals , jl_typeenv_t * prev , jl_typestack_t * stack );
1344
1337
1345
1338
static jl_value_t * inst_datatype_inner (jl_datatype_t * dt , jl_svec_t * p , jl_value_t * * iparams , size_t ntp ,
1346
- int cacheable , jl_typestack_t * stack , jl_typeenv_t * env )
1339
+ jl_typestack_t * stack , jl_typeenv_t * env )
1347
1340
{
1348
1341
jl_typestack_t top ;
1349
1342
jl_typename_t * tn = dt -> name ;
1350
1343
int istuple = (tn == jl_tuple_typename );
1351
1344
int isnamedtuple = (tn == jl_namedtuple_typename );
1352
1345
if (dt -> name != jl_type_typename ) {
1353
- for (size_t i = 0 ; i < ntp ; i ++ )
1346
+ size_t i ;
1347
+ for (i = 0 ; i < ntp ; i ++ )
1354
1348
iparams [i ] = normalize_unionalls (iparams [i ]);
1355
1349
}
1356
1350
1357
- // check type cache
1351
+ // check type cache, if applicable
1352
+ int cacheable = 1 ;
1353
+ if (istuple ) {
1354
+ size_t i ;
1355
+ for (i = 0 ; cacheable && i < ntp ; i ++ )
1356
+ if (!jl_is_concrete_type (iparams [i ]) && iparams [i ] != jl_bottom_type )
1357
+ cacheable = 0 ;
1358
+ }
1359
+ else {
1360
+ size_t i ;
1361
+ for (i = 0 ; cacheable && i < ntp ; i ++ )
1362
+ if (jl_has_free_typevars (iparams [i ]))
1363
+ cacheable = 0 ;
1364
+ }
1358
1365
if (cacheable ) {
1359
1366
size_t i ;
1360
1367
for (i = 0 ; i < ntp ; i ++ ) {
@@ -1553,13 +1560,7 @@ static jl_value_t *inst_datatype_inner(jl_datatype_t *dt, jl_svec_t *p, jl_value
1553
1560
1554
1561
static jl_tupletype_t * jl_apply_tuple_type_v_ (jl_value_t * * p , size_t np , jl_svec_t * params )
1555
1562
{
1556
- int cacheable = 1 ;
1557
- for (size_t i = 0 ; i < np ; i ++ ) {
1558
- assert (p [i ]);
1559
- if (!jl_is_concrete_type (p [i ]) && p [i ] != jl_bottom_type )
1560
- cacheable = 0 ;
1561
- }
1562
- return (jl_datatype_t * )inst_datatype_inner (jl_anytuple_type , params , p , np , cacheable , NULL , NULL );
1563
+ return (jl_datatype_t * )inst_datatype_inner (jl_anytuple_type , params , p , np , NULL , NULL );
1563
1564
}
1564
1565
1565
1566
JL_DLLEXPORT jl_tupletype_t * jl_apply_tuple_type (jl_svec_t * params )
@@ -1581,7 +1582,6 @@ jl_tupletype_t *jl_inst_arg_tuple_type(jl_value_t *arg1, jl_value_t **args, size
1581
1582
{
1582
1583
jl_tupletype_t * tt = (jl_datatype_t * )lookup_typevalue (jl_tuple_typename , arg1 , args , nargs , leaf );
1583
1584
if (tt == NULL ) {
1584
- int cacheable = 1 ;
1585
1585
size_t i ;
1586
1586
jl_svec_t * params = jl_alloc_svec (nargs );
1587
1587
JL_GC_PUSH1 (& params );
@@ -1593,14 +1593,13 @@ jl_tupletype_t *jl_inst_arg_tuple_type(jl_value_t *arg1, jl_value_t **args, size
1593
1593
// `jl_typeof(ai)`, but that will require some redesign of the caching
1594
1594
// logic.
1595
1595
ai = (jl_value_t * )jl_wrap_Type (ai );
1596
- cacheable = 0 ;
1597
1596
}
1598
1597
else {
1599
1598
ai = jl_typeof (ai );
1600
1599
}
1601
1600
jl_svecset (params , i , ai );
1602
1601
}
1603
- tt = (jl_datatype_t * )inst_datatype_inner (jl_anytuple_type , params , jl_svec_data (params ), nargs , cacheable , NULL , NULL );
1602
+ tt = (jl_datatype_t * )inst_datatype_inner (jl_anytuple_type , params , jl_svec_data (params ), nargs , NULL , NULL );
1604
1603
JL_GC_POP ();
1605
1604
}
1606
1605
return tt ;
@@ -1668,9 +1667,6 @@ static jl_value_t *inst_tuple_w_(jl_value_t *t, jl_typeenv_t *env, jl_typestack_
1668
1667
iparams = jl_svec_data (ip_heap );
1669
1668
}
1670
1669
int bound = 0 ;
1671
- int cacheable = 1 ;
1672
- if (jl_is_va_tuple (tt ))
1673
- cacheable = 0 ;
1674
1670
int i ;
1675
1671
for (i = 0 ; i < ntp ; i ++ ) {
1676
1672
jl_value_t * elt = jl_svecref (tp , i );
@@ -1679,11 +1675,9 @@ static jl_value_t *inst_tuple_w_(jl_value_t *t, jl_typeenv_t *env, jl_typestack_
1679
1675
if (ip_heap )
1680
1676
jl_gc_wb (ip_heap , pi );
1681
1677
bound |= (pi != elt );
1682
- if (cacheable && !jl_is_concrete_type (pi ))
1683
- cacheable = 0 ;
1684
1678
}
1685
1679
if (bound )
1686
- t = inst_datatype_inner (tt , ip_heap , iparams , ntp , cacheable , stack , env );
1680
+ t = inst_datatype_inner (tt , ip_heap , iparams , ntp , stack , env );
1687
1681
JL_GC_POP ();
1688
1682
return t ;
1689
1683
}
@@ -1770,18 +1764,16 @@ static jl_value_t *inst_type_w_(jl_value_t *t, jl_typeenv_t *env, jl_typestack_t
1770
1764
size_t ntp = jl_svec_len (tp );
1771
1765
jl_value_t * * iparams ;
1772
1766
JL_GC_PUSHARGS (iparams , ntp );
1773
- int cacheable = 1 , bound = 0 ;
1767
+ int bound = 0 ;
1774
1768
for (i = 0 ; i < ntp ; i ++ ) {
1775
1769
jl_value_t * elt = jl_svecref (tp , i );
1776
1770
jl_value_t * pi = inst_type_w_ (elt , env , stack , check );
1777
1771
iparams [i ] = pi ;
1778
1772
bound |= (pi != elt );
1779
- if (cacheable && jl_has_free_typevars (pi ))
1780
- cacheable = 0 ;
1781
1773
}
1782
1774
// if t's parameters are not bound in the environment, return it uncopied (#9378)
1783
1775
if (bound )
1784
- t = inst_datatype_inner (tt , NULL , iparams , ntp , cacheable , stack , env );
1776
+ t = inst_datatype_inner (tt , NULL , iparams , ntp , stack , env );
1785
1777
JL_GC_POP ();
1786
1778
return t ;
1787
1779
}
0 commit comments