@@ -142,7 +142,7 @@ static int type_in_worklist(jl_datatype_t *dt) JL_NOTSAFEPOINT
142
142
int i , l = jl_svec_len (dt -> parameters );
143
143
for (i = 0 ; i < l ; i ++ ) {
144
144
jl_value_t * p = jl_unwrap_unionall (jl_tparam (dt , i ));
145
- // XXX : what about Union and TypeVar??
145
+ // TODO : what about Union and TypeVar??
146
146
if (type_in_worklist ((jl_datatype_t * )(jl_is_datatype (p ) ? p : jl_typeof (p ))))
147
147
return 1 ;
148
148
}
@@ -2252,7 +2252,52 @@ STATIC_INLINE jl_value_t *verify_type(jl_value_t *v) JL_NOTSAFEPOINT
2252
2252
}
2253
2253
#endif
2254
2254
2255
- static jl_datatype_t * jl_recache_type (jl_datatype_t * dt ) JL_GC_DISABLED
2255
+
2256
+ static jl_datatype_t * recache_datatype (jl_datatype_t * dt ) JL_GC_DISABLED ;
2257
+
2258
+ static jl_value_t * recache_type (jl_value_t * p ) JL_GC_DISABLED
2259
+ {
2260
+ if (jl_is_datatype (p )) {
2261
+ jl_datatype_t * pdt = (jl_datatype_t * )p ;
2262
+ if (ptrhash_get (& uniquing_table , p ) != HT_NOTFOUND ) {
2263
+ p = (jl_value_t * )recache_datatype (pdt );
2264
+ }
2265
+ else {
2266
+ jl_svec_t * tt = pdt -> parameters ;
2267
+ // ensure all type parameters are recached
2268
+ size_t i , l = jl_svec_len (tt );
2269
+ for (i = 0 ; i < l ; i ++ )
2270
+ jl_svecset (tt , i , recache_type (jl_svecref (tt , i )));
2271
+ ptrhash_put (& uniquing_table , p , p ); // ensures this algorithm isn't too exponential
2272
+ }
2273
+ }
2274
+ else if (jl_is_typevar (p )) {
2275
+ jl_tvar_t * ptv = (jl_tvar_t * )p ;
2276
+ ptv -> lb = recache_type (ptv -> lb );
2277
+ ptv -> ub = recache_type (ptv -> ub );
2278
+ }
2279
+ else if (jl_is_uniontype (p )) {
2280
+ jl_uniontype_t * pu = (jl_uniontype_t * )p ;
2281
+ pu -> a = recache_type (pu -> a );
2282
+ pu -> b = recache_type (pu -> b );
2283
+ }
2284
+ else if (jl_is_unionall (p )) {
2285
+ jl_unionall_t * pa = (jl_unionall_t * )p ;
2286
+ pa -> var = (jl_tvar_t * )recache_type ((jl_value_t * )pa -> var );
2287
+ pa -> body = recache_type (pa -> body );
2288
+ }
2289
+ else {
2290
+ jl_datatype_t * pt = (jl_datatype_t * )jl_typeof (p );
2291
+ jl_datatype_t * cachep = recache_datatype (pt );
2292
+ if (cachep -> instance )
2293
+ p = cachep -> instance ;
2294
+ else if (pt != cachep )
2295
+ jl_set_typeof (p , cachep );
2296
+ }
2297
+ return p ;
2298
+ }
2299
+
2300
+ static jl_datatype_t * recache_datatype (jl_datatype_t * dt ) JL_GC_DISABLED
2256
2301
{
2257
2302
jl_datatype_t * t ; // the type after unique'ing
2258
2303
assert (verify_type ((jl_value_t * )dt ));
@@ -2265,27 +2310,8 @@ static jl_datatype_t *jl_recache_type(jl_datatype_t *dt) JL_GC_DISABLED
2265
2310
jl_svec_t * tt = dt -> parameters ;
2266
2311
// recache all type parameters
2267
2312
size_t i , l = jl_svec_len (tt );
2268
- for (i = 0 ; i < l ; i ++ ) {
2269
- jl_datatype_t * p = (jl_datatype_t * )jl_svecref (tt , i );
2270
- if (jl_is_datatype (p )) {
2271
- jl_datatype_t * cachep = jl_recache_type (p );
2272
- if (p != cachep )
2273
- jl_svecset (tt , i , cachep );
2274
- }
2275
- // XXX: else if (jl_is_typevar(p))
2276
- // XXX: else if (jl_is_uniontype(p))
2277
- // XXX: else if (jl_is_unionall(p))
2278
- else {
2279
- p = (jl_datatype_t * )jl_typeof (p );
2280
- jl_datatype_t * cachep = jl_recache_type (p );
2281
- if (p != cachep ) {
2282
- if (cachep -> instance )
2283
- jl_svecset (tt , i , cachep -> instance );
2284
- else
2285
- jl_set_typeof (jl_svecref (tt , i ), cachep );
2286
- }
2287
- }
2288
- }
2313
+ for (i = 0 ; i < l ; i ++ )
2314
+ jl_svecset (tt , i , recache_type (jl_svecref (tt , i )));
2289
2315
2290
2316
// then recache the type itself
2291
2317
if (jl_svec_len (tt ) == 0 ) { // jl_cache_type doesn't work if length(parameters) == 0
@@ -2323,7 +2349,7 @@ static void jl_recache_types(void) JL_GC_DISABLED
2323
2349
dt = (jl_datatype_t * )jl_typeof (o );
2324
2350
v = o ;
2325
2351
}
2326
- jl_datatype_t * t = jl_recache_type (dt );
2352
+ jl_datatype_t * t = recache_datatype (dt );
2327
2353
if ((jl_value_t * )dt == o && t != dt ) {
2328
2354
assert (!type_in_worklist (dt ));
2329
2355
if (loc )
0 commit comments