Skip to content

Commit 57277b4

Browse files
committed
make the TypeMap capable of splitting on any concrete type
previously, the TypeMap could only split on leaf types now it also has the ability to split on concrete types this allows it to ensure that each type gets its own linear list to scan to find its constructors, instead of needing to search through all constructors
1 parent 6a837da commit 57277b4

File tree

5 files changed

+289
-62
lines changed

5 files changed

+289
-62
lines changed

base/reflection.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,19 @@ function visit(f, mc::TypeMapLevel)
275275
isdefined(e, i) && visit(f, e[i])
276276
end
277277
end
278+
mc.linear_leaf !== nothing && visit(f, mc.linear_leaf)
279+
if mc.tname !== nothing
280+
e = mc.tname::Vector{Any}
281+
for i in 1:length(e)
282+
isdefined(e, i) && visit(f, e[i])
283+
end
284+
end
285+
if mc.name1 !== nothing
286+
e = mc.name1::Vector{Any}
287+
for i in 1:length(e)
288+
isdefined(e, i) && visit(f, e[i])
289+
end
290+
end
278291
mc.list !== nothing && visit(f, mc.list)
279292
mc.any !== nothing && visit(f, mc.any)
280293
nothing

src/dump.c

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -930,13 +930,28 @@ static void jl_serialize_value_(ios_t *s, jl_value_t *v)
930930
// (which will need to be rehashed during deserialization anyhow)
931931
jl_typemap_level_t *node = (jl_typemap_level_t*)v;
932932
size_t i, l;
933-
assert( // make sure this type has the expected ordering
934-
offsetof(jl_typemap_level_t, arg1) == 0 * sizeof(jl_value_t*) &&
935-
offsetof(jl_typemap_level_t, targ) == 1 * sizeof(jl_value_t*) &&
936-
offsetof(jl_typemap_level_t, linear) == 2 * sizeof(jl_value_t*) &&
937-
offsetof(jl_typemap_level_t, any) == 3 * sizeof(jl_value_t*) &&
938-
offsetof(jl_typemap_level_t, key) == 4 * sizeof(jl_value_t*) &&
939-
sizeof(jl_typemap_level_t) == 5 * sizeof(jl_value_t*));
933+
static_assert( // make sure this type has the expected ordering
934+
offsetof(jl_typemap_level_t, targ) == 0 * sizeof(jl_value_t*) &&
935+
offsetof(jl_typemap_level_t, arg1) == 1 * sizeof(jl_value_t*) &&
936+
offsetof(jl_typemap_level_t, linear_leaf) == 2 * sizeof(jl_value_t*) &&
937+
offsetof(jl_typemap_level_t, tname) == 3 * sizeof(jl_value_t*) &&
938+
offsetof(jl_typemap_level_t, name1) == 4 * sizeof(jl_value_t*) &&
939+
offsetof(jl_typemap_level_t, linear) == 5 * sizeof(jl_value_t*) &&
940+
offsetof(jl_typemap_level_t, any) == 6 * sizeof(jl_value_t*) &&
941+
offsetof(jl_typemap_level_t, key) == 7 * sizeof(jl_value_t*) &&
942+
sizeof(jl_typemap_level_t) == 8 * sizeof(jl_value_t*), "jl_typemap_level_t layout wrong");
943+
if (node->targ != (void*)jl_nothing) {
944+
jl_array_t *a = jl_alloc_cell_1d(0);
945+
for (i = 0, l = jl_array_len(node->targ); i < l; i++) {
946+
jl_value_t *d = jl_cellref(node->targ, i);
947+
if (d != NULL && d != jl_nothing)
948+
jl_cell_1d_push(a, d);
949+
}
950+
jl_serialize_value(s, a);
951+
}
952+
else {
953+
jl_serialize_value(s, jl_nothing);
954+
}
940955
if (node->arg1 != (void*)jl_nothing) {
941956
jl_array_t *a = jl_alloc_cell_1d(0);
942957
for (i = 0, l = jl_array_len(node->arg1); i < l; i++) {
@@ -949,10 +964,23 @@ static void jl_serialize_value_(ios_t *s, jl_value_t *v)
949964
else {
950965
jl_serialize_value(s, jl_nothing);
951966
}
952-
if (node->targ != (void*)jl_nothing) {
967+
jl_serialize_value(s, node->linear_leaf);
968+
if (node->tname != (void*)jl_nothing) {
953969
jl_array_t *a = jl_alloc_cell_1d(0);
954-
for (i = 0, l = jl_array_len(node->targ); i < l; i++) {
955-
jl_value_t *d = jl_cellref(node->targ, i);
970+
for (i = 0, l = jl_array_len(node->tname); i < l; i++) {
971+
jl_value_t *d = jl_cellref(node->tname, i);
972+
if (d != NULL && d != jl_nothing)
973+
jl_cell_1d_push(a, d);
974+
}
975+
jl_serialize_value(s, a);
976+
}
977+
else {
978+
jl_serialize_value(s, jl_nothing);
979+
}
980+
if (node->name1 != (void*)jl_nothing) {
981+
jl_array_t *a = jl_alloc_cell_1d(0);
982+
for (i = 0, l = jl_array_len(node->name1); i < l; i++) {
983+
jl_value_t *d = jl_cellref(node->name1, i);
956984
if (d != NULL && d != jl_nothing)
957985
jl_cell_1d_push(a, d);
958986
}

src/jltypes.c

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3456,9 +3456,25 @@ void jl_init_types(void)
34563456

34573457
jl_typemap_level_type =
34583458
jl_new_datatype(jl_symbol("TypeMapLevel"), jl_any_type, jl_emptysvec,
3459-
jl_svec(5, jl_symbol("arg1"), jl_symbol("targ"), jl_symbol("list"), jl_symbol("any"), jl_symbol("key")),
3460-
jl_svec(5, jl_any_type, jl_any_type, jl_any_type, jl_any_type, jl_any_type),
3461-
0, 1, 4);
3459+
jl_svec(8,
3460+
jl_symbol("targ"),
3461+
jl_symbol("arg1"),
3462+
jl_symbol("linear_leaf"),
3463+
jl_symbol("tname"),
3464+
jl_symbol("name1"),
3465+
jl_symbol("list"),
3466+
jl_symbol("any"),
3467+
jl_symbol("key")),
3468+
jl_svec(8,
3469+
jl_any_type,
3470+
jl_any_type,
3471+
jl_any_type,
3472+
jl_any_type,
3473+
jl_any_type,
3474+
jl_any_type,
3475+
jl_any_type,
3476+
jl_any_type),
3477+
0, 1, 7);
34623478

34633479
jl_typemap_entry_type =
34643480
jl_new_datatype(jl_symbol("TypeMapEntry"), jl_any_type, jl_emptysvec,

src/julia.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ typedef struct {
290290
jl_value_t *primary;
291291
jl_svec_t *cache; // sorted array
292292
jl_svec_t *linearcache; // unsorted array
293-
intptr_t uid;
293+
uint32_t uid;
294294
struct _jl_methtable_t *mt;
295295
} jl_typename_t;
296296

@@ -410,8 +410,11 @@ typedef struct _jl_typemap_entry_t {
410410
// indexed by key if it is a sublevel in an array
411411
typedef struct _jl_typemap_level_t {
412412
JL_DATA_TYPE
413-
jl_array_t *arg1; // Array{union jl_typemap_t}
414-
jl_array_t *targ; // Array{union jl_typemap_t}
413+
jl_array_t *targ; // Array{union jl_typemap_t} :: contains Type{LeafType}
414+
jl_array_t *arg1; // Array{union jl_typemap_t} :: contains LeafType
415+
jl_typemap_entry_t *linear_leaf; // union jl_typemap_t (but no more levels) for types more-specific than a TypeName
416+
jl_array_t *tname; // Array{union jl_typemap_t} :: contains non-abstract Type{TypeName}
417+
jl_array_t *name1; // Array{union jl_typemap_t} :: contains non-abstract TypeName
415418
jl_typemap_entry_t *linear; // union jl_typemap_t (but no more levels)
416419
union jl_typemap_t any; // type at offs is Any
417420
jl_value_t *key; // [nullable]

0 commit comments

Comments
 (0)