mirror of
https://github.com/RustPython/RustPython.git
synced 2026-10-28 18:59:04 +08:00
Fix _ctypes.Array base and metaclass (#5620)
This commit is contained in:
1 parent
f27c1f7ea3
commit
cd89aa51f0
6 files changed
+30
-15
No files matched your search
@@ -3,12 +3,15 @@ import types as _types
|
||||
|
||||
from _ctypes import RTLD_LOCAL, RTLD_GLOBAL
|
||||
from _ctypes import sizeof
|
||||
from _ctypes import _SimpleCData
|
||||
from _ctypes import _SimpleCData, Array
|
||||
from _ctypes import CFuncPtr as _CFuncPtr
|
||||
|
||||
from struct import calcsize as _calcsize
|
||||
|
||||
|
||||
assert Array.__class__.__name__ == 'PyCArrayType'
|
||||
assert Array.__base__.__name__ == '_CData'
|
||||
|
||||
DEFAULT_MODE = RTLD_LOCAL
|
||||
if _os.name == "posix" and _sys.platform == "darwin":
|
||||
# On OS X 10.3, we use RTLD_GLOBAL as default mode
|
||||
@@ -10,16 +10,16 @@ pub(crate) mod union;
|
||||
|
||||
use crate::builtins::PyModule;
|
||||
use crate::class::PyClassImpl;
|
||||
use crate::stdlib::ctypes::base::{PyCData, PyCSimple, PySimpleMeta};
|
||||
use crate::stdlib::ctypes::base::{PyCData, PyCSimple, PyCSimpleType};
|
||||
use crate::{Py, PyRef, VirtualMachine};
|
||||
|
||||
pub fn extend_module_nodes(vm: &VirtualMachine, module: &Py<PyModule>) {
|
||||
let ctx = &vm.ctx;
|
||||
PySimpleMeta::make_class(ctx);
|
||||
PyCSimpleType::make_class(ctx);
|
||||
array::PyCArrayType::make_class(ctx);
|
||||
extend_module!(vm, module, {
|
||||
"_CData" => PyCData::make_class(ctx),
|
||||
"_SimpleCData" => PyCSimple::make_class(ctx),
|
||||
"ArrayType" => array::PyCArrayType::make_class(ctx),
|
||||
"Array" => array::PyCArray::make_class(ctx),
|
||||
"CFuncPtr" => function::PyCFuncPtr::make_class(ctx),
|
||||
"_Pointer" => pointer::PyCPointer::make_class(ctx),
|
||||
|
||||
@@ -1,13 +1,16 @@
|
||||
use crate::builtins::PyBytes;
|
||||
use crate::types::Callable;
|
||||
use crate::{Py, PyObjectRef, PyPayload};
|
||||
use crate::{PyResult, VirtualMachine, builtins::PyTypeRef, types::Constructor};
|
||||
use crate::{
|
||||
PyResult, VirtualMachine,
|
||||
builtins::{PyType, PyTypeRef},
|
||||
types::Constructor,
|
||||
};
|
||||
use crossbeam_utils::atomic::AtomicCell;
|
||||
use rustpython_common::lock::PyRwLock;
|
||||
use rustpython_vm::stdlib::ctypes::base::PyCSimple;
|
||||
use rustpython_vm::stdlib::ctypes::base::PyCData;
|
||||
|
||||
// TODO: make it metaclass
|
||||
#[pyclass(name = "ArrayType", module = "_ctypes")]
|
||||
#[pyclass(name = "PyCArrayType", base = "PyType", module = "_ctypes")]
|
||||
#[derive(PyPayload)]
|
||||
pub struct PyCArrayType {
|
||||
pub(super) inner: PyCArray,
|
||||
@@ -44,7 +47,12 @@ impl Constructor for PyCArrayType {
|
||||
#[pyclass(flags(IMMUTABLETYPE), with(Callable, Constructor))]
|
||||
impl PyCArrayType {}
|
||||
|
||||
#[pyclass(name = "Array", base = "PyCSimple", module = "_ctypes")]
|
||||
#[pyclass(
|
||||
name = "Array",
|
||||
base = "PyCData",
|
||||
metaclass = "PyCArrayType",
|
||||
module = "_ctypes"
|
||||
)]
|
||||
#[derive(PyPayload)]
|
||||
pub struct PyCArray {
|
||||
pub(super) typ: PyRwLock<PyTypeRef>,
|
||||
|
||||
@@ -160,10 +160,10 @@ pub struct PyCData {
|
||||
impl PyCData {}
|
||||
|
||||
#[pyclass(module = "_ctypes", name = "PyCSimpleType", base = "PyType")]
|
||||
pub struct PySimpleMeta {}
|
||||
pub struct PyCSimpleType {}
|
||||
|
||||
#[pyclass(flags(BASETYPE))]
|
||||
impl PySimpleMeta {
|
||||
impl PyCSimpleType {
|
||||
#[allow(clippy::new_ret_no_self)]
|
||||
#[pymethod]
|
||||
fn new(cls: PyTypeRef, _: OptionalArg, vm: &VirtualMachine) -> PyResult {
|
||||
@@ -176,10 +176,10 @@ impl PySimpleMeta {
|
||||
}
|
||||
|
||||
#[pyclass(
|
||||
module = "_ctypes",
|
||||
name = "_SimpleCData",
|
||||
base = "PyCData",
|
||||
module = "_ctypes",
|
||||
metaclass = "PySimpleMeta"
|
||||
metaclass = "PyCSimpleType"
|
||||
)]
|
||||
#[derive(PyPayload)]
|
||||
pub struct PyCSimple {
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
use super::base::PyCData;
|
||||
use crate::builtins::{PyList, PyStr, PyTuple, PyTypeRef};
|
||||
use crate::function::FuncArgs;
|
||||
use crate::types::GetAttr;
|
||||
@@ -7,7 +8,7 @@ use rustpython_vm::types::Constructor;
|
||||
use std::collections::HashMap;
|
||||
use std::fmt::Debug;
|
||||
|
||||
#[pyclass(name = "Structure", module = "_ctypes")]
|
||||
#[pyclass(module = "_ctypes", name = "Structure", base = "PyCData")]
|
||||
#[derive(PyPayload, Debug)]
|
||||
pub struct PyCStructure {
|
||||
#[allow(dead_code)]
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
#[pyclass(name = "Union", module = "_ctypes")]
|
||||
use super::base::PyCData;
|
||||
|
||||
// TODO: metaclass = "UnionType"
|
||||
#[pyclass(module = "_ctypes", name = "Union", base = "PyCData")]
|
||||
pub struct PyCUnion {}
|
||||
|
||||
#[pyclass(flags(BASETYPE, IMMUTABLETYPE))]
|
||||
|
||||
Reference in new issue
Block a user