mirror of
https://github.com/RustPython/RustPython.git
synced 2026-10-28 18:59:04 +08:00
Merge pull request #1021 from mkurnikov/speed-up-file-open
Get io reader/writer classes only when needed
This commit is contained in:
1 file changed
+22
-17
+22
-17
@@ -365,29 +365,33 @@ pub fn io_open(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
|
||||
}
|
||||
};
|
||||
|
||||
let module = import::import_module(vm, PathBuf::default(), "io").unwrap();
|
||||
|
||||
// Class objects (potentially) consumed by io.open
|
||||
// RawIO: FileIO
|
||||
// Buffered: BufferedWriter, BufferedReader
|
||||
// Text: TextIOWrapper
|
||||
let file_io_class = vm.get_attribute(module.clone(), "FileIO").unwrap();
|
||||
let buffered_writer_class = vm.get_attribute(module.clone(), "BufferedWriter").unwrap();
|
||||
let buffered_reader_class = vm.get_attribute(module.clone(), "BufferedReader").unwrap();
|
||||
let text_io_wrapper_class = vm.get_attribute(module, "TextIOWrapper").unwrap();
|
||||
let io_module = import::import_module(vm, PathBuf::default(), "io").unwrap();
|
||||
|
||||
// Construct a FileIO (subclass of RawIOBase)
|
||||
// This is subsequently consumed by a Buffered Class.
|
||||
let file_args = vec![file.clone(), vm.ctx.new_str(mode.clone())];
|
||||
let file_io_obj = vm.invoke(file_io_class, file_args)?;
|
||||
let file_io_class = vm.get_attribute(io_module.clone(), "FileIO").unwrap();
|
||||
let file_io_obj = vm.invoke(
|
||||
file_io_class,
|
||||
vec![file.clone(), vm.ctx.new_str(mode.clone())],
|
||||
)?;
|
||||
|
||||
// Create Buffered class to consume FileIO. The type of buffered class depends on
|
||||
// the operation in the mode.
|
||||
// There are 3 possible classes here, each inheriting from the RawBaseIO
|
||||
// creating || writing || appending => BufferedWriter
|
||||
let buffered = match mode.chars().next().unwrap() {
|
||||
'w' => vm.invoke(buffered_writer_class, vec![file_io_obj.clone()]),
|
||||
'r' => vm.invoke(buffered_reader_class, vec![file_io_obj.clone()]),
|
||||
'w' => {
|
||||
let buffered_writer_class = vm
|
||||
.get_attribute(io_module.clone(), "BufferedWriter")
|
||||
.unwrap();
|
||||
vm.invoke(buffered_writer_class, vec![file_io_obj.clone()])
|
||||
}
|
||||
'r' => {
|
||||
let buffered_reader_class = vm
|
||||
.get_attribute(io_module.clone(), "BufferedReader")
|
||||
.unwrap();
|
||||
vm.invoke(buffered_reader_class, vec![file_io_obj.clone()])
|
||||
}
|
||||
//TODO: updating => PyBufferedRandom
|
||||
_ => unimplemented!("'a' mode is not yet implemented"),
|
||||
};
|
||||
@@ -395,13 +399,14 @@ pub fn io_open(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
|
||||
let io_obj = match typ.chars().next().unwrap() {
|
||||
// If the mode is text this buffer type is consumed on construction of
|
||||
// a TextIOWrapper which is subsequently returned.
|
||||
't' => vm.invoke(text_io_wrapper_class, vec![buffered.unwrap()]),
|
||||
|
||||
't' => {
|
||||
let text_io_wrapper_class = vm.get_attribute(io_module, "TextIOWrapper").unwrap();
|
||||
vm.invoke(text_io_wrapper_class, vec![buffered.unwrap()])
|
||||
}
|
||||
// If the mode is binary this Buffered class is returned directly at
|
||||
// this point.
|
||||
// For Buffered class construct "raw" IO class e.g. FileIO and pass this into corresponding field
|
||||
'b' => buffered,
|
||||
|
||||
_ => unreachable!(),
|
||||
};
|
||||
io_obj
|
||||
|
||||
Reference in new issue
Block a user