@@ -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 );
@@ -994,37 +1013,25 @@ struct jl_serialize_methcache_from_mod_env {
994
1013
ios_t * s ;
995
1014
jl_sym_t * name ;
996
1015
jl_module_t * mod ;
997
- int8_t iskw ;
998
1016
};
999
1017
1000
1018
static int jl_serialize_methcache_from_mod (jl_typemap_entry_t * ml , void * closure )
1001
1019
{
1002
1020
struct jl_serialize_methcache_from_mod_env * env = (struct jl_serialize_methcache_from_mod_env * )closure ;
1003
1021
if (module_in_worklist (ml -> func .method -> module )) {
1004
- jl_serialize_value (env -> s , env -> mod );
1005
- jl_serialize_value (env -> s , env -> name );
1006
- write_int8 (env -> s , env -> iskw );
1007
- jl_serialize_value (env -> s , ml -> simplesig );
1008
1022
jl_serialize_value (env -> s , ml -> func .method );
1023
+ jl_serialize_value (env -> s , ml -> simplesig );
1009
1024
}
1010
1025
return 1 ;
1011
1026
}
1012
1027
1013
- static void jl_serialize_methtable_from_mod (ios_t * s , jl_typename_t * tn , int8_t iskw )
1028
+ static void jl_serialize_methtable_from_mod (ios_t * s , jl_typename_t * tn )
1014
1029
{
1015
1030
struct jl_serialize_methcache_from_mod_env env ;
1016
1031
env .s = s ;
1017
1032
env .mod = tn -> module ;
1018
1033
env .name = tn -> name ;
1019
- env .iskw = iskw ;
1020
1034
assert (tn -> module );
1021
- if (iskw ) {
1022
- if (!tn -> mt -> kwsorter )
1023
- return ;
1024
- assert (tn -> mt -> module == jl_gf_mtable (tn -> mt -> kwsorter )-> module );
1025
- tn = ((jl_datatype_t * )jl_typeof (tn -> mt -> kwsorter ))-> name ;
1026
- assert (tn -> mt -> kwsorter == NULL );
1027
- }
1028
1035
jl_typemap_visitor (tn -> mt -> defs , jl_serialize_methcache_from_mod , & env );
1029
1036
}
1030
1037
@@ -1037,14 +1044,12 @@ static void jl_serialize_lambdas_from_mod(ios_t *s, jl_module_t *m)
1037
1044
if (table [i ] != HT_NOTFOUND ) {
1038
1045
jl_binding_t * b = (jl_binding_t * )table [i ];
1039
1046
if (b -> owner == m && b -> value && b -> constp ) {
1040
- if (jl_is_datatype (b -> value ) &&
1041
- (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 */
1047
+ if (jl_is_datatype (b -> value )) {
1042
1048
jl_typename_t * tn = ((jl_datatype_t * )b -> value )-> name ;
1043
1049
if (tn -> module == m && tn -> name == b -> name ) {
1044
1050
jl_methtable_t * mt = tn -> mt ;
1045
1051
if (mt != NULL && (jl_value_t * )mt != jl_nothing && (mt != jl_type_type_mt || tn == jl_type_type -> name )) {
1046
- jl_serialize_methtable_from_mod (s , tn , 0 );
1047
- jl_serialize_methtable_from_mod (s , tn , 1 );
1052
+ jl_serialize_methtable_from_mod (s , tn );
1048
1053
}
1049
1054
}
1050
1055
}
@@ -1176,12 +1181,18 @@ static jl_value_t *jl_deserialize_datatype(ios_t *s, int pos, jl_value_t **loc)
1176
1181
backref_list .items [pos ] = dtv ;
1177
1182
return dtv ;
1178
1183
}
1184
+ if (tag == 9 ) {
1185
+ jl_datatype_t * primarydt = (jl_datatype_t * )jl_deserialize_value (s , NULL );
1186
+ jl_value_t * dtv = jl_typeof (jl_get_kwsorter (primarydt -> name ));
1187
+ backref_list .items [pos ] = dtv ;
1188
+ return dtv ;
1189
+ }
1179
1190
uint16_t nf = read_uint16 (s );
1180
1191
size_t size = read_int32 (s );
1181
1192
uint8_t flags = read_uint8 (s );
1182
1193
uint8_t depth = read_int32 (s );
1183
1194
uint8_t fielddesc_type = read_int8 (s );
1184
- jl_datatype_t * dt ;
1195
+ jl_datatype_t * dt = NULL ;
1185
1196
if (tag == 2 )
1186
1197
dt = jl_int32_type ;
1187
1198
else if (tag == 3 )
@@ -1190,8 +1201,10 @@ static jl_value_t *jl_deserialize_datatype(ios_t *s, int pos, jl_value_t **loc)
1190
1201
dt = jl_int64_type ;
1191
1202
else if (tag == 8 )
1192
1203
dt = jl_uint8_type ;
1193
- else
1204
+ else if ( tag == 0 || tag == 5 )
1194
1205
dt = jl_new_uninitialized_datatype (nf , fielddesc_type );
1206
+ else
1207
+ assert (0 );
1195
1208
assert (tree_literal_values == NULL && mode != MODE_AST );
1196
1209
backref_list .items [pos ] = dt ;
1197
1210
dt -> size = size ;
@@ -1686,19 +1699,12 @@ static jl_value_t *jl_deserialize_value_(ios_t *s, jl_value_t *vtag, jl_value_t
1686
1699
static void jl_deserialize_lambdas_from_mod (ios_t * s )
1687
1700
{
1688
1701
while (1 ) {
1689
- jl_module_t * mod = (jl_module_t * )jl_deserialize_value (s , NULL );
1690
- if (mod == NULL )
1702
+ jl_method_t * meth = (jl_method_t * )jl_deserialize_value (s , NULL );
1703
+ if (meth == NULL )
1691
1704
return ;
1692
- jl_sym_t * name = (jl_sym_t * )jl_deserialize_value (s , NULL );
1693
- jl_datatype_t * gf = (jl_datatype_t * )jl_get_global (mod , name );
1694
- assert (jl_is_datatype (gf ));
1695
- int8_t iskw = read_int8 (s );
1696
- if (iskw ) {
1697
- gf = (jl_datatype_t * )jl_typeof (jl_get_kwsorter (gf -> name ));
1698
- assert (jl_is_datatype (gf ));
1699
- }
1700
1705
jl_tupletype_t * simpletype = (jl_tupletype_t * )jl_deserialize_value (s , NULL );
1701
- jl_method_t * meth = (jl_method_t * )jl_deserialize_value (s , NULL );
1706
+ jl_datatype_t * gf = (jl_datatype_t * )jl_tparam0 (meth -> sig );
1707
+ assert (jl_is_datatype (gf ));
1702
1708
jl_method_table_insert (gf -> name -> mt , meth , simpletype );
1703
1709
}
1704
1710
}
0 commit comments