@@ -1063,12 +1063,16 @@ static jl_value_t *intersect_var(jl_tvar_t *b, jl_value_t *a, jl_stenv_t *e, int
1063
1063
if (bb -> lb == bb -> ub && jl_is_typevar (bb -> lb ))
1064
1064
return intersect (a , bb -> ub , e , param );
1065
1065
jl_value_t * ub = R ? intersect_ufirst (a , bb -> ub , e , d ) : intersect_ufirst (bb -> ub , a , e , d );
1066
- if (!subtype_in_env (bb -> lb , a , e ))
1066
+ JL_GC_PUSH1 (& ub );
1067
+ if (!subtype_in_env (bb -> lb , a , e )) {
1068
+ JL_GC_POP ();
1067
1069
return jl_bottom_type ;
1070
+ }
1068
1071
if (ub != (jl_value_t * )b ) {
1069
1072
bb -> ub = ub ;
1070
1073
bb -> lb = ub ;
1071
1074
}
1075
+ JL_GC_POP ();
1072
1076
return ub ;
1073
1077
}
1074
1078
else if (bb -> constraintkind == 0 ) {
@@ -1088,10 +1092,14 @@ static jl_value_t *intersect_var(jl_tvar_t *b, jl_value_t *a, jl_stenv_t *e, int
1088
1092
}
1089
1093
else if (bb -> concrete || bb -> constraintkind == 1 ) {
1090
1094
jl_value_t * ub = R ? intersect_ufirst (a , bb -> ub , e , d ) : intersect_ufirst (bb -> ub , a , e , d );
1091
- if (ub == jl_bottom_type || !subtype_in_env (bb -> lb , a , e ))
1095
+ JL_GC_PUSH1 (& ub );
1096
+ if (ub == jl_bottom_type || !subtype_in_env (bb -> lb , a , e )) {
1097
+ JL_GC_POP ();
1092
1098
return jl_bottom_type ;
1099
+ }
1093
1100
if (ub != (jl_value_t * )b )
1094
1101
bb -> ub = ub ;
1102
+ JL_GC_POP ();
1095
1103
return (jl_value_t * )b ;
1096
1104
}
1097
1105
else if (bb -> constraintkind == 2 ) {
@@ -1155,6 +1163,7 @@ static int var_occurs_invariant(jl_value_t *v, jl_tvar_t *var, int inv)
1155
1163
return 0 ;
1156
1164
}
1157
1165
1166
+ // Caller might not have rooted `res`
1158
1167
static jl_value_t * finish_unionall (jl_value_t * res , jl_varbinding_t * vb , jl_stenv_t * e )
1159
1168
{
1160
1169
jl_value_t * varval = NULL , * root = NULL ;
@@ -1272,6 +1281,7 @@ static jl_value_t *intersect_unionall_(jl_value_t *t, jl_unionall_t *u, jl_stenv
1272
1281
res = jl_bottom_type ;
1273
1282
}
1274
1283
if (res != jl_bottom_type )
1284
+ // res is rooted by callee
1275
1285
res = finish_unionall (res , vb , e );
1276
1286
JL_GC_POP ();
1277
1287
return res ;
0 commit comments