|
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