Skip to content

Commit ffbfafc

Browse files
committed
Cleanup GC issues
1 parent 1add963 commit ffbfafc

File tree

4 files changed

+10
-47
lines changed

4 files changed

+10
-47
lines changed

src/clangsa/GCChecker.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -752,6 +752,7 @@ bool GCChecker::isGCTrackedType(QualType QT) {
752752
Name.endswith_lower("jl_task_t") ||
753753
Name.endswith_lower("jl_uniontype_t") ||
754754
Name.endswith_lower("jl_method_match_t") ||
755+
Name.endswith_lower("jl_vararg_marker_t") ||
755756
// Probably not technically true for these, but let's allow
756757
// it
757758
Name.endswith_lower("typemap_intersection_env") ||

src/jltypes.c

Lines changed: 2 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -717,7 +717,7 @@ static ssize_t lookup_type_idx_linearvalue(jl_svec_t *cache, jl_value_t *key1, j
717717
return ~cl;
718718
}
719719

720-
static jl_value_t *lookup_type(jl_typename_t *tn, jl_value_t **key, size_t n)
720+
static jl_value_t *lookup_type(jl_typename_t *tn JL_PROPAGATES_ROOT, jl_value_t **key, size_t n)
721721
{
722722
JL_TIMING(TYPE_CACHE_LOOKUP);
723723
unsigned hv = typekey_hash(tn, key, n, 0);
@@ -1239,30 +1239,6 @@ static jl_value_t *extract_wrapper(jl_value_t *t JL_PROPAGATES_ROOT) JL_GLOBALLY
12391239
return NULL;
12401240
}
12411241

1242-
// convert `Vararg{X, Y} where T` to `Vararg{X where T, Y}` where T doesn't occur free in Y
1243-
static jl_value_t *normalize_vararg(jl_value_t *va)
1244-
{
1245-
assert(jl_is_vararg_type(va));
1246-
if (!jl_is_unionall(va)) return va;
1247-
jl_value_t *body=NULL;
1248-
JL_GC_PUSH2(&va, &body);
1249-
jl_unionall_t *ua = (jl_unionall_t*)va;
1250-
body = normalize_vararg(ua->body);
1251-
jl_value_t *unw = jl_unwrap_unionall(body);
1252-
jl_value_t *va0 = jl_unwrap_vararg(unw), *va1 = jl_unwrap_vararg_num(unw);
1253-
if (jl_has_typevar(va1, ua->var)) {
1254-
if (body != ua->body)
1255-
va = jl_type_unionall(ua->var, body);
1256-
}
1257-
else {
1258-
va = jl_type_unionall(ua->var, va0);
1259-
va = jl_wrap_vararg(va, va1);
1260-
va = jl_rewrap_unionall(va, body);
1261-
}
1262-
JL_GC_POP();
1263-
return va;
1264-
}
1265-
12661242
static jl_value_t *_jl_instantiate_type_in_env(jl_value_t *ty, jl_unionall_t *env, jl_value_t **vals, jl_typeenv_t *prev, jl_typestack_t *stack);
12671243

12681244
static jl_value_t *inst_datatype_inner(jl_datatype_t *dt, jl_svec_t *p, jl_value_t **iparams, size_t ntp,
@@ -1325,21 +1301,10 @@ static jl_value_t *inst_datatype_inner(jl_datatype_t *dt, jl_svec_t *p, jl_value
13251301
jl_value_t *va = jl_unwrap_unionall(last);
13261302
jl_value_t *va0 = jl_unwrap_vararg(va), *va1 = jl_unwrap_vararg_num(va);
13271303
// return same `Tuple` object for types equal to it
1328-
if (ntp == 1 &&
1329-
(va0 == (jl_value_t*)jl_any_type &&
1330-
jl_is_unionall(last) && va1 == (jl_value_t*)((jl_unionall_t*)last)->var)) {
1304+
if (ntp == 1 && va0 == (jl_value_t*)jl_any_type && !va1) {
13311305
JL_GC_POP();
13321306
return (jl_value_t*)jl_anytuple_type;
13331307
}
1334-
int did_normalize = 0;
1335-
jl_value_t *last2 = normalize_vararg(last);
1336-
assert(!jl_is_unionall(last2) || !jl_is_unionall(((jl_unionall_t*)last2)->body));
1337-
if (last2 != last) {
1338-
last = last2;
1339-
did_normalize = 1;
1340-
va = jl_unwrap_unionall(last);
1341-
va0 = jl_unwrap_vararg(va); va1 = jl_unwrap_vararg_num(va);
1342-
}
13431308
if (va1 && jl_is_long(va1)) {
13441309
ssize_t nt = jl_unbox_long(va1);
13451310
assert(nt >= 0);
@@ -1360,12 +1325,6 @@ static jl_value_t *inst_datatype_inner(jl_datatype_t *dt, jl_svec_t *p, jl_value
13601325
return ndt;
13611326
}
13621327
}
1363-
if (did_normalize) {
1364-
p = jl_alloc_svec(ntp);
1365-
for (size_t i = 0; i < ntp-1; i++)
1366-
jl_svecset(p, i, iparams[i]);
1367-
jl_svecset(p, ntp-1, last);
1368-
}
13691328
}
13701329

13711330
// move array of instantiated parameters to heap; we need to keep it

src/julia_internal.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -538,7 +538,7 @@ STATIC_INLINE int jl_is_vararg_type(jl_value_t *v) JL_NOTSAFEPOINT
538538
return jl_is_vararg_marker(jl_unwrap_unionall(v));
539539
}
540540

541-
STATIC_INLINE jl_value_t *jl_unwrap_vararg(jl_value_t *v) JL_NOTSAFEPOINT
541+
STATIC_INLINE jl_value_t *jl_unwrap_vararg(jl_value_t *v JL_PROPAGATES_ROOT) JL_NOTSAFEPOINT
542542
{
543543
assert(jl_is_vararg_type(v));
544544
v = jl_unwrap_unionall(v);
@@ -549,7 +549,7 @@ STATIC_INLINE jl_value_t *jl_unwrap_vararg(jl_value_t *v) JL_NOTSAFEPOINT
549549
return jl_tparam0(v);
550550
}
551551

552-
STATIC_INLINE jl_value_t *jl_unwrap_vararg_num(jl_value_t *v) JL_NOTSAFEPOINT
552+
STATIC_INLINE jl_value_t *jl_unwrap_vararg_num(jl_value_t *v JL_PROPAGATES_ROOT) JL_NOTSAFEPOINT
553553
{
554554
assert(jl_is_vararg_type(v));
555555
v = jl_unwrap_unionall(v);

src/subtype.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2709,9 +2709,12 @@ static jl_value_t *intersect_varargs(jl_vararg_marker_t *vmx, jl_vararg_marker_t
27092709
return jl_bottom_type;
27102710
jl_value_t *i2=NULL, *ii = intersect(xp1, yp1, e, 1);
27112711
if (ii == jl_bottom_type) return jl_bottom_type;
2712-
if (!xp2 && !yp2)
2713-
return jl_wrap_vararg(ii, NULL);
27142712
JL_GC_PUSH2(&ii, &i2);
2713+
if (!xp2 && !yp2) {
2714+
ii = jl_wrap_vararg(ii, NULL);
2715+
JL_GC_POP();
2716+
return ii;
2717+
}
27152718
if (xp2 && jl_is_typevar(xp2)) {
27162719
jl_varbinding_t *xb = lookup(e, (jl_tvar_t*)xp2);
27172720
if (xb) xb->intvalued = 1;

0 commit comments

Comments
 (0)