Skip to content

Commit cd89aa5

Browse files
authored
Fix _ctypes.Array base and metaclass (RustPython#5620)
1 parent f27c1f7 commit cd89aa5

File tree

6 files changed

+30
-15
lines changed

6 files changed

+30
-15
lines changed

extra_tests/snippets/builtins_ctypes.py renamed to extra_tests/snippets/stdlib_ctypes.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33

44
from _ctypes import RTLD_LOCAL, RTLD_GLOBAL
55
from _ctypes import sizeof
6-
from _ctypes import _SimpleCData
6+
from _ctypes import _SimpleCData, Array
77
from _ctypes import CFuncPtr as _CFuncPtr
88

99
from struct import calcsize as _calcsize
1010

1111

12+
assert Array.__class__.__name__ == 'PyCArrayType'
13+
assert Array.__base__.__name__ == '_CData'
14+
1215
DEFAULT_MODE = RTLD_LOCAL
1316
if _os.name == "posix" and _sys.platform == "darwin":
1417
# On OS X 10.3, we use RTLD_GLOBAL as default mode

vm/src/stdlib/ctypes.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@ pub(crate) mod union;
1010

1111
use crate::builtins::PyModule;
1212
use crate::class::PyClassImpl;
13-
use crate::stdlib::ctypes::base::{PyCData, PyCSimple, PySimpleMeta};
13+
use crate::stdlib::ctypes::base::{PyCData, PyCSimple, PyCSimpleType};
1414
use crate::{Py, PyRef, VirtualMachine};
1515

1616
pub fn extend_module_nodes(vm: &VirtualMachine, module: &Py<PyModule>) {
1717
let ctx = &vm.ctx;
18-
PySimpleMeta::make_class(ctx);
18+
PyCSimpleType::make_class(ctx);
19+
array::PyCArrayType::make_class(ctx);
1920
extend_module!(vm, module, {
2021
"_CData" => PyCData::make_class(ctx),
2122
"_SimpleCData" => PyCSimple::make_class(ctx),
22-
"ArrayType" => array::PyCArrayType::make_class(ctx),
2323
"Array" => array::PyCArray::make_class(ctx),
2424
"CFuncPtr" => function::PyCFuncPtr::make_class(ctx),
2525
"_Pointer" => pointer::PyCPointer::make_class(ctx),

vm/src/stdlib/ctypes/array.rs

+13-5
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
use crate::builtins::PyBytes;
22
use crate::types::Callable;
33
use crate::{Py, PyObjectRef, PyPayload};
4-
use crate::{PyResult, VirtualMachine, builtins::PyTypeRef, types::Constructor};
4+
use crate::{
5+
PyResult, VirtualMachine,
6+
builtins::{PyType, PyTypeRef},
7+
types::Constructor,
8+
};
59
use crossbeam_utils::atomic::AtomicCell;
610
use rustpython_common::lock::PyRwLock;
7-
use rustpython_vm::stdlib::ctypes::base::PyCSimple;
11+
use rustpython_vm::stdlib::ctypes::base::PyCData;
812

9-
// TODO: make it metaclass
10-
#[pyclass(name = "ArrayType", module = "_ctypes")]
13+
#[pyclass(name = "PyCArrayType", base = "PyType", module = "_ctypes")]
1114
#[derive(PyPayload)]
1215
pub struct PyCArrayType {
1316
pub(super) inner: PyCArray,
@@ -44,7 +47,12 @@ impl Constructor for PyCArrayType {
4447
#[pyclass(flags(IMMUTABLETYPE), with(Callable, Constructor))]
4548
impl PyCArrayType {}
4649

47-
#[pyclass(name = "Array", base = "PyCSimple", module = "_ctypes")]
50+
#[pyclass(
51+
name = "Array",
52+
base = "PyCData",
53+
metaclass = "PyCArrayType",
54+
module = "_ctypes"
55+
)]
4856
#[derive(PyPayload)]
4957
pub struct PyCArray {
5058
pub(super) typ: PyRwLock<PyTypeRef>,

vm/src/stdlib/ctypes/base.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -160,10 +160,10 @@ pub struct PyCData {
160160
impl PyCData {}
161161

162162
#[pyclass(module = "_ctypes", name = "PyCSimpleType", base = "PyType")]
163-
pub struct PySimpleMeta {}
163+
pub struct PyCSimpleType {}
164164

165165
#[pyclass(flags(BASETYPE))]
166-
impl PySimpleMeta {
166+
impl PyCSimpleType {
167167
#[allow(clippy::new_ret_no_self)]
168168
#[pymethod]
169169
fn new(cls: PyTypeRef, _: OptionalArg, vm: &VirtualMachine) -> PyResult {
@@ -176,10 +176,10 @@ impl PySimpleMeta {
176176
}
177177

178178
#[pyclass(
179+
module = "_ctypes",
179180
name = "_SimpleCData",
180181
base = "PyCData",
181-
module = "_ctypes",
182-
metaclass = "PySimpleMeta"
182+
metaclass = "PyCSimpleType"
183183
)]
184184
#[derive(PyPayload)]
185185
pub struct PyCSimple {

vm/src/stdlib/ctypes/structure.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use super::base::PyCData;
12
use crate::builtins::{PyList, PyStr, PyTuple, PyTypeRef};
23
use crate::function::FuncArgs;
34
use crate::types::GetAttr;
@@ -7,7 +8,7 @@ use rustpython_vm::types::Constructor;
78
use std::collections::HashMap;
89
use std::fmt::Debug;
910

10-
#[pyclass(name = "Structure", module = "_ctypes")]
11+
#[pyclass(module = "_ctypes", name = "Structure", base = "PyCData")]
1112
#[derive(PyPayload, Debug)]
1213
pub struct PyCStructure {
1314
#[allow(dead_code)]

vm/src/stdlib/ctypes/union.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
#[pyclass(name = "Union", module = "_ctypes")]
1+
use super::base::PyCData;
2+
3+
// TODO: metaclass = "UnionType"
4+
#[pyclass(module = "_ctypes", name = "Union", base = "PyCData")]
25
pub struct PyCUnion {}
36

47
#[pyclass(flags(BASETYPE, IMMUTABLETYPE))]

0 commit comments

Comments
 (0)