@@ -41,10 +41,8 @@ substitution_cost(char a, char b)
41
41
static Py_ssize_t
42
42
levenshtein_distance (const char * a , size_t a_size ,
43
43
const char * b , size_t b_size ,
44
- size_t max_cost )
44
+ size_t max_cost , size_t * buffer )
45
45
{
46
- static size_t buffer [MAX_STRING_SIZE ];
47
-
48
46
// Both strings are the same (by identity)
49
47
if (a == b ) {
50
48
return 0 ;
@@ -147,12 +145,16 @@ calculate_suggestions(PyObject *dir,
147
145
if (name_str == NULL ) {
148
146
return NULL ;
149
147
}
150
-
148
+ size_t * buffer = PyMem_New (size_t , MAX_STRING_SIZE );
149
+ if (buffer == NULL ) {
150
+ return PyErr_NoMemory ();
151
+ }
151
152
for (int i = 0 ; i < dir_size ; ++ i ) {
152
153
PyObject * item = PyList_GET_ITEM (dir , i );
153
154
Py_ssize_t item_size ;
154
155
const char * item_str = PyUnicode_AsUTF8AndSize (item , & item_size );
155
156
if (item_str == NULL ) {
157
+ PyMem_Free (buffer );
156
158
return NULL ;
157
159
}
158
160
if (PyUnicode_CompareWithASCIIString (name , item_str ) == 0 ) {
@@ -163,8 +165,8 @@ calculate_suggestions(PyObject *dir,
163
165
// Don't take matches we've already beaten.
164
166
max_distance = Py_MIN (max_distance , suggestion_distance - 1 );
165
167
Py_ssize_t current_distance =
166
- levenshtein_distance (name_str , name_size ,
167
- item_str , item_size , max_distance );
168
+ levenshtein_distance (name_str , name_size , item_str ,
169
+ item_size , max_distance , buffer );
168
170
if (current_distance > max_distance ) {
169
171
continue ;
170
172
}
@@ -173,6 +175,7 @@ calculate_suggestions(PyObject *dir,
173
175
suggestion_distance = current_distance ;
174
176
}
175
177
}
178
+ PyMem_Free (buffer );
176
179
return Py_XNewRef (suggestion );
177
180
}
178
181
@@ -238,7 +241,7 @@ get_suggestions_for_name_error(PyObject* name, PyFrameObject* frame)
238
241
if (!self ) {
239
242
goto error ;
240
243
}
241
-
244
+
242
245
if (PyObject_HasAttr (self , name )) {
243
246
Py_DECREF (dir );
244
247
return PyUnicode_FromFormat ("self.%S" , name );
@@ -401,6 +404,14 @@ _Py_UTF8_Edit_Cost(PyObject *a, PyObject *b, Py_ssize_t max_cost)
401
404
if (max_cost == -1 ) {
402
405
max_cost = MOVE_COST * Py_MAX (size_a , size_b );
403
406
}
404
- return levenshtein_distance (utf8_a , size_a , utf8_b , size_b , max_cost );
407
+ size_t * buffer = PyMem_New (size_t , MAX_STRING_SIZE );
408
+ if (buffer == NULL ) {
409
+ PyErr_NoMemory ();
410
+ return -1 ;
411
+ }
412
+ Py_ssize_t res = levenshtein_distance (utf8_a , size_a ,
413
+ utf8_b , size_b , max_cost , buffer );
414
+ PyMem_Free (buffer );
415
+ return res ;
405
416
}
406
417
0 commit comments