Skip to content

Commit c051dc5

Browse files
authored
Merge pull request #21187 from JuliaLang/jb/fix20671
fix #20671, slowdown loading SIUnits
2 parents ffbdbe7 + 70a5624 commit c051dc5

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

src/subtype.c

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,8 +1148,12 @@ static jl_value_t *intersect_var(jl_tvar_t *b, jl_value_t *a, jl_stenv_t *e, int
11481148
jl_value_t *root=NULL; jl_savedenv_t se;
11491149
if (param == 2) {
11501150
jl_value_t *ub = R ? intersect_ufirst(a, bb->ub, e, d) : intersect_ufirst(bb->ub, a, e, d);
1151-
JL_GC_PUSH1(&ub);
1152-
if (!subtype_in_env(bb->lb, a, e)) {
1151+
JL_GC_PUSH2(&ub, &root);
1152+
save_env(e, &root, &se);
1153+
int issub = subtype_in_env(bb->lb, ub, e);
1154+
restore_env(e, root, &se);
1155+
free(se.buf);
1156+
if (!issub) {
11531157
JL_GC_POP();
11541158
return jl_bottom_type;
11551159
}
@@ -1219,6 +1223,9 @@ static jl_value_t *intersect_var(jl_tvar_t *b, jl_value_t *a, jl_stenv_t *e, int
12191223
}
12201224
return ub;
12211225
}
1226+
else if (bb->ub == bb->lb) {
1227+
return ub;
1228+
}
12221229
root = NULL;
12231230
JL_GC_PUSH2(&root, &ub);
12241231
save_env(e, &root, &se);
@@ -1326,9 +1333,14 @@ static jl_value_t *finish_unionall(jl_value_t *res, jl_varbinding_t *vb, jl_sten
13261333
}
13271334
}
13281335
else {
1329-
varval = root = (jl_value_t*)jl_new_typevar(vb->var->name, vb->lb, vb->ub);
1330-
res = jl_instantiate_unionall((jl_unionall_t*)res, root);
1331-
res = jl_new_struct(jl_unionall_type, (jl_tvar_t*)root, res);
1336+
if (vb->lb != vb->var->lb || vb->ub != vb->var->ub) {
1337+
varval = root = (jl_value_t*)jl_new_typevar(vb->var->name, vb->lb, vb->ub);
1338+
res = jl_instantiate_unionall((jl_unionall_t*)res, root);
1339+
res = jl_new_struct(jl_unionall_type, (jl_tvar_t*)root, res);
1340+
}
1341+
else {
1342+
varval = (jl_value_t*)vb->var;
1343+
}
13321344
}
13331345
}
13341346

test/subtype.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,10 @@ abstract type AbstractTriangular{T,S<:AbstractMatrix} <: AbstractMatrix{T} end
622622
struct UpperTriangular{T,S<:AbstractMatrix} <: AbstractTriangular{T,S} end
623623
struct UnitUpperTriangular{T,S<:AbstractMatrix} <: AbstractTriangular{T,S} end
624624

625+
immutable SIQ20671{T<:Number,m,kg,s,A,K,mol,cd,rad,sr} <: Number
626+
val::T
627+
end
628+
625629
function test_intersection()
626630
@testintersect(Vector{Float64}, Vector{Union{Float64,Float32}}, Bottom)
627631

@@ -887,6 +891,14 @@ function test_intersection()
887891
@testintersect(Pair{L,Tuple{L,Pair{L,HL}}} where {L,HL},
888892
Pair{R,Tuple{Pair{R,HR},R}} where {R,HR},
889893
Bottom) # X == Pair{X,...} is not satisfiable
894+
895+
# issue #20671 --- this just took too long
896+
@testintersect(Tuple{Type{SIQ20671{T, mT, kgT, sT, AT, KT, molT, cdT, radT, srT}},
897+
SIQ20671{S, mS, kgS, sS, AS, KS, molS, cdS, radS, srS}} where {T, mT, kgT, sT, AT, KT, molT, cdT, radT, srT,
898+
S, mS, kgS, sS, AS, KS, molS, cdS, radS, srS},
899+
Tuple{Type{T}, T} where T,
900+
Tuple{Type{SIQ20671{T,mS,kgS,sS,AS,KS,molS,cdS,radS,srS}},
901+
SIQ20671{T,mS,kgS,sS,AS,KS,molS,cdS,radS,srS}} where {T,mS,kgS,sS,AS,KS,molS,cdS,radS,srS})
890902
end
891903

892904
function test_intersection_properties()

0 commit comments

Comments
 (0)