(self, write_context, value)
| 1150 | return self._validate_global_object(policy, obj) |
| 1151 | |
| 1152 | def write(self, write_context, value): |
| 1153 | # Try __reduce_ex__ first (with protocol 5 for pickle5 out-of-band buffer support), then __reduce__ |
| 1154 | # Check if the object has a custom __reduce_ex__ method (not just the default from object) |
| 1155 | if hasattr(value, "__reduce_ex__") and value.__class__.__reduce_ex__ is not object.__reduce_ex__: |
| 1156 | try: |
| 1157 | reduce_result = value.__reduce_ex__(5) |
| 1158 | except TypeError: |
| 1159 | # Some objects don't support protocol argument |
| 1160 | reduce_result = value.__reduce_ex__() |
| 1161 | elif hasattr(value, "__reduce__"): |
| 1162 | reduce_result = value.__reduce__() |
| 1163 | else: |
| 1164 | raise ValueError(f"Object {value} has no __reduce__ or __reduce_ex__ method") |
| 1165 | |
| 1166 | # Handle different __reduce__ return formats |
| 1167 | if isinstance(reduce_result, str): |
| 1168 | # Case 1: Just a global name (simple case) |
| 1169 | reduce_data = (0, reduce_result) |
| 1170 | elif isinstance(reduce_result, tuple): |
| 1171 | if len(reduce_result) == 2: |
| 1172 | # Case 2: (callable, args) |
| 1173 | callable_obj, args = reduce_result |
| 1174 | reduce_data = (1, callable_obj, args) |
| 1175 | elif len(reduce_result) == 3: |
| 1176 | # Case 3: (callable, args, state) |
| 1177 | callable_obj, args, state = reduce_result |
| 1178 | reduce_data = (1, callable_obj, args, state) |
| 1179 | elif len(reduce_result) == 4: |
| 1180 | # Case 4: (callable, args, state, listitems) |
| 1181 | callable_obj, args, state, listitems = reduce_result |
| 1182 | reduce_data = (1, callable_obj, args, state, listitems) |
| 1183 | elif len(reduce_result) == 5: |
| 1184 | # Case 5: (callable, args, state, listitems, dictitems) |
| 1185 | callable_obj, args, state, listitems, dictitems = reduce_result |
| 1186 | reduce_data = ( |
| 1187 | 1, |
| 1188 | callable_obj, |
| 1189 | args, |
| 1190 | state, |
| 1191 | listitems, |
| 1192 | dictitems, |
| 1193 | ) |
| 1194 | else: |
| 1195 | raise ValueError(f"Invalid __reduce__ result length: {len(reduce_result)}") |
| 1196 | else: |
| 1197 | raise ValueError(f"Invalid __reduce__ result type: {type(reduce_result)}") |
| 1198 | write_context.write_var_uint32(len(reduce_data)) |
| 1199 | for item in reduce_data: |
| 1200 | write_context.write_ref(item) |
| 1201 | |
| 1202 | def read(self, read_context): |
| 1203 | reduce_data_num_items = read_context.read_var_uint32() |
nothing calls this directly
no test coverage detected