Skip to content

Commit 92b1a5b

Browse files
authored
Merge pull request #4740 from youknowone/method-pyobject2
method calls to take &PyObject
2 parents 4993925 + 494c7bd commit 92b1a5b

26 files changed

+192
-210
lines changed

src/shell/helper.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
use rustpython_vm::{
33
builtins::{PyDictRef, PyStrRef},
44
function::ArgIterable,
5-
identifier, PyResult, TryFromObject, VirtualMachine,
5+
identifier, AsObject, PyResult, TryFromObject, VirtualMachine,
66
};
77

88
pub struct ShellHelper<'vm> {
@@ -82,19 +82,17 @@ impl<'vm> ShellHelper<'vm> {
8282
current = current.get_attr(&attr, self.vm).ok()?;
8383
}
8484

85-
let current_iter = str_iter_method(current, identifier!(self.vm, __dir__)).ok()?;
85+
let current_iter = str_iter_method(&current, identifier!(self.vm, __dir__)).ok()?;
8686

8787
(last, current_iter, None)
8888
} else {
8989
// we need to get a variable based off of globals/builtins
9090

9191
let globals =
92-
str_iter_method(self.globals.clone().into(), identifier!(self.vm, keys)).ok()?;
93-
let builtins = str_iter_method(
94-
self.vm.builtins.clone().into(),
95-
identifier!(self.vm, __dir__),
96-
)
97-
.ok()?;
92+
str_iter_method(self.globals.as_object(), identifier!(self.vm, keys)).ok()?;
93+
let builtins =
94+
str_iter_method(self.vm.builtins.as_object(), identifier!(self.vm, __dir__))
95+
.ok()?;
9896
(first, globals, Some(builtins))
9997
};
10098
Some((word_start, iter1.chain(iter2.into_iter().flatten())))

