Skip to content

Commit b39549c

Browse files
committed
PyWeakProxy::try_upgrade
1 parent 21a7369 commit b39549c

File tree

1 file changed

+17
-32
lines changed

1 file changed

+17
-32
lines changed

vm/src/builtins/weakproxy.rs

Lines changed: 17 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -60,33 +60,27 @@ crate::common::static_cell! {
6060

6161
#[pyimpl(with(GetAttr, SetAttr, Constructor, AsSequence, AsMapping))]
6262
impl PyWeakProxy {
63+
fn try_upgrade(&self, vm: &VirtualMachine) -> PyResult {
64+
self.weak.upgrade().ok_or_else(|| new_reference_error(vm))
65+
}
66+
6367
#[pymethod(magic)]
6468
fn str(&self, vm: &VirtualMachine) -> PyResult<PyStrRef> {
65-
match self.weak.upgrade() {
66-
Some(obj) => obj.str(vm),
67-
None => Err(new_reference_error(vm)),
68-
}
69+
self.try_upgrade(vm)?.str(vm)
6970
}
7071

7172
fn len(&self, vm: &VirtualMachine) -> PyResult<usize> {
72-
match self.weak.upgrade() {
73-
Some(obj) => obj.length(vm),
74-
None => Err(new_reference_error(vm)),
75-
}
73+
self.try_upgrade(vm)?.length(vm)
7674
}
7775

7876
fn contains(&self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult<bool> {
79-
match self.weak.upgrade() {
80-
Some(obj) => PySequence::contains(&obj, &needle, vm),
81-
None => Err(new_reference_error(vm)),
82-
}
77+
let obj = self.try_upgrade(vm)?;
78+
PySequence::contains(&obj, &needle, vm)
8379
}
8480

8581
fn getitem(&self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult {
86-
match self.weak.upgrade() {
87-
Some(obj) => obj.get_item(&*needle, vm),
88-
None => Err(new_reference_error(vm)),
89-
}
82+
let obj = self.try_upgrade(vm)?;
83+
obj.get_item(&*needle, vm)
9084
}
9185

9286
fn setitem(
@@ -95,17 +89,13 @@ impl PyWeakProxy {
9589
value: PyObjectRef,
9690
vm: &VirtualMachine,
9791
) -> PyResult<()> {
98-
match self.weak.upgrade() {
99-
Some(obj) => obj.set_item(&*needle, value, vm),
100-
None => Err(new_reference_error(vm)),
101-
}
92+
let obj = self.try_upgrade(vm)?;
93+
obj.set_item(&*needle, value, vm)
10294
}
10395

10496
fn delitem(&self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> {
105-
match self.weak.upgrade() {
106-
Some(obj) => obj.del_item(&*needle, vm),
107-
None => Err(new_reference_error(vm)),
108-
}
97+
let obj = self.try_upgrade(vm)?;
98+
obj.del_item(&*needle, vm)
10999
}
110100
}
111101

@@ -119,7 +109,7 @@ fn new_reference_error(vm: &VirtualMachine) -> PyRef<super::PyBaseException> {
119109
impl GetAttr for PyWeakProxy {
120110
// TODO: callbacks
121111
fn getattro(zelf: &Py<Self>, name: PyStrRef, vm: &VirtualMachine) -> PyResult {
122-
let obj = zelf.weak.upgrade().ok_or_else(|| new_reference_error(vm))?;
112+
let obj = zelf.try_upgrade(vm)?;
123113
obj.get_attr(name, vm)
124114
}
125115
}
@@ -131,13 +121,8 @@ impl SetAttr for PyWeakProxy {
131121
value: Option<PyObjectRef>,
132122
vm: &VirtualMachine,
133123
) -> PyResult<()> {
134-
match zelf.weak.upgrade() {
135-
Some(obj) => obj.call_set_attr(vm, attr_name, value),
136-
None => Err(vm.new_exception_msg(
137-
vm.ctx.exceptions.reference_error.to_owned(),
138-
"weakly-referenced object no longer exists".to_owned(),
139-
)),
140-
}
124+
let obj = zelf.try_upgrade(vm)?;
125+
obj.call_set_attr(vm, attr_name, value)
141126
}
142127
}
143128

0 commit comments

Comments
 (0)