@@ -132,46 +132,48 @@ static jl_array_t *datatype_list=NULL; // (only used in MODE_SYSTEM_IMAGE)
132
132
#define write_int8 (s , n ) write_uint8(s, n)
133
133
#define read_int8 (s ) read_uint8(s)
134
134
135
+ /* read and write in network (bigendian) order: */
136
+
135
137
static void write_int32 (ios_t * s , int32_t i )
136
138
{
137
- write_uint8 (s , i & 0xff );
138
- write_uint8 (s , (i >> 8 ) & 0xff );
139
- write_uint8 (s , (i >>16 ) & 0xff );
140
139
write_uint8 (s , (i >>24 ) & 0xff );
140
+ write_uint8 (s , (i >>16 ) & 0xff );
141
+ write_uint8 (s , (i >> 8 ) & 0xff );
142
+ write_uint8 (s , i & 0xff );
141
143
}
142
144
143
145
static int32_t read_int32 (ios_t * s )
144
146
{
145
- int b0 = read_uint8 (s );
146
- int b1 = read_uint8 (s );
147
- int b2 = read_uint8 (s );
148
147
int b3 = read_uint8 (s );
148
+ int b2 = read_uint8 (s );
149
+ int b1 = read_uint8 (s );
150
+ int b0 = read_uint8 (s );
149
151
return b0 | (b1 <<8 ) | (b2 <<16 ) | (b3 <<24 );
150
152
}
151
153
152
154
static void write_uint64 (ios_t * s , uint64_t i )
153
155
{
154
- write_int32 (s , i & 0xffffffff );
155
156
write_int32 (s , (i >>32 ) & 0xffffffff );
157
+ write_int32 (s , i & 0xffffffff );
156
158
}
157
159
158
160
static uint64_t read_uint64 (ios_t * s )
159
161
{
160
- uint64_t b0 = (uint32_t )read_int32 (s );
161
162
uint64_t b1 = (uint32_t )read_int32 (s );
163
+ uint64_t b0 = (uint32_t )read_int32 (s );
162
164
return b0 | (b1 <<32 );
163
165
}
164
166
165
167
static void write_uint16 (ios_t * s , uint16_t i )
166
168
{
167
- write_uint8 (s , i & 0xff );
168
169
write_uint8 (s , (i >> 8 ) & 0xff );
170
+ write_uint8 (s , i & 0xff );
169
171
}
170
172
171
173
static uint16_t read_uint16 (ios_t * s )
172
174
{
173
- int b0 = read_uint8 (s );
174
175
int b1 = read_uint8 (s );
176
+ int b0 = read_uint8 (s );
175
177
return b0 | (b1 <<8 );
176
178
}
177
179
@@ -949,6 +951,54 @@ void jl_serialize_mod_list(ios_t *s)
949
951
write_int32 (s , 0 );
950
952
}
951
953
954
+ // serialize the global _require_dependencies array of pathnames that
955
+ // are include depenencies
956
+ void jl_serialize_dependency_list (ios_t * s )
957
+ {
958
+ size_t total_size = 0 ;
959
+ static jl_array_t * deps = NULL ;
960
+ if (!deps )
961
+ deps = (jl_array_t * )jl_get_global (jl_base_module , jl_symbol ("_require_dependencies" ));
962
+ if (deps ) {
963
+ // sort!(deps) so that we can easily eliminate duplicates
964
+ static jl_value_t * sort_func = NULL ;
965
+ if (!sort_func )
966
+ sort_func = jl_get_global (jl_base_module , jl_symbol ("sort!" ));
967
+ jl_apply ((jl_function_t * )sort_func , (jl_value_t * * )& deps , 1 );
968
+
969
+ size_t l = jl_array_len (deps );
970
+ jl_value_t * prev = NULL ;
971
+ for (size_t i = 0 ; i < l ; i ++ ) {
972
+ jl_value_t * dep = jl_cellref (deps , i );
973
+ size_t slen = jl_string_len (dep );
974
+ if (!prev ||
975
+ memcmp (jl_string_data (dep ), jl_string_data (prev ), slen )) {
976
+ total_size += 4 + slen ;
977
+ }
978
+ prev = dep ;
979
+ }
980
+ total_size += 4 ;
981
+ }
982
+ // write the total size so that we can quickly seek past all of the
983
+ // dependencies if we don't need them
984
+ write_uint64 (s , total_size );
985
+ if (deps ) {
986
+ size_t l = jl_array_len (deps );
987
+ jl_value_t * prev = NULL ;
988
+ for (size_t i = 0 ; i < l ; i ++ ) {
989
+ jl_value_t * dep = jl_cellref (deps , i );
990
+ size_t slen = jl_string_len (dep );
991
+ if (!prev ||
992
+ memcmp (jl_string_data (dep ), jl_string_data (prev ), slen )) {
993
+ write_int32 (s , slen );
994
+ ios_write (s , jl_string_data (dep ), slen );
995
+ }
996
+ prev = dep ;
997
+ }
998
+ write_int32 (s , 0 ); // terminator, for ease of reading
999
+ }
1000
+ }
1001
+
952
1002
// --- deserialize ---
953
1003
954
1004
static jl_fptr_t jl_deserialize_fptr (ios_t * s )
@@ -1893,6 +1943,7 @@ DLLEXPORT int jl_save_incremental(const char *fname, jl_array_t *worklist)
1893
1943
}
1894
1944
serializer_worklist = worklist ;
1895
1945
jl_serialize_mod_list (& f ); // this can throw, keep it early (before any actual initialization)
1946
+ jl_serialize_dependency_list (& f );
1896
1947
1897
1948
JL_SIGATOMIC_BEGIN ();
1898
1949
arraylist_new (& reinit_list , 0 );
@@ -1937,6 +1988,8 @@ static jl_array_t *_jl_restore_incremental(ios_t *f)
1937
1988
ios_close (f );
1938
1989
return NULL ;
1939
1990
}
1991
+ size_t deplen = read_uint64 (f );
1992
+ ios_skip (f , deplen ); // skip past the dependency list
1940
1993
JL_SIGATOMIC_BEGIN ();
1941
1994
arraylist_new (& backref_list , 4000 );
1942
1995
arraylist_push (& backref_list , jl_main_module );
0 commit comments