diff --git a/Python/getargs.c b/Python/getargs.c --- a/Python/getargs.c +++ b/Python/getargs.c @@ -48,6 +48,7 @@ typedef struct { typedef struct { int first_available; freelistentry_t *entries; + int entries_malloced; } freelist_t; @@ -187,7 +188,8 @@ cleanreturn(int retval, freelist_t *free freelist->entries[index].item); } } - PyMem_FREE(freelist->entries); + if (freelist->entries_malloced) + PyMem_FREE(freelist->entries); return retval; } @@ -197,6 +199,8 @@ vgetargs1(PyObject *args, const char *fo { char msgbuf[256]; int levels[32]; + freelistentry_t static_entries[8]; + freelist_t freelist = {0, static_entries, 0}; const char *fname = NULL; const char *message = NULL; int min = -1; @@ -206,7 +210,6 @@ vgetargs1(PyObject *args, const char *fo const char *formatsave = format; Py_ssize_t i, len; char *msg; - freelist_t freelist = {0, NULL}; int compat = flags & FLAG_COMPAT; assert(compat || (args != (PyObject*)NULL)); @@ -240,15 +243,15 @@ vgetargs1(PyObject *args, const char *fo message = format; endfmt = 1; break; + case '|': + if (level == 0) + min = max; + break; default: if (level == 0) { - if (c == 'O') - max++; - else if (isalpha(Py_CHARMASK(c))) { + if (Py_ISALPHA(Py_CHARMASK(c))) if (c != 'e') /* skip encoded */ max++; - } else if (c == '|') - min = max; } break; } @@ -262,10 +265,13 @@ vgetargs1(PyObject *args, const char *fo format = formatsave; - freelist.entries = PyMem_NEW(freelistentry_t, max); - if (freelist.entries == NULL) { - PyErr_NoMemory(); - return 0; + if (max > 8) { + freelist.entries = PyMem_NEW(freelistentry_t, max); + if (freelist.entries == NULL) { + PyErr_NoMemory(); + return 0; + } + freelist.entries_malloced = 1; } if (compat) { @@ -336,7 +342,7 @@ vgetargs1(PyObject *args, const char *fo } } - if (*format != '\0' && !isalpha(Py_CHARMASK(*format)) && + if (*format != '\0' && !Py_ISALPHA(Py_CHARMASK(*format)) && *format != '(' && *format != '|' && *format != ':' && *format != ';') { PyErr_Format(PyExc_SystemError, @@ -429,7 +435,7 @@ converttuple(PyObject *arg, const char * } else if (c == ':' || c == ';' || c == '\0') break; - else if (level == 0 && isalpha(Py_CHARMASK(c))) + else if (level == 0 && Py_ISALPHA(Py_CHARMASK(c))) n++; }