|
10 | 10 | /* Holder for co_extra information */ |
11 | 11 | typedef struct { |
12 | 12 | Py_ssize_t ce_size; |
13 | | - void **ce_extras; |
| 13 | + void *ce_extras[1]; |
14 | 14 | } _PyCodeObjectExtra; |
15 | 15 |
|
16 | 16 | /* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */ |
@@ -427,7 +427,6 @@ code_dealloc(PyCodeObject *co) |
427 | 427 | } |
428 | 428 | } |
429 | 429 |
|
430 | | - PyMem_Free(co_extra->ce_extras); |
431 | 430 | PyMem_Free(co_extra); |
432 | 431 | } |
433 | 432 |
|
@@ -455,12 +454,13 @@ code_sizeof(PyCodeObject *co, void *unused) |
455 | 454 | Py_ssize_t res = _PyObject_SIZE(Py_TYPE(co)); |
456 | 455 | _PyCodeObjectExtra *co_extra = (_PyCodeObjectExtra*) co->co_extra; |
457 | 456 |
|
458 | | - if (co->co_cell2arg != NULL && co->co_cellvars != NULL) |
| 457 | + if (co->co_cell2arg != NULL && co->co_cellvars != NULL) { |
459 | 458 | res += PyTuple_GET_SIZE(co->co_cellvars) * sizeof(Py_ssize_t); |
460 | | - |
461 | | - if (co_extra != NULL) |
462 | | - res += co_extra->ce_size * sizeof(co_extra->ce_extras[0]); |
463 | | - |
| 459 | + } |
| 460 | + if (co_extra != NULL) { |
| 461 | + res += sizeof(_PyCodeObjectExtra) + |
| 462 | + (co_extra->ce_size-1) * sizeof(co_extra->ce_extras[0]); |
| 463 | + } |
464 | 464 | return PyLong_FromSsize_t(res); |
465 | 465 | } |
466 | 466 |
|
@@ -863,48 +863,24 @@ _PyCode_SetExtra(PyObject *code, Py_ssize_t index, void *extra) |
863 | 863 | PyCodeObject *o = (PyCodeObject*) code; |
864 | 864 | _PyCodeObjectExtra *co_extra = (_PyCodeObjectExtra *) o->co_extra; |
865 | 865 |
|
866 | | - if (co_extra == NULL) { |
867 | | - co_extra = PyMem_Malloc(sizeof(_PyCodeObjectExtra)); |
| 866 | + if (co_extra == NULL || co_extra->ce_size <= index) { |
| 867 | + Py_ssize_t i = (co_extra == NULL ? 0 : co_extra->ce_size); |
| 868 | + co_extra = PyMem_Realloc( |
| 869 | + co_extra, |
| 870 | + sizeof(_PyCodeObjectExtra) + |
| 871 | + (interp->co_extra_user_count-1) * sizeof(void*)); |
868 | 872 | if (co_extra == NULL) { |
869 | 873 | return -1; |
870 | 874 | } |
871 | | - |
872 | | - co_extra->ce_extras = PyMem_Malloc( |
873 | | - interp->co_extra_user_count * sizeof(void*)); |
874 | | - if (co_extra->ce_extras == NULL) { |
875 | | - PyMem_Free(co_extra); |
876 | | - return -1; |
877 | | - } |
878 | | - |
879 | | - co_extra->ce_size = interp->co_extra_user_count; |
880 | | - |
881 | | - for (Py_ssize_t i = 0; i < co_extra->ce_size; i++) { |
| 875 | + for (; i < interp->co_extra_user_count; i++) { |
882 | 876 | co_extra->ce_extras[i] = NULL; |
883 | 877 | } |
884 | | - |
885 | | - o->co_extra = co_extra; |
886 | | - } |
887 | | - else if (co_extra->ce_size <= index) { |
888 | | - void** ce_extras = PyMem_Realloc( |
889 | | - co_extra->ce_extras, interp->co_extra_user_count * sizeof(void*)); |
890 | | - |
891 | | - if (ce_extras == NULL) { |
892 | | - return -1; |
893 | | - } |
894 | | - |
895 | | - for (Py_ssize_t i = co_extra->ce_size; |
896 | | - i < interp->co_extra_user_count; |
897 | | - i++) { |
898 | | - ce_extras[i] = NULL; |
899 | | - } |
900 | | - |
901 | | - co_extra->ce_extras = ce_extras; |
902 | 878 | co_extra->ce_size = interp->co_extra_user_count; |
| 879 | + o->co_extra = co_extra; |
903 | 880 | } |
904 | 881 |
|
905 | 882 | if (co_extra->ce_extras[index] != NULL) { |
906 | 883 | freefunc free = interp->co_extra_freefuncs[index]; |
907 | | - |
908 | 884 | if (free != NULL) { |
909 | 885 | free(co_extra->ce_extras[index]); |
910 | 886 | } |
|
0 commit comments