Repository navigation
Commit 47c249a
* gh-151060: Fix sum() deallocating a float subclass as an exact float
The complex-total fast path in builtin_sum_impl() guarded with
PyFloat_Check() (which accepts subclasses) but freed the item with
_Py_DECREF_SPECIALIZED(item, _PyFloat_ExactDealloc), which assumes an
exact float. A float subclass instance reaching refcount 0 in that loop
aborts on an assertion in debug builds, and in release builds skips the
subclass tp_dealloc (type refcount leak, __del__ never runs, subclass
object pushed onto the float freelist).
Use PyFloat_CheckExact() instead, matching the float-total branch, so
subclass instances fall through to the generic PyNumber_Add() path.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* gh-150868: Also use exact-type checks for ints in the fast sum() loops
Per review: use PyLong_CheckExact with the specialized exact-int
deallocator in the float and complex fast-sum loops, so int subclasses
take the generic path.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent e7acd6a commit 47c249a
3 files changed
Lines changed: 34 additions & 7 deletions
File tree
- Lib/test
- Misc/NEWS.d/next/Core_and_Builtins
- Python
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2252 | 2252 | | |
2253 | 2253 | | |
2254 | 2254 | | |
| 2255 | + | |
| 2256 | + | |
| 2257 | + | |
| 2258 | + | |
| 2259 | + | |
| 2260 | + | |
| 2261 | + | |
| 2262 | + | |
| 2263 | + | |
| 2264 | + | |
| 2265 | + | |
| 2266 | + | |
| 2267 | + | |
| 2268 | + | |
| 2269 | + | |
| 2270 | + | |
| 2271 | + | |
| 2272 | + | |
| 2273 | + | |
| 2274 | + | |
| 2275 | + | |
| 2276 | + | |
| 2277 | + | |
| 2278 | + | |
| 2279 | + | |
2255 | 2280 | | |
2256 | 2281 | | |
2257 | 2282 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2949 | 2949 | | |
2950 | 2950 | | |
2951 | 2951 | | |
2952 | | - | |
| 2952 | + | |
2953 | 2953 | | |
2954 | 2954 | | |
2955 | 2955 | | |
2956 | | - | |
| 2956 | + | |
2957 | 2957 | | |
2958 | 2958 | | |
2959 | 2959 | | |
2960 | | - | |
| 2960 | + | |
2961 | 2961 | | |
2962 | 2962 | | |
2963 | 2963 | | |
| |||
3001 | 3001 | | |
3002 | 3002 | | |
3003 | 3003 | | |
3004 | | - | |
| 3004 | + | |
3005 | 3005 | | |
3006 | 3006 | | |
3007 | 3007 | | |
3008 | | - | |
| 3008 | + | |
3009 | 3009 | | |
3010 | 3010 | | |
3011 | 3011 | | |
3012 | | - | |
| 3012 | + | |
3013 | 3013 | | |
3014 | 3014 | | |
3015 | 3015 | | |
3016 | 3016 | | |
3017 | | - | |
| 3017 | + | |
3018 | 3018 | | |
3019 | 3019 | | |
3020 | 3020 | | |
| |||
0 commit comments