Skip to content

Commit 5bf671d

Browse files
committed
Fix mul
1 parent 23ec5a5 commit 5bf671d

File tree

1 file changed

+31
-7
lines changed

1 file changed

+31
-7
lines changed

crates/vm/src/stdlib/ctypes/base.rs

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ use crate::builtins::PyType;
33
use crate::builtins::{PyBytes, PyFloat, PyInt, PyNone, PyStr, PyTypeRef};
44
use crate::convert::ToPyObject;
55
use crate::function::{Either, OptionalArg};
6+
use crate::protocol::PyNumberMethods;
67
use crate::stdlib::ctypes::_ctypes::new_simple_type;
7-
use crate::types::Constructor;
8+
use crate::types::{AsNumber, Constructor};
89
use crate::{AsObject, Py, PyObjectRef, PyPayload, PyRef, PyResult, TryFromObject, VirtualMachine};
910
use crossbeam_utils::atomic::AtomicCell;
1011
use num_traits::ToPrimitive;
@@ -158,9 +159,10 @@ pub struct PyCData {
158159
impl PyCData {}
159160

160161
#[pyclass(module = "_ctypes", name = "PyCSimpleType", base = PyType)]
162+
#[derive(Debug, PyPayload)]
161163
pub struct PyCSimpleType {}
162164

163-
#[pyclass(flags(BASETYPE))]
165+
#[pyclass(flags(BASETYPE), with(AsNumber))]
164166
impl PyCSimpleType {
165167
#[allow(clippy::new_ret_no_self)]
166168
#[pymethod]
@@ -186,6 +188,33 @@ impl PyCSimpleType {
186188

187189
PyCSimpleType::from_param(cls, as_parameter, vm)
188190
}
191+
192+
#[pymethod]
193+
fn __mul__(cls: PyTypeRef, n: isize, vm: &VirtualMachine) -> PyResult {
194+
PyCSimple::repeat(cls, n, vm)
195+
}
196+
}
197+
198+
impl AsNumber for PyCSimpleType {
199+
fn as_number() -> &'static PyNumberMethods {
200+
static AS_NUMBER: PyNumberMethods = PyNumberMethods {
201+
multiply: Some(|a, b, vm| {
202+
// a is a PyCSimpleType instance (type object like c_char)
203+
// b is int (array size)
204+
let cls = a
205+
.downcast_ref::<PyType>()
206+
.ok_or_else(|| vm.new_type_error("expected type".to_owned()))?;
207+
let n = b
208+
.try_index(vm)?
209+
.as_bigint()
210+
.to_isize()
211+
.ok_or_else(|| vm.new_overflow_error("array size too large".to_owned()))?;
212+
PyCSimple::repeat(cls.to_owned(), n, vm)
213+
}),
214+
..PyNumberMethods::NOT_IMPLEMENTED
215+
};
216+
&AS_NUMBER
217+
}
189218
}
190219

191220
#[pyclass(
@@ -276,11 +305,6 @@ impl PyCSimple {
276305
}
277306
.to_pyobject(vm))
278307
}
279-
280-
#[pyclassmethod]
281-
fn __mul__(cls: PyTypeRef, n: isize, vm: &VirtualMachine) -> PyResult {
282-
PyCSimple::repeat(cls, n, vm)
283-
}
284308
}
285309

286310
impl PyCSimple {

0 commit comments

Comments
 (0)