Skip to content

Commit 725c385

Browse files
committed
jltypes: always run parameter normalization
This simplifies the types, which may help subtyping other other similar lookup code any time this is later used as a parameter, so it is probably worthwhile to do. This is a followup to #49820, where we reorganized the code to make this more straightforward.
1 parent c245179 commit 725c385

File tree

5 files changed

+45
-38
lines changed

5 files changed

+45
-38
lines changed

src/builtins.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1363,11 +1363,11 @@ JL_CALLABLE(jl_f_apply_type)
13631363
jl_vararg_t *vm = (jl_vararg_t*)args[0];
13641364
if (!vm->T) {
13651365
JL_NARGS(apply_type, 2, 3);
1366-
return (jl_value_t*)jl_wrap_vararg(args[1], nargs == 3 ? args[2] : NULL);
1366+
return (jl_value_t*)jl_wrap_vararg(args[1], nargs == 3 ? args[2] : NULL, 1);
13671367
}
13681368
else if (!vm->N) {
13691369
JL_NARGS(apply_type, 2, 2);
1370-
return (jl_value_t*)jl_wrap_vararg(vm->T, args[1]);
1370+
return (jl_value_t*)jl_wrap_vararg(vm->T, args[1], 1);
13711371
}
13721372
}
13731373
else if (jl_is_unionall(args[0])) {
@@ -2060,7 +2060,7 @@ void jl_init_primitives(void) JL_GC_DISABLED
20602060
add_builtin("Tuple", (jl_value_t*)jl_anytuple_type);
20612061
add_builtin("TypeofVararg", (jl_value_t*)jl_vararg_type);
20622062
add_builtin("SimpleVector", (jl_value_t*)jl_simplevector_type);
2063-
add_builtin("Vararg", (jl_value_t*)jl_wrap_vararg(NULL, NULL));
2063+
add_builtin("Vararg", (jl_value_t*)jl_wrap_vararg(NULL, NULL, 0));
20642064

20652065
add_builtin("Module", (jl_value_t*)jl_module_type);
20662066
add_builtin("MethodTable", (jl_value_t*)jl_methtable_type);

src/gf.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -735,7 +735,7 @@ static jl_value_t *inst_varargp_in_env(jl_value_t *decl, jl_svec_t *sparams)
735735
vm = T_has_tv ? jl_type_unionall(v, T) : T;
736736
if (N_has_tv)
737737
N = NULL;
738-
vm = (jl_value_t*)jl_wrap_vararg(vm, N); // this cannot throw for these inputs
738+
vm = (jl_value_t*)jl_wrap_vararg(vm, N, 1); // this cannot throw for these inputs
739739
}
740740
sp++;
741741
decl = ((jl_unionall_t*)decl)->body;
@@ -984,7 +984,7 @@ static void jl_compilation_sig(
984984
// avoid Vararg{Type{Type{...}}}
985985
if (jl_is_type_type(type_i) && jl_is_type_type(jl_tparam0(type_i)))
986986
type_i = (jl_value_t*)jl_type_type;
987-
type_i = (jl_value_t*)jl_wrap_vararg(type_i, (jl_value_t*)NULL); // this cannot throw for these inputs
987+
type_i = (jl_value_t*)jl_wrap_vararg(type_i, (jl_value_t*)NULL, 1); // this cannot throw for these inputs
988988
}
989989
else {
990990
type_i = inst_varargp_in_env(decl, sparams);

src/jltypes.c

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -847,14 +847,14 @@ JL_DLLEXPORT jl_value_t *jl_type_unionall(jl_tvar_t *v, jl_value_t *body)
847847
if (T_has_tv) {
848848
jl_value_t *wrapped = jl_type_unionall(v, vm->T);
849849
JL_GC_PUSH1(&wrapped);
850-
wrapped = (jl_value_t*)jl_wrap_vararg(wrapped, vm->N);
850+
wrapped = (jl_value_t*)jl_wrap_vararg(wrapped, vm->N, 1);
851851
JL_GC_POP();
852852
return wrapped;
853853
}
854854
else {
855855
assert(N_has_tv);
856856
assert(vm->N == (jl_value_t*)v);
857-
return (jl_value_t*)jl_wrap_vararg(vm->T, NULL);
857+
return (jl_value_t*)jl_wrap_vararg(vm->T, NULL, 1);
858858
}
859859
}
860860
if (!jl_is_type(body) && !jl_is_typevar(body))
@@ -1889,7 +1889,7 @@ static jl_value_t *inst_datatype_inner(jl_datatype_t *dt, jl_svec_t *p, jl_value
18891889
}
18901890
// if some normalization might be needed, do that now
18911891
// it is probably okay to mutate iparams, and we only store globally rooted objects here
1892-
if (check && cacheable) {
1892+
if (check) {
18931893
size_t i;
18941894
for (i = 0; i < ntp; i++) {
18951895
jl_value_t *pi = iparams[i];
@@ -1898,8 +1898,7 @@ static jl_value_t *inst_datatype_inner(jl_datatype_t *dt, jl_svec_t *p, jl_value
18981898
if (jl_is_datatype(pi))
18991899
continue;
19001900
if (jl_is_vararg(pi))
1901-
// This would require some special handling, but is not needed
1902-
// at the moment (and might be better handled in jl_wrap_vararg instead).
1901+
// This is already handled in jl_wrap_vararg instead
19031902
continue;
19041903
if (!cacheable && jl_has_free_typevars(pi))
19051904
continue;
@@ -2327,7 +2326,7 @@ static jl_value_t *inst_type_w_(jl_value_t *t, jl_typeenv_t *env, jl_typestack_t
23272326
N = inst_type_w_(v->N, env, stack, check);
23282327
}
23292328
if (T != v->T || N != v->N) {
2330-
t = (jl_value_t*)jl_wrap_vararg(T, N);
2329+
t = (jl_value_t*)jl_wrap_vararg(T, N, check);
23312330
}
23322331
JL_GC_POP();
23332332
return t;
@@ -2400,36 +2399,44 @@ jl_datatype_t *jl_wrap_Type(jl_value_t *t)
24002399
return (jl_datatype_t*)jl_instantiate_unionall(jl_type_type, t);
24012400
}
24022401

2403-
jl_vararg_t *jl_wrap_vararg(jl_value_t *t, jl_value_t *n)
2402+
jl_vararg_t *jl_wrap_vararg(jl_value_t *t, jl_value_t *n, int check)
24042403
{
2405-
if (n) {
2406-
if (jl_is_typevar(n) || jl_is_uniontype(jl_unwrap_unionall(n))) {
2407-
// TODO: this is disabled due to #39698; it is also inconsistent
2408-
// with other similar checks, where we usually only check substituted
2409-
// values and not the bounds of variables.
2410-
/*
2411-
jl_tvar_t *N = (jl_tvar_t*)n;
2412-
if (!(N->lb == jl_bottom_type && N->ub == (jl_value_t*)jl_any_type))
2413-
jl_error("TypeVar in Vararg length must have bounds Union{} and Any");
2414-
*/
2415-
}
2416-
else if (!jl_is_long(n)) {
2417-
jl_type_error_rt("Vararg", "count", (jl_value_t*)jl_long_type, n);
2418-
}
2419-
else if (jl_unbox_long(n) < 0) {
2420-
jl_errorf("Vararg length is negative: %zd", jl_unbox_long(n));
2404+
jl_task_t *ct = jl_current_task;
2405+
JL_GC_PUSH1(&t);
2406+
if (check) {
2407+
if (n) {
2408+
if (jl_is_typevar(n) || jl_is_uniontype(jl_unwrap_unionall(n))) {
2409+
// TODO: this is disabled due to #39698; it is also inconsistent
2410+
// with other similar checks, where we usually only check substituted
2411+
// values and not the bounds of variables.
2412+
/*
2413+
jl_tvar_t *N = (jl_tvar_t*)n;
2414+
if (!(N->lb == jl_bottom_type && N->ub == (jl_value_t*)jl_any_type))
2415+
jl_error("TypeVar in Vararg length must have bounds Union{} and Any");
2416+
*/
2417+
}
2418+
else if (!jl_is_long(n)) {
2419+
jl_type_error_rt("Vararg", "count", (jl_value_t*)jl_long_type, n);
2420+
}
2421+
else if (jl_unbox_long(n) < 0) {
2422+
jl_errorf("Vararg length is negative: %zd", jl_unbox_long(n));
2423+
}
24212424
}
2422-
}
2423-
if (t) {
2424-
if (!jl_valid_type_param(t)) {
2425-
jl_type_error_rt("Vararg", "type", (jl_value_t*)jl_type_type, t);
2425+
if (t) {
2426+
if (!jl_valid_type_param(t)) {
2427+
jl_type_error_rt("Vararg", "type", (jl_value_t*)jl_type_type, t);
2428+
}
2429+
t = normalize_unionalls(t);
2430+
jl_value_t *tw = extract_wrapper(t);
2431+
if (tw && t != tw && jl_types_equal(t, tw))
2432+
t = tw;
24262433
}
24272434
}
2428-
jl_task_t *ct = jl_current_task;
24292435
jl_vararg_t *vm = (jl_vararg_t *)jl_gc_alloc(ct->ptls, sizeof(jl_vararg_t), jl_vararg_type);
24302436
jl_set_typetagof(vm, jl_vararg_tag, 0);
24312437
vm->T = t;
24322438
vm->N = n;
2439+
JL_GC_POP();
24332440
return vm;
24342441
}
24352442

@@ -2712,7 +2719,7 @@ void jl_init_types(void) JL_GC_DISABLED
27122719
// It seems like we probably usually end up needing the box for kinds (often used in an Any context), so force it to exist
27132720
jl_vararg_type->name->mayinlinealloc = 0;
27142721

2715-
jl_svec_t *anytuple_params = jl_svec(1, jl_wrap_vararg((jl_value_t*)jl_any_type, (jl_value_t*)NULL));
2722+
jl_svec_t *anytuple_params = jl_svec(1, jl_wrap_vararg((jl_value_t*)jl_any_type, (jl_value_t*)NULL, 0));
27162723
jl_anytuple_type = jl_new_datatype(jl_symbol("Tuple"), core, jl_any_type, anytuple_params,
27172724
jl_emptysvec, anytuple_params, jl_emptysvec, 0, 0, 0);
27182725
jl_tuple_typename = jl_anytuple_type->name;

src/julia_internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -712,7 +712,7 @@ jl_datatype_t *jl_new_abstracttype(jl_value_t *name, jl_module_t *module,
712712
jl_datatype_t *jl_new_uninitialized_datatype(void);
713713
void jl_precompute_memoized_dt(jl_datatype_t *dt, int cacheable);
714714
JL_DLLEXPORT jl_datatype_t *jl_wrap_Type(jl_value_t *t); // x -> Type{x}
715-
jl_vararg_t *jl_wrap_vararg(jl_value_t *t, jl_value_t *n);
715+
jl_vararg_t *jl_wrap_vararg(jl_value_t *t, jl_value_t *n, int check);
716716
void jl_reinstantiate_inner_types(jl_datatype_t *t);
717717
jl_datatype_t *jl_lookup_cache_type_(jl_datatype_t *type);
718718
void jl_cache_type_(jl_datatype_t *type);

src/subtype.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -953,7 +953,7 @@ static int subtype_unionall(jl_value_t *t, jl_unionall_t *u, jl_stenv_t *e, int8
953953
if (R && ans && e->envidx < e->envsz) {
954954
jl_value_t *val;
955955
if (vb.intvalued && vb.lb == (jl_value_t*)jl_any_type)
956-
val = (jl_value_t*)jl_wrap_vararg(NULL, NULL); // special token result that represents N::Int in the envout
956+
val = (jl_value_t*)jl_wrap_vararg(NULL, NULL, 0); // special token result that represents N::Int in the envout
957957
else if (!vb.occurs_inv && vb.lb != jl_bottom_type)
958958
val = is_leaf_bound(vb.lb) ? vb.lb : (jl_value_t*)jl_new_typevar(u->var->name, jl_bottom_type, vb.lb);
959959
else if (vb.lb == vb.ub)
@@ -3089,7 +3089,7 @@ static jl_value_t *intersect_varargs(jl_vararg_t *vmx, jl_vararg_t *vmy, ssize_t
30893089
ii = (jl_value_t*)vmy;
30903090
else {
30913091
JL_GC_PUSH1(&ii);
3092-
ii = (jl_value_t*)jl_wrap_vararg(ii, NULL);
3092+
ii = (jl_value_t*)jl_wrap_vararg(ii, NULL, 1);
30933093
JL_GC_POP();
30943094
}
30953095
return ii;
@@ -3130,7 +3130,7 @@ static jl_value_t *intersect_varargs(jl_vararg_t *vmx, jl_vararg_t *vmy, ssize_t
31303130
else if (yp2 && obviously_egal(yp1, ii) && obviously_egal(yp2, i2))
31313131
ii = (jl_value_t*)vmy;
31323132
else
3133-
ii = (jl_value_t*)jl_wrap_vararg(ii, i2);
3133+
ii = (jl_value_t*)jl_wrap_vararg(ii, i2, 1);
31343134
JL_GC_POP();
31353135
return ii;
31363136
}

0 commit comments

Comments
 (0)