Commit 82e8498
authored
[mypyc] Fix memory leak in
Fixes #21716
When mypyc compiles `class Foo(Exception)` with instance attributes, it
staples an extra `__dict__` slot onto the end of the base exception
struct to hold them but it doesn't generate its own dealloc; the type
inherits `BaseException`s, which only frees the base's own fields and
has no idea the extra slot exists, meaning that the dict leaks on every
destruction.
The fix: Flip the gate in `emitclass.py` so we emit our own `tp_dealloc`
/ `tp_clear` / `tp_traverse` for this case too. The existing
builtin-base dealloc path then does the right thing: our clear frees the
extra slot, then the base's dealloc frees the rest.Exception subclasses with instance attributes (#21719)1 parent 2e6c87e commit 82e8498
3 files changed
Lines changed: 103 additions & 31 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1434 | 1434 | | |
1435 | 1435 | | |
1436 | 1436 | | |
| 1437 | + | |
| 1438 | + | |
| 1439 | + | |
| 1440 | + | |
1437 | 1441 | | |
1438 | | - | |
| 1442 | + | |
| 1443 | + | |
| 1444 | + | |
| 1445 | + | |
| 1446 | + | |
| 1447 | + | |
1439 | 1448 | | |
1440 | 1449 | | |
1441 | 1450 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
267 | 267 | | |
268 | 268 | | |
269 | 269 | | |
270 | | - | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
271 | 280 | | |
272 | 281 | | |
273 | 282 | | |
| |||
340 | 349 | | |
341 | 350 | | |
342 | 351 | | |
343 | | - | |
| 352 | + | |
344 | 353 | | |
345 | 354 | | |
346 | 355 | | |
| |||
386 | 395 | | |
387 | 396 | | |
388 | 397 | | |
389 | | - | |
| 398 | + | |
| 399 | + | |
390 | 400 | | |
391 | 401 | | |
392 | 402 | | |
| |||
882 | 892 | | |
883 | 893 | | |
884 | 894 | | |
885 | | - | |
886 | | - | |
887 | | - | |
888 | | - | |
889 | | - | |
| 895 | + | |
| 896 | + | |
| 897 | + | |
890 | 898 | | |
891 | | - | |
892 | | - | |
| 899 | + | |
893 | 900 | | |
894 | 901 | | |
895 | 902 | | |
| |||
908 | 915 | | |
909 | 916 | | |
910 | 917 | | |
911 | | - | |
912 | | - | |
| 918 | + | |
| 919 | + | |
| 920 | + | |
913 | 921 | | |
914 | | - | |
915 | | - | |
916 | | - | |
917 | | - | |
918 | | - | |
| 922 | + | |
919 | 923 | | |
920 | 924 | | |
921 | 925 | | |
| |||
931 | 935 | | |
932 | 936 | | |
933 | 937 | | |
934 | | - | |
| 938 | + | |
| 939 | + | |
| 940 | + | |
| 941 | + | |
| 942 | + | |
| 943 | + | |
| 944 | + | |
935 | 945 | | |
936 | 946 | | |
937 | 947 | | |
| |||
948 | 958 | | |
949 | 959 | | |
950 | 960 | | |
| 961 | + | |
| 962 | + | |
951 | 963 | | |
952 | 964 | | |
953 | 965 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
956 | 956 | | |
957 | 957 | | |
958 | 958 | | |
| 959 | + | |
| 960 | + | |
| 961 | + | |
| 962 | + | |
| 963 | + | |
| 964 | + | |
| 965 | + | |
| 966 | + | |
| 967 | + | |
| 968 | + | |
| 969 | + | |
| 970 | + | |
| 971 | + | |
| 972 | + | |
| 973 | + | |
| 974 | + | |
| 975 | + | |
| 976 | + | |
| 977 | + | |
| 978 | + | |
| 979 | + | |
| 980 | + | |
| 981 | + | |
| 982 | + | |
| 983 | + | |
| 984 | + | |
| 985 | + | |
| 986 | + | |
| 987 | + | |
| 988 | + | |
| 989 | + | |
| 990 | + | |
| 991 | + | |
| 992 | + | |
| 993 | + | |
| 994 | + | |
| 995 | + | |
| 996 | + | |
| 997 | + | |
| 998 | + | |
| 999 | + | |
| 1000 | + | |
| 1001 | + | |
| 1002 | + | |
| 1003 | + | |
| 1004 | + | |
| 1005 | + | |
| 1006 | + | |
| 1007 | + | |
| 1008 | + | |
| 1009 | + | |
| 1010 | + | |
| 1011 | + | |
| 1012 | + | |
| 1013 | + | |
| 1014 | + | |
| 1015 | + | |
| 1016 | + | |
| 1017 | + | |
| 1018 | + | |
| 1019 | + | |
| 1020 | + | |
959 | 1021 | | |
960 | 1022 | | |
961 | 1023 | | |
| |||
3452 | 3514 | | |
3453 | 3515 | | |
3454 | 3516 | | |
3455 | | - | |
3456 | | - | |
3457 | 3517 | | |
3458 | 3518 | | |
3459 | 3519 | | |
3460 | 3520 | | |
3461 | | - | |
3462 | | - | |
3463 | | - | |
3464 | | - | |
3465 | | - | |
3466 | | - | |
3467 | | - | |
3468 | | - | |
3469 | | - | |
3470 | | - | |
| 3521 | + | |
3471 | 3522 | | |
3472 | 3523 | | |
3473 | 3524 | | |
| |||
0 commit comments