Skip to content

Commit 268f3ae

Browse files
authored
Merge pull request RustPython#4237 from jeffwang0516/method-reduce
2 parents 78586f0 + aa40195 commit 268f3ae

File tree

4 files changed

+20
-30
lines changed

4 files changed

+20
-30
lines changed

Lib/test/test_pickle.py

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,6 @@ def test_buffer_callback_error(self): # TODO: RUSTPYTHON, remove when this passe
9595
def test_buffers_error(self): # TODO: RUSTPYTHON, remove when this passes
9696
super().test_buffers_error() # TODO: RUSTPYTHON, remove when this passes
9797

98-
# TODO: RUSTPYTHON, TypeError: cannot pickle 'method' object
99-
@unittest.expectedFailure
100-
def test_c_methods(self): # TODO: RUSTPYTHON, remove when this passes
101-
super().test_c_methods() # TODO: RUSTPYTHON, remove when this passes
102-
10398
# TODO: RUSTPYTHON, AssertionError
10499
@unittest.expectedFailure
105100
def test_complex_newobj_ex(self): # TODO: RUSTPYTHON, remove when this passes
@@ -130,11 +125,6 @@ def test_optional_frames(self): # TODO: RUSTPYTHON, remove when this passes
130125
def test_picklebuffer_error(self): # TODO: RUSTPYTHON, remove when this passes
131126
super().test_picklebuffer_error() # TODO: RUSTPYTHON, remove when this passes
132127

133-
# TODO: RUSTPYTHON, pickle.PicklingError
134-
@unittest.expectedFailure
135-
def test_py_methods(self): # TODO: RUSTPYTHON, remove when this passes
136-
super().test_py_methods() # TODO: RUSTPYTHON, remove when this passes
137-
138128
def dumps(self, arg, proto=None, **kwargs):
139129
f = io.BytesIO()
140130
p = self.pickler(f, proto, **kwargs)
@@ -171,11 +161,6 @@ def test_buffer_callback_error(self): # TODO: RUSTPYTHON, remove when this passe
171161
def test_buffers_error(self): # TODO: RUSTPYTHON, remove when this passes
172162
super().test_buffers_error() # TODO: RUSTPYTHON, remove when this passes
173163

174-
# TODO: RUSTPYTHON, TypeError: cannot pickle 'method' object
175-
@unittest.expectedFailure
176-
def test_c_methods(self): # TODO: RUSTPYTHON, remove when this passes
177-
super().test_c_methods() # TODO: RUSTPYTHON, remove when this passes
178-
179164
# TODO: RUSTPYTHON, AssertionError
180165
@unittest.expectedFailure
181166
def test_complex_newobj_ex(self): # TODO: RUSTPYTHON, remove when this passes
@@ -216,11 +201,6 @@ def test_optional_frames(self): # TODO: RUSTPYTHON, remove when this passes
216201
def test_picklebuffer_error(self): # TODO: RUSTPYTHON, remove when this passes
217202
super().test_picklebuffer_error() # TODO: RUSTPYTHON, remove when this passes
218203

219-
# TODO: RUSTPYTHON, pickle.PicklingError
220-
@unittest.expectedFailure
221-
def test_py_methods(self): # TODO: RUSTPYTHON, remove when this passes
222-
super().test_py_methods() # TODO: RUSTPYTHON, remove when this passes
223-
224204
def dumps(self, arg, protocol=None, **kwargs):
225205
return pickle.dumps(arg, protocol, **kwargs)
226206

Lib/test/test_pickletools.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,6 @@ def test_buffer_callback_error(self): # TODO: RUSTPYTHON, remove when this passe
1717
def test_buffers_error(self): # TODO: RUSTPYTHON, remove when this passes
1818
super().test_buffers_error()
1919

20-
# TODO: RUSTPYTHON, TypeError: cannot pickle 'method' object
21-
@unittest.expectedFailure
22-
def test_c_methods(self): # TODO: RUSTPYTHON, remove when this passes
23-
super().test_c_methods()
24-
2520
def test_compat_pickle(self): # TODO: RUSTPYTHON, remove when this passes
2621
super().test_compat_pickle()
2722

@@ -58,11 +53,6 @@ def test_optional_frames(self): # TODO: RUSTPYTHON, remove when this passes
5853
def test_picklebuffer_error(self): # TODO: RUSTPYTHON, remove when this passes
5954
super().test_picklebuffer_error()
6055

61-
# TODO: RUSTPYTHON, pickle.PicklingError
62-
@unittest.expectedFailure
63-
def test_py_methods(self): # TODO: RUSTPYTHON, remove when this passes
64-
super().test_py_methods()
65-
6656
def dumps(self, arg, proto=None, **kwargs):
6757
return pickletools.optimize(pickle.dumps(arg, proto, **kwargs))
6858

vm/src/builtins/builtinfunc.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,15 @@ impl PyBuiltinMethod {
254254
self.class.name()
255255
)
256256
}
257+
#[pymethod(magic)]
258+
fn reduce(
259+
&self,
260+
vm: &VirtualMachine,
261+
) -> (Option<PyObjectRef>, (Option<PyObjectRef>, PyStrRef)) {
262+
let builtinfunc_getattr = vm.builtins.get_attr("getattr", vm).ok();
263+
let classname = vm.builtins.get_attr(self.class.name().to_string(), vm).ok();
264+
(builtinfunc_getattr, (classname, self.value.name.clone()))
265+
}
257266
}
258267
impl Unconstructible for PyBuiltinMethod {}
259268

vm/src/builtins/function.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,17 @@ impl PyBoundMethod {
552552
))
553553
}
554554

555+
#[pymethod(magic)]
556+
fn reduce(
557+
&self,
558+
vm: &VirtualMachine,
559+
) -> (Option<PyObjectRef>, (PyObjectRef, Option<PyObjectRef>)) {
560+
let builtinfunc_getattr = vm.builtins.get_attr("getattr", vm).ok();
561+
let funcself = self.object.clone();
562+
let funcname = self.function.get_attr("__name__", vm).ok();
563+
(builtinfunc_getattr, (funcself, funcname))
564+
}
565+
555566
#[pygetset(magic)]
556567
fn doc(&self, vm: &VirtualMachine) -> PyResult {
557568
self.function.get_attr("__doc__", vm)

0 commit comments

Comments
 (0)