@@ -1423,17 +1423,31 @@ int jl_deserialize_verify_mod_list(ios_t *s)
1423
1423
ios_read (s , name , len );
1424
1424
name [len ] = '\0' ;
1425
1425
uint64_t uuid = read_uint64 (s );
1426
- jl_module_t * m = (jl_module_t * )jl_get_global (jl_main_module , jl_symbol (name ));
1426
+ jl_sym_t * sym = jl_symbol (name );
1427
+ jl_module_t * m = (jl_module_t * )jl_get_global (jl_main_module , sym );
1427
1428
if (!m ) {
1428
- jl_printf (JL_STDERR , "error: Module %s must be loaded first\n" , name );
1429
+ static jl_value_t * require_func = NULL ;
1430
+ if (!require_func )
1431
+ require_func = jl_get_global (jl_base_module , jl_symbol ("require" ));
1432
+ JL_TRY {
1433
+ jl_apply ((jl_function_t * )require_func , (jl_value_t * * )& sym , 1 );
1434
+ }
1435
+ JL_CATCH {
1436
+ ios_close (s );
1437
+ jl_rethrow ();
1438
+ }
1439
+ m = (jl_module_t * )jl_get_global (jl_main_module , sym );
1440
+ }
1441
+ if (!m ) {
1442
+ jl_printf (JL_STDERR , "error: requiring \"%s\" did not define a corresponding module\n" , name );
1429
1443
return 0 ;
1430
1444
}
1431
1445
if (!jl_is_module (m )) {
1432
1446
ios_close (s );
1433
- jl_errorf ("typeassert: expected %s::Module " , name );
1447
+ jl_errorf ("invalid module path (%s does not name a module) " , name );
1434
1448
}
1435
1449
if (m -> uuid != uuid ) {
1436
- jl_printf (JL_STDERR , "error : Module %s uuid did not match cache file\n" , name );
1450
+ jl_printf (JL_STDERR , "warning : Module %s uuid did not match cache file\n" , name );
1437
1451
return 0 ;
1438
1452
}
1439
1453
}
@@ -1790,19 +1804,14 @@ DLLEXPORT int jl_save_new_module(const char *fname, jl_module_t *mod)
1790
1804
jl_function_t * jl_method_cache_insert (jl_methtable_t * mt , jl_tupletype_t * type ,
1791
1805
jl_function_t * method );
1792
1806
1793
- DLLEXPORT jl_module_t * jl_restore_new_module ( const char * fname )
1807
+ static jl_module_t * _jl_restore_new_module ( ios_t * f )
1794
1808
{
1795
- ios_t f ;
1796
- if (ios_file (& f , fname , 1 , 0 , 0 , 0 ) == NULL ) {
1797
- jl_printf (JL_STDERR , "Cache file \"%s\" not found\n" , fname );
1809
+ if (ios_eof (f )) {
1810
+ ios_close (f );
1798
1811
return NULL ;
1799
1812
}
1800
- if (ios_eof (& f )) {
1801
- ios_close (& f );
1802
- return NULL ;
1803
- }
1804
- if (!jl_deserialize_verify_mod_list (& f )) {
1805
- ios_close (& f );
1813
+ if (!jl_deserialize_verify_mod_list (f )) {
1814
+ ios_close (f );
1806
1815
return NULL ;
1807
1816
}
1808
1817
arraylist_new (& backref_list , 4000 );
@@ -1813,14 +1822,14 @@ DLLEXPORT jl_module_t *jl_restore_new_module(const char *fname)
1813
1822
int en = jl_gc_enable (0 );
1814
1823
DUMP_MODES last_mode = mode ;
1815
1824
mode = MODE_MODULE ;
1816
- jl_module_t * parent = (jl_module_t * )jl_deserialize_value (& f , NULL );
1817
- jl_sym_t * name = (jl_sym_t * )jl_deserialize_value (& f , NULL );
1825
+ jl_module_t * parent = (jl_module_t * )jl_deserialize_value (f , NULL );
1826
+ jl_sym_t * name = (jl_sym_t * )jl_deserialize_value (f , NULL );
1818
1827
jl_binding_t * b = jl_get_binding_wr (parent , name );
1819
1828
jl_declare_constant (b );
1820
1829
if (b -> value != NULL ) {
1821
1830
jl_printf (JL_STDERR , "Warning: replacing module %s\n" , name -> name );
1822
1831
}
1823
- b -> value = jl_deserialize_value (& f , & b -> value );
1832
+ b -> value = jl_deserialize_value (f , & b -> value );
1824
1833
1825
1834
size_t i = 0 ;
1826
1835
while (i < flagref_list .len ) {
@@ -1882,9 +1891,9 @@ DLLEXPORT jl_module_t *jl_restore_new_module(const char *fname)
1882
1891
}
1883
1892
1884
1893
mode = MODE_MODULE_LAMBDAS ;
1885
- jl_deserialize_lambdas_from_mod (& f );
1894
+ jl_deserialize_lambdas_from_mod (f );
1886
1895
1887
- jl_module_init_order = (jl_array_t * )jl_deserialize_value (& f , NULL );
1896
+ jl_module_init_order = (jl_array_t * )jl_deserialize_value (f , NULL );
1888
1897
1889
1898
for (i = 0 ; i < methtable_list .len ; i ++ ) {
1890
1899
jl_methtable_t * mt = (jl_methtable_t * )methtable_list .items [i ];
@@ -1921,13 +1930,30 @@ DLLEXPORT jl_module_t *jl_restore_new_module(const char *fname)
1921
1930
arraylist_free (& flagref_list );
1922
1931
arraylist_free (& methtable_list );
1923
1932
arraylist_free (& backref_list );
1924
- ios_close (& f );
1933
+ ios_close (f );
1925
1934
1926
1935
jl_init_restored_modules ();
1927
1936
1928
1937
return (jl_module_t * )b -> value ;
1929
1938
}
1930
1939
1940
+ DLLEXPORT jl_module_t * jl_restore_new_module_from_buf (const char * buf , size_t sz )
1941
+ {
1942
+ ios_t f ;
1943
+ ios_static_buffer (& f , (char * )buf , sz );
1944
+ return _jl_restore_new_module (& f );
1945
+ }
1946
+
1947
+ DLLEXPORT jl_module_t * jl_restore_new_module (const char * fname )
1948
+ {
1949
+ ios_t f ;
1950
+ if (ios_file (& f , fname , 1 , 0 , 0 , 0 ) == NULL ) {
1951
+ jl_printf (JL_STDERR , "Cache file \"%s\" not found\n" , fname );
1952
+ return NULL ;
1953
+ }
1954
+ return _jl_restore_new_module (& f );
1955
+ }
1956
+
1931
1957
// --- init ---
1932
1958
1933
1959
void jl_init_serializer (void )
0 commit comments