@@ -529,6 +529,20 @@ static void jl_serialize_datatype(ios_t *s, jl_datatype_t *dt)
529
529
tag = 4 ;
530
530
else if (dt == jl_uint8_type )
531
531
tag = 8 ;
532
+
533
+ if (strncmp (jl_symbol_name (dt -> name -> name ), "#kw#" , 4 ) == 0 ) {
534
+ /* XXX: yuck, but the auto-generated kw types from the serializer isn't a real type, so we *must* be very careful */
535
+ assert (tag == 0 || tag == 5 || tag == 6 );
536
+ if (tag == 6 ) {
537
+ jl_methtable_t * mt = dt -> name -> mt ;
538
+ jl_datatype_t * primarydt = (jl_datatype_t * )jl_get_global (mt -> module , mt -> name );
539
+ assert (jl_is_datatype (primarydt ));
540
+ assert (jl_typeof (primarydt -> name -> mt -> kwsorter ) == (jl_value_t * )dt );
541
+ dt = primarydt ;
542
+ tag = 9 ;
543
+ }
544
+ }
545
+
532
546
writetag (s , (jl_value_t * )SmallDataType_tag );
533
547
write_uint8 (s , 0 ); // virtual size
534
548
jl_serialize_value (s , (jl_value_t * )jl_datatype_type );
@@ -542,6 +556,11 @@ static void jl_serialize_datatype(ios_t *s, jl_datatype_t *dt)
542
556
jl_serialize_value (s , dt -> parameters );
543
557
return ;
544
558
}
559
+ if (tag == 9 ) {
560
+ jl_serialize_value (s , dt );
561
+ return ;
562
+ }
563
+
545
564
size_t nf = jl_datatype_nfields (dt );
546
565
write_uint16 (s , nf );
547
566
write_int32 (s , dt -> size );
@@ -993,37 +1012,25 @@ struct jl_serialize_methcache_from_mod_env {
993
1012
ios_t * s ;
994
1013
jl_sym_t * name ;
995
1014
jl_module_t * mod ;
996
- int8_t iskw ;
997
1015
};
998
1016
999
1017
static int jl_serialize_methcache_from_mod (jl_typemap_entry_t * ml , void * closure )
1000
1018
{
1001
1019
struct jl_serialize_methcache_from_mod_env * env = (struct jl_serialize_methcache_from_mod_env * )closure ;
1002
1020
if (module_in_worklist (ml -> func .method -> module )) {
1003
- jl_serialize_value (env -> s , env -> mod );
1004
- jl_serialize_value (env -> s , env -> name );
1005
- write_int8 (env -> s , env -> iskw );
1006
- jl_serialize_value (env -> s , ml -> simplesig );
1007
1021
jl_serialize_value (env -> s , ml -> func .method );
1022
+ jl_serialize_value (env -> s , ml -> simplesig );
1008
1023
}
1009
1024
return 1 ;
1010
1025
}
1011
1026
1012
- static void jl_serialize_methtable_from_mod (ios_t * s , jl_typename_t * tn , int8_t iskw )
1027
+ static void jl_serialize_methtable_from_mod (ios_t * s , jl_typename_t * tn )
1013
1028
{
1014
1029
struct jl_serialize_methcache_from_mod_env env ;
1015
1030
env .s = s ;
1016
1031
env .mod = tn -> module ;
1017
1032
env .name = tn -> name ;
1018
- env .iskw = iskw ;
1019
1033
assert (tn -> module );
1020
- if (iskw ) {
1021
- if (!tn -> mt -> kwsorter )
1022
- return ;
1023
- assert (tn -> mt -> module == jl_gf_mtable (tn -> mt -> kwsorter )-> module );
1024
- tn = ((jl_datatype_t * )jl_typeof (tn -> mt -> kwsorter ))-> name ;
1025
- assert (tn -> mt -> kwsorter == NULL );
1026
- }
1027
1034
jl_typemap_visitor (tn -> mt -> defs , jl_serialize_methcache_from_mod , & env );
1028
1035
}
1029
1036
@@ -1036,14 +1043,12 @@ static void jl_serialize_lambdas_from_mod(ios_t *s, jl_module_t *m)
1036
1043
if (table [i ] != HT_NOTFOUND ) {
1037
1044
jl_binding_t * b = (jl_binding_t * )table [i ];
1038
1045
if (b -> owner == m && b -> value && b -> constp ) {
1039
- if (jl_is_datatype (b -> value ) &&
1040
- (strlen (jl_symbol_name (b -> name )) <= 4 || strncmp (jl_symbol_name (b -> name ), "#kw#" , 4 ))) { /* XXX: yuck, but the auto-generated kw types from the serializer isn't a real type, so we *must* reject it */
1046
+ if (jl_is_datatype (b -> value )) {
1041
1047
jl_typename_t * tn = ((jl_datatype_t * )b -> value )-> name ;
1042
1048
if (tn -> module == m && tn -> name == b -> name ) {
1043
1049
jl_methtable_t * mt = tn -> mt ;
1044
1050
if (mt != NULL && (jl_value_t * )mt != jl_nothing && (mt != jl_type_type_mt || tn == jl_type_type -> name )) {
1045
- jl_serialize_methtable_from_mod (s , tn , 0 );
1046
- jl_serialize_methtable_from_mod (s , tn , 1 );
1051
+ jl_serialize_methtable_from_mod (s , tn );
1047
1052
}
1048
1053
}
1049
1054
}
@@ -1175,12 +1180,18 @@ static jl_value_t *jl_deserialize_datatype(ios_t *s, int pos, jl_value_t **loc)
1175
1180
backref_list .items [pos ] = dtv ;
1176
1181
return dtv ;
1177
1182
}
1183
+ if (tag == 9 ) {
1184
+ jl_datatype_t * primarydt = (jl_datatype_t * )jl_deserialize_value (s , NULL );
1185
+ jl_value_t * dtv = jl_typeof (jl_get_kwsorter (primarydt -> name ));
1186
+ backref_list .items [pos ] = dtv ;
1187
+ return dtv ;
1188
+ }
1178
1189
uint16_t nf = read_uint16 (s );
1179
1190
size_t size = read_int32 (s );
1180
1191
uint8_t flags = read_uint8 (s );
1181
1192
uint8_t depth = read_int32 (s );
1182
1193
uint8_t fielddesc_type = read_int8 (s );
1183
- jl_datatype_t * dt ;
1194
+ jl_datatype_t * dt = NULL ;
1184
1195
if (tag == 2 )
1185
1196
dt = jl_int32_type ;
1186
1197
else if (tag == 3 )
@@ -1189,8 +1200,10 @@ static jl_value_t *jl_deserialize_datatype(ios_t *s, int pos, jl_value_t **loc)
1189
1200
dt = jl_int64_type ;
1190
1201
else if (tag == 8 )
1191
1202
dt = jl_uint8_type ;
1192
- else
1203
+ else if ( tag == 0 || tag == 5 )
1193
1204
dt = jl_new_uninitialized_datatype (nf , fielddesc_type );
1205
+ else
1206
+ assert (0 );
1194
1207
assert (tree_literal_values == NULL && mode != MODE_AST );
1195
1208
backref_list .items [pos ] = dt ;
1196
1209
dt -> size = size ;
@@ -1684,19 +1697,12 @@ static jl_value_t *jl_deserialize_value_(ios_t *s, jl_value_t *vtag, jl_value_t
1684
1697
static void jl_deserialize_lambdas_from_mod (ios_t * s )
1685
1698
{
1686
1699
while (1 ) {
1687
- jl_module_t * mod = (jl_module_t * )jl_deserialize_value (s , NULL );
1688
- if (mod == NULL )
1700
+ jl_method_t * meth = (jl_method_t * )jl_deserialize_value (s , NULL );
1701
+ if (meth == NULL )
1689
1702
return ;
1690
- jl_sym_t * name = (jl_sym_t * )jl_deserialize_value (s , NULL );
1691
- jl_datatype_t * gf = (jl_datatype_t * )jl_get_global (mod , name );
1692
- assert (jl_is_datatype (gf ));
1693
- int8_t iskw = read_int8 (s );
1694
- if (iskw ) {
1695
- gf = (jl_datatype_t * )jl_typeof (jl_get_kwsorter (gf -> name ));
1696
- assert (jl_is_datatype (gf ));
1697
- }
1698
1703
jl_tupletype_t * simpletype = (jl_tupletype_t * )jl_deserialize_value (s , NULL );
1699
- jl_method_t * meth = (jl_method_t * )jl_deserialize_value (s , NULL );
1704
+ jl_datatype_t * gf = (jl_datatype_t * )jl_tparam0 (meth -> sig );
1705
+ assert (jl_is_datatype (gf ));
1700
1706
jl_method_table_insert (gf -> name -> mt , meth , simpletype );
1701
1707
}
1702
1708
}
0 commit comments