@@ -7,16 +7,23 @@ use crate::{
7
7
builtins:: { code, code:: CodeObject , list, traceback:: PyTraceback , PyBaseExceptionRef } ,
8
8
scope:: Scope ,
9
9
version:: get_git_revision,
10
- vm:: { InitParameter , VirtualMachine } ,
10
+ vm:: { thread , VirtualMachine } ,
11
11
AsObject , PyObjectRef , PyPayload , PyRef , PyResult , TryFromObject ,
12
12
} ;
13
13
use rand:: Rng ;
14
14
15
15
pub ( crate ) fn init_importlib (
16
16
vm : & mut VirtualMachine ,
17
- initialize_parameter : InitParameter ,
17
+ allow_external_library : bool ,
18
18
) -> PyResult < ( ) > {
19
- use crate :: vm:: thread:: enter_vm;
19
+ let importlib = init_importlib_base ( vm) ?;
20
+ if allow_external_library && cfg ! ( feature = "rustpython-compiler" ) {
21
+ init_importlib_package ( vm, importlib) ?;
22
+ }
23
+ Ok ( ( ) )
24
+ }
25
+
26
+ pub ( crate ) fn init_importlib_base ( vm : & mut VirtualMachine ) -> PyResult < PyObjectRef > {
20
27
flame_guard ! ( "init importlib" ) ;
21
28
22
29
// importlib_bootstrap needs these and it inlines checks to sys.modules before calling into
@@ -26,53 +33,56 @@ pub(crate) fn init_importlib(
26
33
import_builtin ( vm, "_warnings" ) ?;
27
34
import_builtin ( vm, "_weakref" ) ?;
28
35
29
- let importlib = enter_vm ( vm, || {
36
+ let importlib = thread :: enter_vm ( vm, || {
30
37
let importlib = import_frozen ( vm, "_frozen_importlib" ) ?;
31
38
let impmod = import_builtin ( vm, "_imp" ) ?;
32
39
let install = importlib. get_attr ( "_install" , vm) ?;
33
40
vm. invoke ( & install, ( vm. sys_module . clone ( ) , impmod) ) ?;
34
41
Ok ( importlib)
35
42
} ) ?;
36
43
vm. import_func = importlib. get_attr ( "__import__" , vm) ?;
44
+ Ok ( importlib)
45
+ }
37
46
38
- if initialize_parameter == InitParameter :: External && cfg ! ( feature = "rustpython-compiler" ) {
39
- enter_vm ( vm, || {
40
- flame_guard ! ( "install_external" ) ;
41
-
42
- // same deal as imports above
43
- #[ cfg( any( not( target_arch = "wasm32" ) , target_os = "wasi" ) ) ]
44
- import_builtin ( vm, crate :: stdlib:: os:: MODULE_NAME ) ?;
45
- #[ cfg( windows) ]
46
- import_builtin ( vm, "winreg" ) ?;
47
- import_builtin ( vm, "_io" ) ?;
48
- import_builtin ( vm, "marshal" ) ?;
49
-
50
- let install_external = importlib. get_attr ( "_install_external_importers" , vm) ?;
51
- vm. invoke ( & install_external, ( ) ) ?;
52
- // Set pyc magic number to commit hash. Should be changed when bytecode will be more stable.
53
- let importlib_external = vm. import ( "_frozen_importlib_external" , None , 0 ) ?;
54
- let mut magic = get_git_revision ( ) . into_bytes ( ) ;
55
- magic. truncate ( 4 ) ;
56
- if magic. len ( ) != 4 {
57
- magic = rand:: thread_rng ( ) . gen :: < [ u8 ; 4 ] > ( ) . to_vec ( ) ;
58
- }
59
- let magic: PyObjectRef = vm. ctx . new_bytes ( magic) . into ( ) ;
60
- importlib_external. set_attr ( "MAGIC_NUMBER" , magic, vm) ?;
61
- let zipimport_res = ( || -> PyResult < ( ) > {
62
- let zipimport = vm. import ( "zipimport" , None , 0 ) ?;
63
- let zipimporter = zipimport. get_attr ( "zipimporter" , vm) ?;
64
- let path_hooks = vm. sys_module . get_attr ( "path_hooks" , vm) ?;
65
- let path_hooks = list:: PyListRef :: try_from_object ( vm, path_hooks) ?;
66
- path_hooks. insert ( 0 , zipimporter) ;
67
- Ok ( ( ) )
68
- } ) ( ) ;
69
- if zipimport_res. is_err ( ) {
70
- warn ! ( "couldn't init zipimport" )
71
- }
47
+ pub ( crate ) fn init_importlib_package (
48
+ vm : & mut VirtualMachine ,
49
+ importlib : PyObjectRef ,
50
+ ) -> PyResult < ( ) > {
51
+ thread:: enter_vm ( vm, || {
52
+ flame_guard ! ( "install_external" ) ;
53
+
54
+ // same deal as imports above
55
+ #[ cfg( any( not( target_arch = "wasm32" ) , target_os = "wasi" ) ) ]
56
+ import_builtin ( vm, crate :: stdlib:: os:: MODULE_NAME ) ?;
57
+ #[ cfg( windows) ]
58
+ import_builtin ( vm, "winreg" ) ?;
59
+ import_builtin ( vm, "_io" ) ?;
60
+ import_builtin ( vm, "marshal" ) ?;
61
+
62
+ let install_external = importlib. get_attr ( "_install_external_importers" , vm) ?;
63
+ vm. invoke ( & install_external, ( ) ) ?;
64
+ // Set pyc magic number to commit hash. Should be changed when bytecode will be more stable.
65
+ let importlib_external = vm. import ( "_frozen_importlib_external" , None , 0 ) ?;
66
+ let mut magic = get_git_revision ( ) . into_bytes ( ) ;
67
+ magic. truncate ( 4 ) ;
68
+ if magic. len ( ) != 4 {
69
+ magic = rand:: thread_rng ( ) . gen :: < [ u8 ; 4 ] > ( ) . to_vec ( ) ;
70
+ }
71
+ let magic: PyObjectRef = vm. ctx . new_bytes ( magic) . into ( ) ;
72
+ importlib_external. set_attr ( "MAGIC_NUMBER" , magic, vm) ?;
73
+ let zipimport_res = ( || -> PyResult < ( ) > {
74
+ let zipimport = vm. import ( "zipimport" , None , 0 ) ?;
75
+ let zipimporter = zipimport. get_attr ( "zipimporter" , vm) ?;
76
+ let path_hooks = vm. sys_module . get_attr ( "path_hooks" , vm) ?;
77
+ let path_hooks = list:: PyListRef :: try_from_object ( vm, path_hooks) ?;
78
+ path_hooks. insert ( 0 , zipimporter) ;
72
79
Ok ( ( ) )
73
- } ) ?
74
- }
75
- Ok ( ( ) )
80
+ } ) ( ) ;
81
+ if zipimport_res. is_err ( ) {
82
+ warn ! ( "couldn't init zipimport" )
83
+ }
84
+ Ok ( ( ) )
85
+ } )
76
86
}
77
87
78
88
pub fn import_frozen ( vm : & VirtualMachine , module_name : & str ) -> PyResult {
0 commit comments