Skip to content

Commit 8808050

Browse files
committed
Add PyTypSlot::init
1 parent a19efa2 commit 8808050

File tree

17 files changed

+118
-76
lines changed

17 files changed

+118
-76
lines changed

derive/src/pyclass.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -381,9 +381,10 @@ pub(crate) fn impl_define_exception(exc_def: PyExceptionDef) -> Result<TokenStre
381381
#slot_new_impl
382382
}
383383

384+
#[pyslot]
384385
#[pymethod(magic)]
385386
pub(crate) fn init(
386-
zelf: ::rustpython_vm::PyRef<::rustpython_vm::builtins::PyBaseException>,
387+
zelf: PyObjectRef,
387388
args: ::rustpython_vm::function::FuncArgs,
388389
vm: &::rustpython_vm::VirtualMachine,
389390
) -> ::rustpython_vm::PyResult<()> {

stdlib/src/contextvars.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ mod _contextvars {
1515

1616
#[pyimpl]
1717
impl PyContext {
18+
#[pyslot]
1819
#[pymethod(magic)]
19-
fn init(&self, _vm: &VirtualMachine) -> PyResult<()> {
20+
fn init(zelf: PyObjectRef, _args: FuncArgs, vm: &VirtualMachine) -> PyResult<()> {
21+
let _zelf: PyRef<Self> = zelf.try_into_value(vm)?;
2022
unimplemented!("Context.__init__ is currently under construction")
2123
}
2224

@@ -97,8 +99,10 @@ mod _contextvars {
9799

98100
#[pyimpl]
99101
impl ContextVar {
102+
#[pyslot]
100103
#[pymethod(magic)]
101-
fn init(&self, _args: ContextVarOptions, _vm: &VirtualMachine) -> PyResult<()> {
104+
fn init(_zelf: PyObjectRef, _args: FuncArgs, vm: &VirtualMachine) -> PyResult<()> {
105+
let _: ContextVarOptions = _args.bind(vm)?;
102106
unimplemented!("ContextVar.__init__() is currently under construction")
103107
}
104108

@@ -167,8 +171,10 @@ mod _contextvars {
167171

168172
#[pyimpl]
169173
impl ContextToken {
174+
#[pyslot]
170175
#[pymethod(magic)]
171-
fn init(&self, _args: ContextTokenOptions, _vm: &VirtualMachine) -> PyResult<()> {
176+
fn init(_zelf: PyObjectRef, _args: FuncArgs, vm: &VirtualMachine) -> PyResult<()> {
177+
let _: ContextTokenOptions = _args.bind(vm)?;
172178
unimplemented!("Token.__init__() is currently under construction")
173179
}
174180

stdlib/src/socket.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ mod _socket {
1616
convert::{ToPyException, ToPyObject, TryFromBorrowedObject, TryFromObject},
1717
function::{ArgBytesLike, ArgMemoryBuffer, Either, FuncArgs, OptionalArg, OptionalOption},
1818
utils::ToCString,
19-
AsObject, PyObjectRef, PyPayload, PyResult, VirtualMachine,
19+
AsObject, PyObjectRef, PyPayload, PyRef, PyResult, VirtualMachine,
2020
};
2121
use crossbeam_utils::atomic::AtomicCell;
2222
use num_traits::ToPrimitive;
@@ -548,15 +548,16 @@ mod _socket {
548548
Self::default().into_ref_with_type(vm, cls).map(Into::into)
549549
}
550550

551+
#[pyslot]
551552
#[pymethod(magic)]
552-
fn init(
553-
&self,
554-
family: OptionalArg<i32>,
555-
socket_kind: OptionalArg<i32>,
556-
proto: OptionalArg<i32>,
557-
fileno: OptionalOption<PyObjectRef>,
558-
vm: &VirtualMachine,
559-
) -> PyResult<()> {
553+
fn init(zelf: PyObjectRef, args: FuncArgs, vm: &VirtualMachine) -> PyResult<()> {
554+
let zelf: PyRef<Self> = zelf.try_into_value(vm)?;
555+
let (family, socket_kind, proto, fileno): (
556+
OptionalArg<i32>,
557+
OptionalArg<i32>,
558+
OptionalArg<i32>,
559+
OptionalOption<PyObjectRef>,
560+
) = args.bind(vm)?;
560561
let mut family = family.unwrap_or(-1);
561562
let mut socket_kind = socket_kind.unwrap_or(-1);
562563
let mut proto = proto.unwrap_or(-1);
@@ -628,7 +629,7 @@ mod _socket {
628629
)
629630
.map_err(|err| err.to_pyexception(vm))?;
630631
};
631-
self.init_inner(family, socket_kind, proto, sock, vm)
632+
zelf.init_inner(family, socket_kind, proto, sock, vm)
632633
}
633634

634635
#[pymethod]

vm/src/builtins/bytearray.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,11 +105,14 @@ impl PyByteArray {
105105
.map(Into::into)
106106
}
107107

108+
#[pyslot]
108109
#[pymethod(magic)]
109-
fn init(&self, options: ByteInnerNewOptions, vm: &VirtualMachine) -> PyResult<()> {
110+
fn init(zelf: PyObjectRef, args: FuncArgs, vm: &VirtualMachine) -> PyResult<()> {
111+
let zelf: PyRef<Self> = zelf.try_into_value(vm)?;
112+
let options: ByteInnerNewOptions = args.bind(vm)?;
110113
// First unpack bytearray and *then* get a lock to set it.
111114
let mut inner = options.get_bytearray_inner(vm)?;
112-
std::mem::swap(&mut *self.inner_mut(), &mut inner);
115+
std::mem::swap(&mut *zelf.inner_mut(), &mut inner);
113116
Ok(())
114117
}
115118

vm/src/builtins/dict.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,12 @@ impl PyDict {
8888
.map(Into::into)
8989
}
9090

91+
#[pyslot]
9192
#[pymethod(magic)]
92-
fn init(
93-
&self,
94-
dict_obj: OptionalArg<PyObjectRef>,
95-
kwargs: KwArgs,
96-
vm: &VirtualMachine,
97-
) -> PyResult<()> {
98-
self.update(dict_obj, kwargs, vm)
93+
fn init(zelf: PyObjectRef, args: FuncArgs, vm: &VirtualMachine) -> PyResult<()> {
94+
let zelf: PyRef<Self> = zelf.try_into_value(vm)?;
95+
let (dict_obj, kwargs): (OptionalArg<PyObjectRef>, KwArgs) = args.bind(vm)?;
96+
zelf.update(dict_obj, kwargs, vm)
9997
}
10098

10199
// Used in update and ior.

vm/src/builtins/list.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -345,14 +345,17 @@ impl PyList {
345345
.map(Into::into)
346346
}
347347

348+
#[pyslot]
348349
#[pymethod(magic)]
349-
fn init(&self, iterable: OptionalArg<PyObjectRef>, vm: &VirtualMachine) -> PyResult<()> {
350+
fn init(zelf: PyObjectRef, args: FuncArgs, vm: &VirtualMachine) -> PyResult<()> {
351+
let zelf: PyRef<Self> = zelf.try_into_value(vm)?;
352+
let iterable: OptionalArg<PyObjectRef> = args.bind(vm)?;
350353
let mut elements = if let OptionalArg::Present(iterable) = iterable {
351354
iterable.try_to_value(vm)?
352355
} else {
353356
vec![]
354357
};
355-
std::mem::swap(self.borrow_vec_mut().deref_mut(), &mut elements);
358+
std::mem::swap(zelf.borrow_vec_mut().deref_mut(), &mut elements);
356359
Ok(())
357360
}
358361

vm/src/builtins/module.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,18 @@ impl PyModule {
3838
PyModule {}.into_ref_with_type(vm, cls).map(Into::into)
3939
}
4040

41+
#[pyslot]
4142
#[pymethod(magic)]
42-
fn init(zelf: PyRef<Self>, args: ModuleInitArgs, vm: &VirtualMachine) {
43+
fn init(zelf: PyObjectRef, args: FuncArgs, vm: &VirtualMachine) -> PyResult<()> {
44+
let zelf: PyRef<Self> = zelf.try_into_value(vm)?;
45+
let args: ModuleInitArgs = args.bind(vm)?;
4346
debug_assert!(zelf
4447
.class()
4548
.slots
4649
.flags
4750
.has_feature(crate::types::PyTypeFlags::HAS_DICT));
4851
zelf.init_module_dict(args.name.into(), args.doc.to_pyobject(vm), vm);
52+
Ok(())
4953
}
5054

5155
fn getattr_inner(zelf: &Py<Self>, name: PyStrRef, vm: &VirtualMachine) -> PyResult {

vm/src/builtins/namespace.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::{
55
function::{FuncArgs, PyComparisonValue},
66
recursion::ReprGuard,
77
types::{Comparable, Constructor, PyComparisonOp},
8-
AsObject, Context, PyObject, PyPayload, PyRef, PyResult, VirtualMachine,
8+
AsObject, Context, PyObject, PyObjectRef, PyPayload, PyRef, PyResult, VirtualMachine,
99
};
1010

1111
/// A simple attribute-based namespace.
@@ -41,8 +41,10 @@ impl PyNamespace {
4141

4242
#[pyimpl(flags(BASETYPE, HAS_DICT), with(Constructor, Comparable))]
4343
impl PyNamespace {
44+
#[pyslot]
4445
#[pymethod(magic)]
45-
fn init(zelf: PyRef<Self>, args: FuncArgs, vm: &VirtualMachine) -> PyResult<()> {
46+
fn init(zelf: PyObjectRef, args: FuncArgs, vm: &VirtualMachine) -> PyResult<()> {
47+
let zelf: PyRef<Self> = zelf.try_into_value(vm)?;
4648
if !args.args.is_empty() {
4749
return Err(vm.new_type_error("no positional arguments expected".to_owned()));
4850
}

vm/src/builtins/object.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,8 +250,11 @@ impl PyBaseObject {
250250
}
251251
}
252252

253+
#[pyslot]
253254
#[pymethod(magic)]
254-
fn init(_args: FuncArgs) {}
255+
fn init(_zelf: PyObjectRef, _args: FuncArgs, _vm: &VirtualMachine) -> PyResult<()> {
256+
Ok(())
257+
}
255258

256259
#[pyproperty(name = "__class__")]
257260
fn get_class(obj: PyObjectRef) -> PyTypeRef {

vm/src/builtins/property.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,18 @@ impl PyProperty {
9999
.map(Into::into)
100100
}
101101

102+
#[pyslot]
102103
#[pymethod(magic)]
103-
fn init(&self, args: PropertyArgs) {
104-
*self.getter.write() = args.fget;
105-
*self.setter.write() = args.fset;
106-
*self.deleter.write() = args.fdel;
107-
*self.doc.write() = args.doc;
104+
fn init(zelf: PyObjectRef, args: FuncArgs, vm: &VirtualMachine) -> PyResult<()> {
105+
let zelf: PyRef<Self> = zelf.try_into_value(vm)?;
106+
let args: PropertyArgs = args.bind(vm)?;
107+
108+
*zelf.getter.write() = args.fget;
109+
*zelf.setter.write() = args.fset;
110+
*zelf.deleter.write() = args.fdel;
111+
*zelf.doc.write() = args.doc;
112+
113+
Ok(())
108114
}
109115

110116
// Descriptor methods

0 commit comments

Comments
 (0)