@@ -2445,11 +2445,22 @@ static jl_value_t *intersect_all(jl_value_t *x, jl_value_t *y, jl_stenv_t *e)
2445
2445
e -> Runions .more = 0 ;
2446
2446
memset (e -> Runions .stack , 0 , sizeof (e -> Runions .stack ));
2447
2447
jl_value_t * * is ;
2448
- JL_GC_PUSHARGS (is , 2 );
2448
+ JL_GC_PUSHARGS (is , 3 );
2449
+ jl_value_t * * saved = & is [2 ];
2450
+ jl_savedenv_t se ;
2451
+ save_env (e , saved , & se );
2449
2452
int lastset = 0 , niter = 0 , total_iter = 0 ;
2450
2453
jl_value_t * ii = intersect (x , y , e , 0 );
2454
+ if (ii == jl_bottom_type ) {
2455
+ restore_env (e , * saved , & se );
2456
+ }
2457
+ else {
2458
+ free (se .buf );
2459
+ save_env (e , saved , & se );
2460
+ }
2451
2461
while (e -> Runions .more ) {
2452
2462
if (e -> emptiness_only && ii != jl_bottom_type ) {
2463
+ free (se .buf );
2453
2464
JL_GC_POP ();
2454
2465
return ii ;
2455
2466
}
@@ -2463,6 +2474,13 @@ static jl_value_t *intersect_all(jl_value_t *x, jl_value_t *y, jl_stenv_t *e)
2463
2474
2464
2475
is [0 ] = ii ;
2465
2476
is [1 ] = intersect (x , y , e , 0 );
2477
+ if (is [1 ] == jl_bottom_type ) {
2478
+ restore_env (e , * saved , & se );
2479
+ }
2480
+ else {
2481
+ free (se .buf );
2482
+ save_env (e , saved , & se );
2483
+ }
2466
2484
if (is [0 ] == jl_bottom_type )
2467
2485
ii = is [1 ];
2468
2486
else if (is [1 ] == jl_bottom_type )
@@ -2474,10 +2492,12 @@ static jl_value_t *intersect_all(jl_value_t *x, jl_value_t *y, jl_stenv_t *e)
2474
2492
}
2475
2493
total_iter ++ ;
2476
2494
if (niter > 3 || total_iter > 400000 ) {
2495
+ free (se .buf );
2477
2496
JL_GC_POP ();
2478
2497
return y ;
2479
2498
}
2480
2499
}
2500
+ free (se .buf );
2481
2501
JL_GC_POP ();
2482
2502
return ii ;
2483
2503
}
0 commit comments