@@ -60,33 +60,27 @@ crate::common::static_cell! {
6060
6161#[ pyimpl( with( GetAttr , SetAttr , Constructor , AsSequence , AsMapping ) ) ]
6262impl 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> {
119109impl 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