Skip to content

Commit ce13fc5

Browse files
authored
Merge pull request RustPython#4898 from youknowone/pymodule-expose
module objects' type as PyModule
2 parents c16f813 + 1922450 commit ce13fc5

30 files changed

+95
-88
lines changed

Diff for: compiler/ast/asdl_rs.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,7 @@ class ExtendModuleVisitor(EmitVisitor):
474474
def visitModule(self, mod):
475475
depth = 0
476476
self.emit(
477-
"pub fn extend_module_nodes(vm: &VirtualMachine, module: &PyObject) {",
477+
"pub fn extend_module_nodes(vm: &VirtualMachine, module: &Py<PyModule>) {",
478478
depth,
479479
)
480480
self.emit("extend_module!(vm, module, {", depth + 1)

Diff for: derive-impl/src/pymodule.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ pub fn impl_pymodule(attr: AttributeArgs, module_item: Item) -> Result<TokenStre
114114
parse_quote! {
115115
pub(crate) fn extend_module(
116116
vm: &::rustpython_vm::VirtualMachine,
117-
module: &::rustpython_vm::PyObject,
117+
module: &::rustpython_vm::Py<::rustpython_vm::builtins::PyModule>,
118118
) {
119119
#module_extend_items
120120
}
@@ -123,7 +123,7 @@ pub fn impl_pymodule(attr: AttributeArgs, module_item: Item) -> Result<TokenStre
123123
#[allow(dead_code)]
124124
pub(crate) fn make_module(
125125
vm: &::rustpython_vm::VirtualMachine
126-
) -> ::rustpython_vm::PyObjectRef {
126+
) -> ::rustpython_vm::PyRef<::rustpython_vm::builtins::PyModule> {
127127
let module = vm.new_module(MODULE_NAME, vm.ctx.new_dict(), DOC);
128128
extend_module(vm, &module);
129129
module

Diff for: src/lib.rs

+2-5
Original file line numberDiff line numberDiff line change
@@ -99,15 +99,12 @@ fn setup_main_module(vm: &VirtualMachine) -> PyResult<Scope> {
9999
let main_module = vm.new_module("__main__", scope.globals.clone(), None);
100100
main_module
101101
.dict()
102-
.and_then(|d| {
103-
d.set_item("__annotations__", vm.ctx.new_dict().into(), vm)
104-
.ok()
105-
})
102+
.set_item("__annotations__", vm.ctx.new_dict().into(), vm)
106103
.expect("Failed to initialize __main__.__annotations__");
107104

108105
vm.sys_module
109106
.get_attr("modules", vm)?
110-
.set_item("__main__", main_module, vm)?;
107+
.set_item("__main__", main_module.into(), vm)?;
111108

112109
Ok(scope)
113110
}

Diff for: stdlib/src/array.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// spell-checker:ignore typecode tofile tolist fromfile
22

3-
use rustpython_vm::{PyObjectRef, VirtualMachine};
3+
use rustpython_vm::{builtins::PyModule, PyRef, VirtualMachine};
44

5-
pub(crate) fn make_module(vm: &VirtualMachine) -> PyObjectRef {
5+
pub(crate) fn make_module(vm: &VirtualMachine) -> PyRef<PyModule> {
66
let module = array::make_module(vm);
77

88
let array = module

Diff for: stdlib/src/pyexpat.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
*
44
*/
55

6-
use crate::vm::{extend_module, PyObjectRef, VirtualMachine};
6+
use crate::vm::{builtins::PyModule, extend_module, PyRef, VirtualMachine};
77

8-
pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {
8+
pub fn make_module(vm: &VirtualMachine) -> PyRef<PyModule> {
99
let module = _pyexpat::make_module(vm);
1010

11-
extend_module!(vm, module, {
11+
extend_module!(vm, &module, {
1212
"errors" => _errors::make_module(vm),
1313
"model" => _model::make_module(vm),
1414
});

Diff for: stdlib/src/select.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
use crate::vm::{
2-
builtins::PyListRef, PyObject, PyObjectRef, PyResult, TryFromObject, VirtualMachine,
2+
builtins::PyListRef, builtins::PyModule, PyObject, PyObjectRef, PyRef, PyResult, TryFromObject,
3+
VirtualMachine,
34
};
45
use std::{io, mem};
56

6-
pub(crate) fn make_module(vm: &VirtualMachine) -> PyObjectRef {
7+
pub(crate) fn make_module(vm: &VirtualMachine) -> PyRef<PyModule> {
78
#[cfg(windows)]
89
crate::vm::stdlib::nt::init_winsock();
910

Diff for: stdlib/src/socket.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
use crate::vm::{PyObjectRef, VirtualMachine};
1+
use crate::vm::{builtins::PyModule, PyRef, VirtualMachine};
22
#[cfg(feature = "ssl")]
33
pub(super) use _socket::{sock_select, timeout_error_msg, PySocket, SelectKind};
44

5-
pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {
5+
pub fn make_module(vm: &VirtualMachine) -> PyRef<PyModule> {
66
#[cfg(windows)]
77
crate::vm::stdlib::nt::init_winsock();
88
_socket::make_module(vm)

Diff for: stdlib/src/sqlite.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88
// spell-checker:ignore cantlock commithook foreignkey notnull primarykey gettemppath autoindex convpath
99
// spell-checker:ignore dbmoved vnode nbytes
1010

11-
use rustpython_vm::{PyObjectRef, VirtualMachine};
11+
use rustpython_vm::{builtins::PyModule, AsObject, PyRef, VirtualMachine};
1212

1313
// pub(crate) use _sqlite::make_module;
14-
pub(crate) fn make_module(vm: &VirtualMachine) -> PyObjectRef {
14+
pub(crate) fn make_module(vm: &VirtualMachine) -> PyRef<PyModule> {
1515
// TODO: sqlite version check
1616
let module = _sqlite::make_module(vm);
17-
_sqlite::setup_module(&module, vm);
17+
_sqlite::setup_module(module.as_object(), vm);
1818
module
1919
}
2020

Diff for: stdlib/src/ssl.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
use crate::vm::{PyObjectRef, VirtualMachine};
1+
use crate::vm::{builtins::PyModule, PyRef, VirtualMachine};
22

3-
pub(crate) fn make_module(vm: &VirtualMachine) -> PyObjectRef {
3+
pub(crate) fn make_module(vm: &VirtualMachine) -> PyRef<PyModule> {
44
// if openssl is vendored, it doesn't know the locations of system certificates
55
#[cfg(feature = "ssl-vendor")]
66
if let None | Some("0") = option_env!("OPENSSL_NO_VENDOR") {

Diff for: stdlib/src/unicodedata.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
// spell-checker:ignore nfkc unistr unidata
66

77
use crate::vm::{
8-
builtins::PyStr, convert::TryFromBorrowedObject, PyObject, PyObjectRef, PyPayload, PyResult,
9-
VirtualMachine,
8+
builtins::PyModule, builtins::PyStr, convert::TryFromBorrowedObject, PyObject, PyObjectRef,
9+
PyPayload, PyRef, PyResult, VirtualMachine,
1010
};
1111

12-
pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {
12+
pub fn make_module(vm: &VirtualMachine) -> PyRef<PyModule> {
1313
let module = unicodedata::make_module(vm);
1414

1515
let ucd: PyObjectRef = unicodedata::Ucd::new(unic_ucd_age::UNICODE_VERSION)

Diff for: vm/src/import.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ pub fn make_frozen(vm: &VirtualMachine, name: &str) -> PyResult<PyRef<PyCode>> {
8585
pub fn import_frozen(vm: &VirtualMachine, module_name: &str) -> PyResult {
8686
let frozen = make_frozen(vm, module_name)?;
8787
let module = import_codeobj(vm, module_name, frozen, false)?;
88+
debug_assert!(module.get_attr(identifier!(vm, __name__), vm).is_ok());
8889
// TODO: give a correct origname here
8990
module.set_attr("__origname__", vm.ctx.new_str(module_name.to_owned()), vm)?;
9091
Ok(module)
@@ -99,8 +100,8 @@ pub fn import_builtin(vm: &VirtualMachine, module_name: &str) -> PyResult {
99100
})?;
100101
let module = make_module_func(vm);
101102
let sys_modules = vm.sys_module.get_attr("modules", vm)?;
102-
sys_modules.set_item(module_name, module.clone(), vm)?;
103-
Ok(module)
103+
sys_modules.set_item(module_name, module.as_object().to_owned(), vm)?;
104+
Ok(module.into())
104105
}
105106

106107
#[cfg(feature = "rustpython-compiler")]
@@ -144,12 +145,12 @@ pub fn import_codeobj(
144145

145146
// Store module in cache to prevent infinite loop with mutual importing libs:
146147
let sys_modules = vm.sys_module.get_attr("modules", vm)?;
147-
sys_modules.set_item(module_name, module.clone(), vm)?;
148+
sys_modules.set_item(module_name, module.clone().into(), vm)?;
148149

149150
// Execute main code in module:
150151
let scope = Scope::with_builtins(None, attrs, vm);
151152
vm.run_code_obj(code_obj, scope)?;
152-
Ok(module)
153+
Ok(module.into())
153154
}
154155

155156
fn remove_importlib_frames_inner(

Diff for: vm/src/macros.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
#[macro_export]
22
macro_rules! extend_module {
33
( $vm:expr, $module:expr, { $($name:expr => $value:expr),* $(,)? }) => {{
4-
#[allow(unused_variables)]
5-
let module: &$crate::PyObject = &$module;
64
$(
7-
$vm.__module_set_attr(&module, $name, $value).unwrap();
5+
$vm.__module_set_attr($module, $name, $value).unwrap();
86
)*
97
}};
108
}
@@ -49,8 +47,9 @@ macro_rules! py_namespace {
4947
( $vm:expr, { $($name:expr => $value:expr),* $(,)* }) => {
5048
{
5149
let namespace = $crate::builtins::PyNamespace::new_ref(&$vm.ctx);
50+
let obj = $crate::object::AsObject::as_object(&namespace);
5251
$(
53-
$vm.__module_set_attr($crate::object::AsObject::as_object(&namespace), $name, $value).unwrap();
52+
obj.generic_setattr($vm.ctx.intern_str($name), $crate::function::PySetterValue::Assign($value.into()), $vm).unwrap();
5453
)*
5554
namespace
5655
}

Diff for: vm/src/stdlib/ast.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
mod gen;
77

88
use crate::{
9-
builtins::{self, PyStrRef, PyType},
9+
builtins::{self, PyModule, PyStrRef, PyType},
1010
class::{PyClassImpl, StaticType},
1111
compiler::CompileError,
1212
convert::ToPyException,
13-
AsObject, Context, Py, PyObject, PyObjectRef, PyPayload, PyResult, TryFromObject,
13+
AsObject, Context, Py, PyObject, PyObjectRef, PyPayload, PyRef, PyResult, TryFromObject,
1414
VirtualMachine,
1515
};
1616
use num_complex::Complex64;
@@ -331,7 +331,7 @@ pub(crate) use _ast::AstNode;
331331
// Used by builtins::compile()
332332
pub const PY_COMPILE_FLAG_AST_ONLY: i32 = 0x0400;
333333

334-
pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {
334+
pub fn make_module(vm: &VirtualMachine) -> PyRef<PyModule> {
335335
let module = _ast::make_module(vm);
336336
gen::extend_module_nodes(vm, &module);
337337
module

Diff for: vm/src/stdlib/ast/gen.rs

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: vm/src/stdlib/builtins.rs

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
//! Builtin function definitions.
22
//!
33
//! Implements the list of [builtin Python functions](https://docs.python.org/3/library/builtins.html).
4-
use crate::{class::PyClassImpl, PyObjectRef, VirtualMachine};
4+
use crate::{builtins::PyModule, class::PyClassImpl, Py, VirtualMachine};
5+
pub use builtins::{ascii, print};
56

67
#[pymodule]
78
mod builtins {
@@ -933,14 +934,12 @@ mod builtins {
933934
}
934935
}
935936

936-
pub use builtins::{ascii, print};
937-
938-
pub fn make_module(vm: &VirtualMachine, module: PyObjectRef) {
937+
pub fn init_module(vm: &VirtualMachine, module: &Py<PyModule>) {
939938
let ctx = &vm.ctx;
940939

941940
crate::protocol::VecBuffer::make_class(&vm.ctx);
942941

943-
builtins::extend_module(vm, &module);
942+
builtins::extend_module(vm, module);
944943

945944
let debug_mode: bool = vm.state.settings.optimize == 0;
946945
extend_module!(vm, module, {

Diff for: vm/src/stdlib/errno.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
use crate::PyObjectRef;
2-
use crate::VirtualMachine;
1+
use crate::{builtins::PyModule, PyRef, VirtualMachine};
32

43
#[pymodule]
54
mod errno {}
65

7-
pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {
6+
pub fn make_module(vm: &VirtualMachine) -> PyRef<PyModule> {
87
let module = errno::make_module(vm);
98
let errorcode = vm.ctx.new_dict();
10-
extend_module!(vm, module, {
9+
extend_module!(vm, &module, {
1110
"errorcode" => errorcode.clone(),
1211
});
1312
for (name, code) in ERROR_CODES {

Diff for: vm/src/stdlib/imp.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
use crate::bytecode::frozen_lib::FrozenModule;
2-
use crate::{builtins::PyBaseExceptionRef, PyObjectRef, VirtualMachine};
2+
use crate::{
3+
builtins::{PyBaseExceptionRef, PyModule},
4+
PyRef, VirtualMachine,
5+
};
36

4-
pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {
7+
pub fn make_module(vm: &VirtualMachine) -> PyRef<PyModule> {
58
let module = _imp::make_module(vm);
69
lock::extend_module(vm, &module);
710
module
@@ -120,7 +123,7 @@ mod _imp {
120123
if let Ok(module) = sys_modules.get_item(&*name, vm) {
121124
Ok(module)
122125
} else if let Some(make_module_func) = vm.state.module_inits.get(name.as_str()) {
123-
Ok(make_module_func(vm))
126+
Ok(make_module_func(vm).into())
124127
} else {
125128
Ok(vm.ctx.none())
126129
}

Diff for: vm/src/stdlib/io.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ cfg_if::cfg_if! {
1111

1212
use crate::{
1313
builtins::PyBaseExceptionRef,
14+
builtins::PyModule,
1415
convert::{IntoPyException, ToPyException, ToPyObject},
15-
PyObjectRef, PyResult, TryFromObject, VirtualMachine,
16+
PyObjectRef, PyRef, PyResult, TryFromObject, VirtualMachine,
1617
};
1718
pub use _io::io_open as open;
1819

@@ -44,7 +45,7 @@ impl IntoPyException for std::io::Error {
4445
}
4546
}
4647

47-
pub(crate) fn make_module(vm: &VirtualMachine) -> PyObjectRef {
48+
pub(crate) fn make_module(vm: &VirtualMachine) -> PyRef<PyModule> {
4849
let ctx = &vm.ctx;
4950

5051
let module = _io::make_module(vm);
@@ -55,7 +56,7 @@ pub(crate) fn make_module(vm: &VirtualMachine) -> PyObjectRef {
5556
let unsupported_operation = _io::UNSUPPORTED_OPERATION
5657
.get_or_init(|| _io::make_unsupportedop(ctx))
5758
.clone();
58-
extend_module!(vm, module, {
59+
extend_module!(vm, &module, {
5960
"UnsupportedOperation" => unsupported_operation,
6061
"BlockingIOError" => ctx.exceptions.blocking_io_error.to_owned(),
6162
});

Diff for: vm/src/stdlib/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,10 @@ mod winapi;
4848
#[cfg(windows)]
4949
mod winreg;
5050

51-
use crate::{PyObjectRef, VirtualMachine};
51+
use crate::{builtins::PyModule, PyRef, VirtualMachine};
5252
use std::{borrow::Cow, collections::HashMap};
5353

54-
pub type StdlibInitFunc = Box<py_dyn_fn!(dyn Fn(&VirtualMachine) -> PyObjectRef)>;
54+
pub type StdlibInitFunc = Box<py_dyn_fn!(dyn Fn(&VirtualMachine) -> PyRef<PyModule>)>;
5555
pub type StdlibMap = HashMap<Cow<'static, str>, StdlibInitFunc, ahash::RandomState>;
5656

5757
pub fn get_module_inits() -> StdlibMap {

Diff for: vm/src/stdlib/nt.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
use crate::{PyObjectRef, VirtualMachine};
1+
use crate::{builtins::PyModule, PyRef, VirtualMachine};
22

33
pub use module::raw_set_handle_inheritable;
44

5-
pub(crate) fn make_module(vm: &VirtualMachine) -> PyObjectRef {
5+
pub(crate) fn make_module(vm: &VirtualMachine) -> PyRef<PyModule> {
66
let module = module::make_module(vm);
77
super::os::extend_module(vm, &module);
88
module

Diff for: vm/src/stdlib/os.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
use crate::{
2-
builtins::{PyBaseExceptionRef, PySet},
2+
builtins::{PyBaseExceptionRef, PyModule, PySet},
33
common::crt_fd::Fd,
44
convert::IntoPyException,
55
function::{ArgumentError, FromArgs, FsPath, FuncArgs},
6-
AsObject, PyObject, PyObjectRef, PyPayload, PyResult, TryFromObject, VirtualMachine,
6+
AsObject, Py, PyObjectRef, PyPayload, PyResult, TryFromObject, VirtualMachine,
77
};
88
use std::{
99
ffi, fs, io,
@@ -1709,7 +1709,7 @@ impl SupportFunc {
17091709
}
17101710
}
17111711

1712-
pub fn extend_module(vm: &VirtualMachine, module: &PyObject) {
1712+
pub fn extend_module(vm: &VirtualMachine, module: &Py<PyModule>) {
17131713
_os::extend_module(vm, module);
17141714

17151715
let support_funcs = _os::support_funcs();

Diff for: vm/src/stdlib/posix.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::{PyObjectRef, VirtualMachine};
1+
use crate::{builtins::PyModule, PyRef, VirtualMachine};
22
use std::os::unix::io::RawFd;
33

44
pub fn raw_set_inheritable(fd: RawFd, inheritable: bool) -> nix::Result<()> {
@@ -12,7 +12,7 @@ pub fn raw_set_inheritable(fd: RawFd, inheritable: bool) -> nix::Result<()> {
1212
Ok(())
1313
}
1414

15-
pub(crate) fn make_module(vm: &VirtualMachine) -> PyObjectRef {
15+
pub(crate) fn make_module(vm: &VirtualMachine) -> PyRef<PyModule> {
1616
let module = module::make_module(vm);
1717
super::os::extend_module(vm, &module);
1818
module

Diff for: vm/src/stdlib/posix_compat.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
//! `posix` compatible module for `not(any(unix, windows))`
22
3-
use crate::{PyObjectRef, VirtualMachine};
3+
use crate::{builtins::PyModule, PyObjectRef, PyRef, VirtualMachine};
44

5-
pub(crate) fn make_module(vm: &VirtualMachine) -> PyObjectRef {
5+
pub(crate) fn make_module(vm: &VirtualMachine) -> PyRef<PyModule> {
66
let module = module::make_module(vm);
77
super::os::extend_module(vm, &module);
88
module

0 commit comments

Comments
 (0)