1
1
use std:: cell:: RefCell ;
2
2
use std:: fmt;
3
- use std:: path:: PathBuf ;
4
3
use std:: rc:: Rc ;
5
4
6
5
use num_bigint:: BigInt ;
@@ -9,7 +8,6 @@ use rustpython_parser::ast;
9
8
10
9
use crate :: builtins;
11
10
use crate :: bytecode;
12
- use crate :: import:: { import, import_module} ;
13
11
use crate :: obj:: objbool;
14
12
use crate :: obj:: objbuiltinfunc:: PyBuiltinFunction ;
15
13
use crate :: obj:: objcode;
@@ -22,8 +20,8 @@ use crate::obj::objslice::PySlice;
22
20
use crate :: obj:: objstr;
23
21
use crate :: obj:: objtype;
24
22
use crate :: pyobject:: {
25
- DictProtocol , IdProtocol , PyContext , PyFuncArgs , PyObject , PyObjectPayload , PyObjectPayload2 ,
26
- PyObjectRef , PyResult , TryFromObject , TypeProtocol ,
23
+ AttributeProtocol , DictProtocol , IdProtocol , PyContext , PyFuncArgs , PyObject , PyObjectPayload ,
24
+ PyObjectPayload2 , PyObjectRef , PyResult , TryFromObject , TypeProtocol ,
27
25
} ;
28
26
use crate :: vm:: VirtualMachine ;
29
27
@@ -815,30 +813,39 @@ impl Frame {
815
813
module : & str ,
816
814
symbol : & Option < String > ,
817
815
) -> FrameResult {
818
- let current_path = {
819
- let mut source_pathbuf = PathBuf :: from ( & self . code . source_path ) ;
820
- source_pathbuf . pop ( ) ;
821
- source_pathbuf
816
+ let import = vm . builtins . get_item ( "__import__" ) ;
817
+ let module = match import {
818
+ Some ( func ) => vm . invoke ( func , vec ! [ vm . ctx . new_str ( module . to_string ( ) ) ] ) ? ,
819
+ None => panic ! ( "No __import__ in builtins" ) ,
822
820
} ;
823
821
824
- let obj = import ( vm, current_path, module, symbol) ?;
822
+ // If we're importing a symbol, look it up and use it, otherwise construct a module and return
823
+ // that
824
+ let obj = match symbol {
825
+ Some ( symbol) => module. get_attr ( symbol) . map_or_else (
826
+ || {
827
+ let import_error = vm. context ( ) . exceptions . import_error . clone ( ) ;
828
+ Err ( vm. new_exception ( import_error, format ! ( "cannot import name '{}'" , symbol) ) )
829
+ } ,
830
+ Ok ,
831
+ ) ,
832
+ None => Ok ( module) ,
833
+ } ;
825
834
826
835
// Push module on stack:
827
- self . push_value ( obj) ;
836
+ self . push_value ( obj? ) ;
828
837
Ok ( None )
829
838
}
830
839
831
840
fn import_star ( & self , vm : & mut VirtualMachine , module : & str ) -> FrameResult {
832
- let current_path = {
833
- let mut source_pathbuf = PathBuf :: from ( & self . code . source_path ) ;
834
- source_pathbuf . pop ( ) ;
835
- source_pathbuf
841
+ let import = vm . builtins . get_item ( "__import__" ) ;
842
+ let module = match import {
843
+ Some ( func ) => vm . invoke ( func , vec ! [ vm . ctx . new_str ( module . to_string ( ) ) ] ) ? ,
844
+ None => panic ! ( "No __import__ in builtins" ) ,
836
845
} ;
837
846
838
847
// Grab all the names from the module and put them in the context
839
- let obj = import_module ( vm, current_path, module) ?;
840
-
841
- for ( k, v) in obj. get_key_value_pairs ( ) . iter ( ) {
848
+ for ( k, v) in module. get_key_value_pairs ( ) . iter ( ) {
842
849
self . scope . store_name ( & vm, & objstr:: get_value ( k) , v. clone ( ) ) ;
843
850
}
844
851
Ok ( None )
0 commit comments