@@ -3,6 +3,7 @@ use crate::common::hash::PyHash;
3
3
use crate :: types:: PyTypeFlags ;
4
4
use crate :: {
5
5
class:: PyClassImpl ,
6
+ convert:: ToPyResult ,
6
7
function:: { Either , FuncArgs , PyArithmeticValue , PyComparisonValue , PySetterValue } ,
7
8
types:: { Constructor , PyComparisonOp } ,
8
9
AsObject , Context , Py , PyObject , PyObjectRef , PyPayload , PyResult , VirtualMachine ,
@@ -73,8 +74,113 @@ impl Constructor for PyBaseObject {
73
74
}
74
75
}
75
76
77
+ // object_getstate_default in CPython
78
+ fn object_getstate_default (
79
+ obj : & PyObject ,
80
+ required : bool ,
81
+ vm : & VirtualMachine ,
82
+ ) -> PyResult < Option < PyObjectRef > > {
83
+ // TODO: itemsize
84
+ // if required && obj.class().slots.itemsize > 0 {
85
+ // return vm.new_type_error(format!(
86
+ // "cannot pickle {:.200} objects",
87
+ // obj.class().name()
88
+ // ));
89
+ // }
90
+
91
+ let state = if obj. dict ( ) . map_or ( true , |d| d. is_empty ( ) ) {
92
+ vm. ctx . none ( )
93
+ } else {
94
+ // let state = object_get_dict(obj.clone(), obj.ctx()).unwrap();
95
+ let Some ( state) = obj. dict ( ) else {
96
+ return Ok ( None ) ;
97
+ } ;
98
+ state. into ( )
99
+ } ;
100
+
101
+ // let slotnames = obj.class().slot_names(obj.ctx());
102
+ // if slotnames.is_none() {
103
+ // return PyErr::new_type_error("cannot pickle object".to_owned());
104
+ // }
105
+
106
+ if required {
107
+ let basicsize = obj. class ( ) . slots . basicsize ;
108
+ // if obj.class().slots.dictoffset > 0
109
+ // && !obj.class().slots.flags.has_feature(PyTypeFlags::MANAGED_DICT)
110
+ // {
111
+ // basicsize += std::mem::size_of::<PyObjectRef>();
112
+ // }
113
+ // if obj.class().slots.weaklistoffset > 0 {
114
+ // basicsize += std::mem::size_of::<PyObjectRef>();
115
+ // }
116
+ // if !slotnames.is_none() {
117
+ // basicsize += std::mem::size_of::<PyObjectRef>() * slotnames.length(vm).unwrap();
118
+ // }
119
+ if obj. class ( ) . slots . basicsize > basicsize {
120
+ return Err (
121
+ vm. new_type_error ( format ! ( "cannot pickle {:.200} object" , obj. class( ) . name( ) ) )
122
+ ) ;
123
+ }
124
+ }
125
+
126
+ // if !slotnames.is_none() && slotnames.length(vm).unwrap() > 0 {
127
+ // let mut slots = obj.ctx().new_dict();
128
+ // let slotnames_size = slotnames.length(vm).unwrap();
129
+ // for i in 0..slotnames_size {
130
+ // let name = slotnames.get_item(i).unwrap();
131
+ // let value = obj.getattr(&name, obj.ctx()).unwrap();
132
+ // if value.is_none() {
133
+ // continue;
134
+ // }
135
+ // slots.set_item(name, value).unwrap();
136
+ // }
<
E30A
/tr>
137
+
138
+ // if slots.len() > 0 {
139
+ // let state2 = obj.ctx().new_tuple(vec![state, slots]).unwrap();
140
+ // return state2;
141
+ // }
142
+ // }
143
+
144
+ Ok ( Some ( state) )
145
+ }
146
+
147
+ // object_getstate in CPython
148
+ // fn object_getstate(
149
+ // obj: &PyObject,
150
+ // required: bool,
151
+ // vm: &VirtualMachine,
152
+ // ) -> PyResult<Option<PyObjectRef>> {
153
+ // let getstate = obj.get_attr(identifier!(vm, __getstate__), vm)?;
154
+ // if vm.is_none(&getstate) {
155
+ // return Ok(None);
156
+ // }
157
+
158
+ // let getstate = match getstate.downcast_exact::<PyNativeFunction>(vm) {
159
+ // Ok(getstate)
160
+ // if getstate
161
+ // .get_self()
162
+ // .map_or(false, |self_obj| self_obj.is(obj))
163
+ // && std::ptr::addr_eq(
164
+ // getstate.as_func() as *const _,
165
+ // &PyBaseObject::__getstate__ as &dyn crate::function::PyNativeFn as *const _,
166
+ // ) =>
167
+ // {
168
+ // return object_getstate_default(obj, required, vm);
169
+ // }
170
+ // Ok(getstate) => getstate.into_pyref().into(),
171
+ // Err(getstate) => getstate,
172
+ // };
173
+ // getstate.call((), vm).map(Some)
174
+ // }
175
+
76
176
#[ pyclass( with( Constructor ) , flags( BASETYPE ) ) ]
77
177
impl PyBaseObject {
178
+ #[ pymethod( raw) ]
179
+ fn __getstate__ ( vm : & VirtualMachine , args : FuncArgs ) -> PyResult {
180
+ let ( zelf, ) : ( PyObjectRef , ) = args. bind ( vm) ?;
181
+ object_getstate_default ( & zelf, false , vm) . to_pyresult ( vm)
182
+ }
183
+
78
184
#[ pyslot]
79
185
fn slot_richcompare (
80
186
zelf : & PyObject ,
0 commit comments