vm/src/builtins/builtin_func.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -194,14 +194,14 @@ impl GetDescriptor for PyBuiltinMethod {
194194
cls: Option<PyObjectRef>,
195195
vm: &VirtualMachine,
196196
) -> PyResult {
197-
let (zelf, obj) = match Self::_check(zelf, obj, vm) {
198-
Ok(obj) => obj,
199-
Err(result) => return result,
197+
let (_zelf, obj) = match Self::_check(&zelf, obj, vm) {
198+
Some(obj) => obj,
199+
None => return Ok(zelf),
200200
};
201201
let r = if vm.is_none(&obj) && !Self::_cls_is(&cls, obj.class()) {
202-
zelf.into()
202+
zelf
203203
} else {
204-
PyBoundMethod::new_ref(obj, zelf.into(), &vm.ctx).into()
204+
PyBoundMethod::new_ref(obj, zelf, &vm.ctx).into()
205205
};
206206
Ok(r)
207207
}

vm/src/builtins/classmethod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ impl GetDescriptor for PyClassMethod {
5353
cls: Option<PyObjectRef>,
5454
vm: &VirtualMachine,
5555
) -> PyResult {
56-
let (zelf, _obj) = Self::_unwrap(zelf, obj, vm)?;
56+
let (zelf, _obj) = Self::_unwrap(&zelf, obj, vm)?;
5757
let cls = cls.unwrap_or_else(|| _obj.class().to_owned().into());
5858
let call_descr_get: PyResult<PyObjectRef> = zelf.callable.lock().get_attr("__get__", vm);
5959
match call_descr_get {

vm/src/builtins/descriptor.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::{
33
class::PyClassImpl,
44
function::PySetterValue,
55
types::{Constructor, GetDescriptor, Representable, Unconstructible},
6-
AsObject, Context, Py, PyObjectRef, PyPayload, PyResult, VirtualMachine,
6+
AsObject, Context, Py, PyObject, PyObjectRef, PyPayload, PyResult, VirtualMachine,
77
};
88
use rustpython_common::lock::PyRwLock;
99

@@ -122,12 +122,12 @@ impl MemberDescrObject {
122122

123123
#[pyslot]
124124
fn descr_set(
125-
zelf: PyObjectRef,
125+
zelf: &PyObject,
126126
obj: PyObjectRef,
127127
value: PySetterValue<PyObjectRef>,
128128
vm: &VirtualMachine,
129129
) -> PyResult<()> {
130-
let zelf = Self::_zelf(zelf, vm)?;
130+
let zelf = Self::_as_pyref(zelf, vm)?;
131131
zelf.member.set(obj, value, vm)
132132
}
133133
}
@@ -208,7 +208,7 @@ impl GetDescriptor for MemberDescrObject {
208208
) -> PyResult {
209209
match obj {
210210
Some(x) => {
211-
let zelf = Self::_zelf(zelf, vm)?;
211+
let zelf = Self::_as_pyref(&zelf, vm)?;
212212
zelf.member.get(x, vm)
213213
}
214214
None => Ok(zelf),

vm/src/builtins/function.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -374,13 +374,13 @@ impl PyFunction {
374374
// {"__builtins__", T_OBJECT, OFF(func_builtins), READONLY},
375375
#[pymember(magic)]
376376
fn globals(vm: &VirtualMachine, zelf: PyObjectRef) -> PyResult {
377-
let zelf = Self::_zelf(zelf, vm)?;
377+
let zelf = Self::_as_pyref(&zelf, vm)?;
378378
Ok(zelf.globals.clone().into())
379379
}
380380

381381
#[pymember(magic)]
382382
fn closure(vm: &VirtualMachine, zelf: PyObjectRef) -> PyResult {
383-
let zelf = Self::_zelf(zelf, vm)?;
383+
let zelf = Self::_as_pyref(&zelf, vm)?;
384384
Ok(vm.unwrap_or_none(zelf.closure.clone().map(|x| x.to_pyobject(vm))))
385385
}
386386

@@ -439,11 +439,11 @@ impl GetDescriptor for PyFunction {
439439
cls: Option<PyObjectRef>,
440440
vm: &VirtualMachine,
441441
) -> PyResult {
442-
let (zelf, obj) = Self::_unwrap(zelf, obj, vm)?;
442+
let (_zelf, obj) = Self::_unwrap(&zelf, obj, vm)?;
443443
let obj = if vm.is_none(&obj) && !Self::_cls_is(&cls, obj.class()) {
444-
zelf.into()
444+
zelf
445445
} else {
446-
PyBoundMethod::new_ref(obj, zelf.into(), &vm.ctx).into()
446+
PyBoundMethod::new_ref(obj, zelf, &vm.ctx).into()
447447
};
448448
Ok(obj)
449449
}
@@ -507,7 +507,7 @@ impl GetAttr for PyBoundMethod {
507507
.interned_str(name)
508508
.and_then(|attr_name| zelf.get_class_attr(attr_name));
509509
if let Some(obj) = class_attr {
510-
return vm.call_if_get_descriptor(obj, zelf.to_owned().into());
510+
return vm.call_if_get_descriptor(&obj, zelf.to_owned().into());
511511
}
512512
zelf.function.get_attr(name, vm)
513513
}

vm/src/builtins/getset.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::{
66
class::PyClassImpl,
77
function::{IntoPyGetterFunc, IntoPySetterFunc, PyGetterFunc, PySetterFunc, PySetterValue},
88
types::{Constructor, GetDescriptor, Unconstructible},
9-
AsObject, Context, Py, PyObjectRef, PyPayload, PyRef, PyResult, TryFromObject, VirtualMachine,
9+
AsObject, Context, Py, PyObject, PyObjectRef, PyPayload, PyResult, VirtualMachine,
1010
};
1111

1212
#[pyclass(module = false, name = "getset_descriptor")]
@@ -51,9 +51,9 @@ impl GetDescriptor for PyGetSet {
5151
_cls: Option<PyObjectRef>,
5252
vm: &VirtualMachine,
5353
) -> PyResult {
54-
let (zelf, obj) = match Self::_check(zelf, obj, vm) {
55-
Ok(obj) => obj,
56-
Err(result) => return result,
54+
let (zelf, obj) = match Self::_check(&zelf, obj, vm) {
55+
Some(obj) => obj,
56+
None => return Ok(zelf),
5757
};
5858
if let Some(ref f) = zelf.getter {
5959
f(vm, obj)
@@ -100,12 +100,12 @@ impl PyGetSet {
100100

101101
#[pyslot]
102102
fn descr_set(
103-
zelf: PyObjectRef,
103+
zelf: &PyObject,
104104
obj: PyObjectRef,
105105
value: PySetterValue<PyObjectRef>,
106106
vm: &VirtualMachine,
107107
) -> PyResult<()> {
108-
let zelf = PyRef::<Self>::try_from_object(vm, zelf)?;
108+
let zelf = zelf.try_to_ref::<Self>(vm)?;
109109
if let Some(ref f) = zelf.setter {
110110
f(vm, obj, value)
111111
} else {
@@ -123,11 +123,11 @@ impl PyGetSet {
123123
value: PyObjectRef,
124124
vm: &VirtualMachine,
125125
) -> PyResult<()> {
126-
Self::descr_set(zelf, obj, PySetterValue::Assign(value), vm)
126+
Self::descr_set(&zelf, obj, PySetterValue::Assign(value), vm)
127127
}
128128
#[pymethod]
129129
fn __delete__(zelf: PyObjectRef, obj: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> {
130-
Self::descr_set(zelf, obj, PySetterValue::Delete, vm)
130+
Self::descr_set(&zelf, obj, PySetterValue::Delete, vm)
131131
}
132132

133133
#[pygetset(magic)]

vm/src/builtins/property.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::{
88
class::PyClassImpl,
99
function::{FuncArgs, PySetterValue},
1010
types::{Constructor, GetDescriptor, Initializer},
11-
AsObject, Context, Py, PyObjectRef, PyPayload, PyRef, PyResult, TryFromObject, VirtualMachine,
11+
AsObject, Context, Py, PyObject, PyObjectRef, PyPayload, PyRef, PyResult, VirtualMachine,
1212
};
1313

1414
#[pyclass(module = false, name = "property")]
@@ -40,14 +40,14 @@ pub struct PropertyArgs {
4040

4141
impl GetDescriptor for PyProperty {
4242
fn descr_get(
43-
zelf: PyObjectRef,
43+
zelf_obj: PyObjectRef,
4444
obj: Option<PyObjectRef>,
4545
_cls: Option<PyObjectRef>,
4646
vm: &VirtualMachine,
4747
) -> PyResult {
48-
let (zelf, obj) = Self::_unwrap(zelf, obj, vm)?;
48+
let (zelf, obj) = Self::_unwrap(&zelf_obj, obj, vm)?;
4949
if vm.is_none(&obj) {
50-
Ok(zelf.into())
50+
Ok(zelf_obj)
5151
} else if let Some(getter) = zelf.getter.read().as_ref() {
5252
getter.call((obj,), vm)
5353
} else {
@@ -62,12 +62,12 @@ impl PyProperty {
6262

6363
#[pyslot]
6464
fn descr_set(
65-
zelf: PyObjectRef,
65+
zelf: &PyObject,
6666
obj: PyObjectRef,
6767
value: PySetterValue,
6868
vm: &VirtualMachine,
6969
) -> PyResult<()> {
70-
let zelf = PyRef::<Self>::try_from_object(vm, zelf)?;
70+
let zelf = zelf.try_to_ref::<Self>(vm)?;
7171
match value {
7272
PySetterValue::Assign(value) => {
7373
if let Some(setter) = zelf.setter.read().as_ref() {
@@ -92,11 +92,11 @@ impl PyProperty {
9292
value: PyObjectRef,
9393
vm: &VirtualMachine,
9494
) -> PyResult<()> {
95-
Self::descr_set(zelf, obj, PySetterValue::Assign(value), vm)
95+
Self::descr_set(&zelf, obj, PySetterValue::Assign(value), vm)
9696
}
9797
#[pymethod]
9898
fn __delete__(zelf: PyObjectRef, obj: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> {
99-
Self::descr_set(zelf, obj, PySetterValue::Delete, vm)
99+
Self::descr_set(&zelf, obj, PySetterValue::Delete, vm)
100100
}
101101

102102
// Access functions

vm/src/builtins/staticmethod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ impl GetDescriptor for PyStaticMethod {
2727
_cls: Option<PyObjectRef>,
2828
vm: &VirtualMachine,
2929
) -> PyResult {
30-
let (zelf, _obj) = Self::_unwrap(zelf, obj, vm)?;
30+
let (zelf, _obj) = Self::_unwrap(&zelf, obj, vm)?;
3131
let x = Ok(zelf.callable.lock().clone());
3232
x
3333
}

vm/src/builtins/str.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@ impl<'a> TryFromBorrowedObject<'a> for String {
4848
}
4949
}
5050

51+
impl<'a> TryFromBorrowedObject<'a> for &'a str {
52+
fn try_from_borrowed_object(vm: &VirtualMachine, obj: &'a PyObject) -> PyResult<Self> {
53+
let pystr: &Py<PyStr> = TryFromBorrowedObject::try_from_borrowed_object(vm, obj)?;
54+
Ok(pystr.as_str())
55+
}
56+
}
57+
5158
#[pyclass(module = false, name = "str")]
5259
pub struct PyStr {
5360
bytes: Box<[u8]>,

vm/src/builtins/super.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ impl GetAttr for PySuper {
150150
if let Some(descr) = cls.get_direct_attr(name) {
151151
return vm
152152
.call_get_descriptor_specific(
153-
descr.clone(),
153+
&descr,
154154
// Only pass 'obj' param if this is instance-mode super (See https://bugs.python.org/issue743267)
155155
if obj.is(&start_type) { None } else { Some(obj) },
156156
Some(start_type.as_object().to_owned()),
@@ -165,14 +165,14 @@ impl GetAttr for PySuper {
165165

166166
impl GetDescriptor for PySuper {
167167
fn descr_get(
168-
zelf: PyObjectRef,
168+
zelf_obj: PyObjectRef,
169169
obj: Option<PyObjectRef>,
170170
_cls: Option<PyObjectRef>,
171171
vm: &VirtualMachine,
172172
) -> PyResult {
173-
let (zelf, obj) = Self::_unwrap(zelf, obj, vm)?;
173+
let (zelf, obj) = Self::_unwrap(&zelf_obj, obj, vm)?;
174174
if vm.is_none(&obj) || zelf.obj.is_some() {
175-
return Ok(zelf.into());
175+
return Ok(zelf_obj);
176176
}
177177
let zelf_class = zelf.as_object().class();
178178
if zelf_class.is(vm.ctx.types.super_type) {

0 commit comments

Comments
 (0)