Skip to content

Commit 9072018

Browse files
committed
wip [ci skip]
1 parent 5cb5e96 commit 9072018

File tree

5 files changed

+213
-195
lines changed

5 files changed

+213
-195
lines changed

base/reflection.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@ function visit(f, mt::MethodTable)
289289
nothing
290290
end
291291
function visit(f, mc::TypeMapLevel)
292+
mc.bottom !== nothing && visit(f, mc.bottom)
292293
if mc.targ !== nothing
293294
e = mc.targ::Vector{Any}
294295
for i in 1:length(e)
@@ -301,7 +302,6 @@ function visit(f, mc::TypeMapLevel)
301302
isdefined(e, i) && visit(f, e[i])
302303
end
303304
end
304-
mc.linear_leaf !== nothing && visit(f, mc.linear_leaf)
305305
if mc.tname !== nothing
306306
e = mc.tname::Vector{Any}
307307
for i in 1:length(e)

src/dump.c

+11-9
Original file line numberDiff line numberDiff line change
@@ -940,14 +940,16 @@ static void jl_serialize_value_(ios_t *s, jl_value_t *v)
940940
jl_typemap_level_t *node = (jl_typemap_level_t*)v;
941941
size_t i, l;
942942
assert( // make sure this type has the expected ordering
943-
offsetof(jl_typemap_level_t, targ) == 0 * sizeof(jl_value_t*) &&
944-
offsetof(jl_typemap_level_t, arg1) == 1 * sizeof(jl_value_t*) &&
945-
offsetof(jl_typemap_level_t, tname) == 2 * sizeof(jl_value_t*) &&
946-
offsetof(jl_typemap_level_t, name1) == 3 * sizeof(jl_value_t*) &&
947-
offsetof(jl_typemap_level_t, linear) == 4 * sizeof(jl_value_t*) &&
948-
offsetof(jl_typemap_level_t, any) == 5 * sizeof(jl_value_t*) &&
949-
offsetof(jl_typemap_level_t, key) == 6 * sizeof(jl_value_t*) &&
950-
sizeof(jl_typemap_level_t) == 7 * sizeof(jl_value_t*));
943+
offsetof(jl_typemap_level_t, bottom) == 0 * sizeof(jl_value_t*) &&
944+
offsetof(jl_typemap_level_t, targ) == 1 * sizeof(jl_value_t*) &&
945+
offsetof(jl_typemap_level_t, arg1) == 2 * sizeof(jl_value_t*) &&
946+
offsetof(jl_typemap_level_t, tname) == 3 * sizeof(jl_value_t*) &&
947+
offsetof(jl_typemap_level_t, name1) == 4 * sizeof(jl_value_t*) &&
948+
offsetof(jl_typemap_level_t, linear) == 5 * sizeof(jl_value_t*) &&
949+
offsetof(jl_typemap_level_t, any) == 6 * sizeof(jl_value_t*) &&
950+
offsetof(jl_typemap_level_t, key) == 7 * sizeof(jl_value_t*) &&
951+
sizeof(jl_typemap_level_t) == 8 * sizeof(jl_value_t*));
952+
jl_serialize_value(s, node->bottom);
951953
if (node->targ != (void*)jl_nothing) {
952954
jl_array_t *a = jl_alloc_vec_any(0);
953955
for (i = 0, l = jl_array_len(node->targ); i < l; i++) {
@@ -1034,7 +1036,7 @@ struct jl_serialize_methcache_from_mod_env {
10341036
static int jl_serialize_methcache_from_mod(jl_typemap_entry_t *ml, void *closure)
10351037
{
10361038
struct jl_serialize_methcache_from_mod_env *env = (struct jl_serialize_methcache_from_mod_env*)closure;
1037-
if (module_in_worklist(ml->func.method->module)) {
1039+
if (module_in_worklist(ml->func.method->module) && !ml->weak) {
10381040
jl_serialize_value(env->s, ml->func.method);
10391041
jl_serialize_value(env->s, ml->simplesig);
10401042
}

src/jltypes.c

+10-6
Original file line numberDiff line numberDiff line change
@@ -3678,43 +3678,47 @@ void jl_init_types(void)
36783678

36793679
jl_typemap_level_type =
36803680
jl_new_datatype(jl_symbol("TypeMapLevel"), jl_any_type, jl_emptysvec,
3681-
jl_svec(7,
3681+
jl_svec(8,
3682+
jl_symbol("bottom"),
36823683
jl_symbol("targ"),
36833684
jl_symbol("arg1"),
36843685
jl_symbol("tname"),
36853686
jl_symbol("name1"),
36863687
jl_symbol("list"),
36873688
jl_symbol("any"),
36883689
jl_symbol("key")),
3689-
jl_svec(7,
3690+
jl_svec(8,
3691+
jl_any_type,
36903692
jl_any_type,
36913693
jl_any_type,
36923694
jl_any_type,
36933695
jl_any_type,
36943696
jl_any_type,
36953697
jl_any_type,
36963698
jl_any_type),
3697-
0, 1, 6);
3699+
0, 1, 7);
36983700

36993701
jl_typemap_entry_type =
37003702
jl_new_datatype(jl_symbol("TypeMapEntry"), jl_any_type, jl_emptysvec,
3701-
jl_svec(9, jl_symbol("next"),
3703+
jl_svec(10, jl_symbol("next"),
37023704
jl_symbol("sig"),
37033705
jl_symbol("tvars"),
37043706
jl_symbol("simplesig"),
37053707
jl_symbol("guardsigs"),
37063708
jl_symbol("func"),
37073709
jl_symbol("isleafsig"),
37083710
jl_symbol("issimplesig"),
3709-
jl_symbol("va")),
3710-
jl_svec(9, jl_any_type, // Union{TypeMapEntry, Void}
3711+
jl_symbol("va"),
3712+
jl_symbol("weak")),
3713+
jl_svec(10, jl_any_type, // Union{TypeMapEntry, Void}
37113714
jl_type_type, // TupleType
37123715
jl_any_type, // Union{SimpleVector{TypeVar}, TypeVar}
37133716
jl_any_type, // TupleType
37143717
jl_any_type, // SimpleVector{TupleType}
37153718
jl_any_type, // Any
37163719
jl_bool_type,
37173720
jl_bool_type,
3721+
jl_bool_type,
37183722
jl_bool_type),
37193723
0, 1, 5);
37203724

src/julia.h

+6-2
Original file line numberDiff line numberDiff line change
@@ -414,17 +414,19 @@ typedef struct _jl_typemap_entry_t {
414414
int8_t isleafsig; // isleaftype(sig) & !any(isType, sig) : unsorted and very fast
415415
int8_t issimplesig; // all(isleaftype | isAny | isType | isVararg, sig) : sorted and fast
416416
int8_t va; // isVararg(sig)
417+
int8_t weak; // will never overwrite a signature
417418
} jl_typemap_entry_t;
418419

419420
// one level in a TypeMap tree
420421
// indexed by key if it is a sublevel in an array
421422
typedef struct _jl_typemap_level_t {
422423
JL_DATA_TYPE
424+
jl_typemap_entry_t *bottom; // union jl_typemap_t (but no more levels) for entries which have no type at offs
423425
jl_array_t *targ; // Array{union jl_typemap_t} :: contains Type{LeafType}
424426
jl_array_t *arg1; // Array{union jl_typemap_t} :: contains LeafType
425427
jl_array_t *tname; // Array{union jl_typemap_t} :: contains non-abstract Type{TypeName}
426428
jl_array_t *name1; // Array{union jl_typemap_t} :: contains non-abstract TypeName
427-
jl_typemap_entry_t *linear; // union jl_typemap_t (but no more levels)
429+
jl_typemap_entry_t *linear; // union jl_typemap_t (but no more levels) for most entries
428430
union jl_typemap_t any; // type at offs is Any
429431
jl_value_t *key; // [nullable]
430432
} jl_typemap_level_t;
@@ -993,7 +995,9 @@ STATIC_INLINE int jl_is_leaf_type_(jl_value_t *v)
993995

994996
// type constructors
995997
JL_DLLEXPORT jl_typename_t *jl_new_typename(jl_sym_t *name);
996-
JL_DLLEXPORT jl_tvar_t *jl_new_typevar(jl_sym_t *name,jl_value_t *lb,jl_value_t *ub);
998+
JL_DLLEXPORT jl_tvar_t *jl_new_typevar(jl_sym_t *name, jl_value_t *lb, jl_value_t *ub);
999+
JL_DLLEXPORT jl_tvar_t *jl_new_typevar_(jl_sym_t *name, jl_value_t *lb,
1000+
jl_value_t *ub, jl_value_t *b);
9971001
JL_DLLEXPORT jl_value_t *jl_apply_type(jl_value_t *tc, jl_svec_t *params);
9981002
JL_DLLEXPORT jl_tupletype_t *jl_apply_tuple_type(jl_svec_t *params);
9991003
JL_DLLEXPORT jl_tupletype_t *jl_apply_tuple_type_v(jl_value_t **p, size_t np);

0 commit comments

Comments
 (0)