@@ -1102,7 +1102,7 @@ mod _json { |
1102 | 1102 | /// collection on every step (rather than working off a |
1103 | 1103 | /// pre-collected snapshot) so that a `default()`/nested-encoder |
1104 | 1104 | /// callback that shrinks the list mid-encode is observed the same |
1105 | | - /// way CPython's `PySequence_Fast`-free direct indexing observes it |
| 1105 | + /// way CPython's live sequence iteration observes it |
1106 | 1106 | /// (see `test_encode_mutated`: deleting the last element on every |
1107 | 1107 | /// callback call causes encoding to stop early once the shrinking |
1108 | 1108 | /// list's length catches up with the read cursor). |
@@ -1113,7 +1113,7 @@ mod _json { |
1113 | 1113 | out: &mut Wtf8Buf, |
1114 | 1114 | vm: &VirtualMachine, |
1115 | 1115 | len: impl Fn() -> usize, |
1116 | | - get: impl Fn(usize) -> PyObjectRef, |
| 1116 | + get: impl Fn(usize) -> Option<PyObjectRef>, |
1117 | 1117 | ) -> PyResult<()> { |
1118 | 1118 | if len() == 0 { |
1119 | 1119 | out.push_str("[]"); |
@@ -1128,7 +1128,9 @@ mod _json { |
1128 | 1128 | }; |
1129 | 1129 | let mut i = 0; |
1130 | 1130 | while i < len() { |
1131 | | - let value = get(i); |
| 1131 | + let Some(value) = get(i) else { |
| 1132 | + break; |
| 1133 | + }; |
1132 | 1134 | if i == 0 { |
1133 | 1135 | self.push_newline_indent(out, new_level); |
1134 | 1136 | } else { |
@@ -1311,11 +1313,18 @@ mod _json { |
1311 | 1313 | out, |
1312 | 1314 | vm, |
1313 | 1315 | || list.borrow_vec().len(), |
1314 | | - |i| list.borrow_vec()[i].clone(), |
| 1316 | + |i| list.borrow_vec().get(i).cloned(), |
1315 | 1317 | ) |
1316 | 1318 | } else if let Some(tuple) = obj.downcast_ref::<PyTuple>() { |
1317 | 1319 | let slice = tuple.as_slice(); |
1318 | | - self.encode_list(obj, level, out, vm, || slice.len(), |i| slice[i].clone()) |
| 1320 | + self.encode_list( |
| 1321 | + obj, |
| 1322 | + level, |
| 1323 | + out, |
| 1324 | + vm, |
| 1325 | + || slice.len(), |
| 1326 | + |i| slice.get(i).cloned(), |
| 1327 | + ) |
1319 | 1328 | } else if let Some(dict) = PyAnyDict::from_object(obj) { |
1320 | 1329 | self.encode_dict(obj, dict, level, out, vm) |
1321 | 1330 | } else { |
|