@@ -949,6 +949,15 @@ void jl_serialize_mod_list(ios_t *s)
949
949
write_int32 (s , 0 );
950
950
}
951
951
952
+ // "magic" string and version header of .ji file
953
+ const int JI_FORMAT_VERSION = 0 ;
954
+ const char JI_MAGIC [] = "juliaimage\r\n" ;
955
+ static void jl_serialize_header (ios_t * s )
956
+ {
957
+ ios_write (s , JI_MAGIC , strlen (JI_MAGIC ));
958
+ write_uint16 (s , JI_FORMAT_VERSION );
959
+ }
960
+
952
961
// --- deserialize ---
953
962
954
963
static jl_fptr_t jl_deserialize_fptr (ios_t * s )
@@ -1525,6 +1534,17 @@ int jl_deserialize_verify_mod_list(ios_t *s)
1525
1534
}
1526
1535
}
1527
1536
1537
+ static int jl_deserialize_header (ios_t * s )
1538
+ {
1539
+ char magic [32 ];
1540
+ size_t len = strlen (JI_MAGIC );
1541
+ assert (len < 32 );
1542
+ ios_read (s , magic , len );
1543
+ magic [len ] = 0 ;
1544
+ return (!strcmp (magic , JI_MAGIC ) &&
1545
+ read_uint16 (s ) == JI_FORMAT_VERSION );
1546
+ }
1547
+
1528
1548
jl_array_t * jl_module_init_order ;
1529
1549
1530
1550
static void jl_finalize_serializer (ios_t * f ) {
@@ -1892,6 +1912,7 @@ DLLEXPORT int jl_save_incremental(const char *fname, jl_array_t *worklist)
1892
1912
return 1 ;
1893
1913
}
1894
1914
serializer_worklist = worklist ;
1915
+ jl_serialize_header (& f );
1895
1916
jl_serialize_mod_list (& f ); // this can throw, keep it early (before any actual initialization)
1896
1917
1897
1918
JL_SIGATOMIC_BEGIN ();
@@ -1933,7 +1954,8 @@ static jl_array_t *_jl_restore_incremental(ios_t *f)
1933
1954
ios_close (f );
1934
1955
return NULL ;
1935
1956
}
1936
- if (!jl_deserialize_verify_mod_list (f )) {
1957
+ if (!jl_deserialize_header (f ) ||
1958
+ !jl_deserialize_verify_mod_list (f )) {
1937
1959
ios_close (f );
1938
1960
return NULL ;
1939
1961
}
0 commit comments