From 1153e99fa8ae4793a19fe7fcffe9c28bf0552ffe Mon Sep 17 00:00:00 2001 From: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com> Date: Sat, 12 Nov 2022 08:06:20 +0000 Subject: [PATCH 1/3] remove static state from suggestions --- Python/suggestions.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Python/suggestions.c b/Python/suggestions.c index ad645c7d96fa57..ef84b66c491a6f 100644 --- a/Python/suggestions.c +++ b/Python/suggestions.c @@ -43,7 +43,7 @@ levenshtein_distance(const char *a, size_t a_size, const char *b, size_t b_size, size_t max_cost) { - static size_t buffer[MAX_STRING_SIZE]; + size_t buffer[MAX_STRING_SIZE] = {0}; // Both strings are the same (by identity) if (a == b) { @@ -238,7 +238,7 @@ get_suggestions_for_name_error(PyObject* name, PyFrameObject* frame) if (!self) { goto error; } - + if (PyObject_HasAttr(self, name)) { Py_DECREF(dir); return PyUnicode_FromFormat("self.%S", name); From 819e051fae24fa6364acad6c2ac19ce5d99424ef Mon Sep 17 00:00:00 2001 From: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com> Date: Sun, 13 Nov 2022 09:31:57 +0000 Subject: [PATCH 2/3] use heap for buffer --- Python/suggestions.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/Python/suggestions.c b/Python/suggestions.c index ef84b66c491a6f..851bbff2377843 100644 --- a/Python/suggestions.c +++ b/Python/suggestions.c @@ -41,10 +41,8 @@ substitution_cost(char a, char b) static Py_ssize_t levenshtein_distance(const char *a, size_t a_size, const char *b, size_t b_size, - size_t max_cost) + size_t max_cost, size_t *buffer) { - size_t buffer[MAX_STRING_SIZE] = {0}; - // Both strings are the same (by identity) if (a == b) { return 0; @@ -147,7 +145,10 @@ calculate_suggestions(PyObject *dir, if (name_str == NULL) { return NULL; } - + size_t *buffer = PyMem_New(size_t, MAX_STRING_SIZE); + if (buffer == NULL) { + return PyErr_NoMemory(); + } for (int i = 0; i < dir_size; ++i) { PyObject *item = PyList_GET_ITEM(dir, i); Py_ssize_t item_size; @@ -163,8 +164,8 @@ calculate_suggestions(PyObject *dir, // Don't take matches we've already beaten. max_distance = Py_MIN(max_distance, suggestion_distance - 1); Py_ssize_t current_distance = - levenshtein_distance(name_str, name_size, - item_str, item_size, max_distance); + levenshtein_distance(name_str, name_size, item_str, + item_size, max_distance, buffer); if (current_distance > max_distance) { continue; } @@ -173,6 +174,7 @@ calculate_suggestions(PyObject *dir, suggestion_distance = current_distance; } } + PyMem_Free(buffer); return Py_XNewRef(suggestion); } @@ -401,6 +403,14 @@ _Py_UTF8_Edit_Cost(PyObject *a, PyObject *b, Py_ssize_t max_cost) if (max_cost == -1) { max_cost = MOVE_COST * Py_MAX(size_a, size_b); } - return levenshtein_distance(utf8_a, size_a, utf8_b, size_b, max_cost); + size_t *buffer = PyMem_New(size_t, MAX_STRING_SIZE); + if (buffer == NULL) { + PyErr_NoMemory(); + return -1; + } + Py_ssize_t res = levenshtein_distance(utf8_a, size_a, + utf8_b, size_b, max_cost, buffer); + PyMem_Free(buffer); + return res; } From 0dfd101de35cb51810c116189a76b5a200a8bd63 Mon Sep 17 00:00:00 2001 From: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com> Date: Sun, 13 Nov 2022 09:37:24 +0000 Subject: [PATCH 3/3] fix error handling --- Python/suggestions.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Python/suggestions.c b/Python/suggestions.c index 851bbff2377843..f2c018ef2c4533 100644 --- a/Python/suggestions.c +++ b/Python/suggestions.c @@ -154,6 +154,7 @@ calculate_suggestions(PyObject *dir, Py_ssize_t item_size; const char *item_str = PyUnicode_AsUTF8AndSize(item, &item_size); if (item_str == NULL) { + PyMem_Free(buffer); return NULL; } if (PyUnicode_CompareWithASCIIString(name, item_str) == 0) {