mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
Simplify implementation of hashtable.c
Issue #26588: Remove copy_data, free_data and get_data_size callbacks from hashtable.h. These callbacks are not used in Python and makes the code more complex. Remove also the _Py_HASHTABLE_ENTRY_DATA_AS_VOID_P() macro which uses an unsafe pointer dereference (can cause memory alignment issue). Replace the macro usage with _Py_HASHTABLE_ENTRY_READ_DATA() which is implemented with the safe memcpy() function.
This commit is contained in:
parent
0b2d71bc70
commit
c9553876ae
3 changed files with 17 additions and 66 deletions
|
@ -220,16 +220,15 @@ hashtable_compare_unicode(size_t key_size, const void *pkey,
|
|||
return key == entry_key;
|
||||
}
|
||||
|
||||
static _Py_hashtable_allocator_t hashtable_alloc = {malloc, free};
|
||||
|
||||
static _Py_hashtable_t *
|
||||
hashtable_new(size_t key_size, size_t data_size,
|
||||
_Py_hashtable_hash_func hash_func,
|
||||
_Py_hashtable_compare_func compare_func)
|
||||
{
|
||||
_Py_hashtable_allocator_t hashtable_alloc = {malloc, free};
|
||||
return _Py_hashtable_new_full(key_size, data_size, 0,
|
||||
hash_func, compare_func,
|
||||
NULL, NULL, NULL, &hashtable_alloc);
|
||||
&hashtable_alloc);
|
||||
}
|
||||
|
||||
static void*
|
||||
|
@ -1120,7 +1119,8 @@ tracemalloc_pyobject_decref_cb(_Py_hashtable_t *tracebacks,
|
|||
_Py_hashtable_entry_t *entry,
|
||||
void *user_data)
|
||||
{
|
||||
PyObject *obj = (PyObject *)_Py_HASHTABLE_ENTRY_DATA_AS_VOID_P(tracebacks, entry);
|
||||
PyObject *obj;
|
||||
_Py_HASHTABLE_ENTRY_READ_DATA(tracebacks, entry, sizeof(obj), &obj);
|
||||
Py_DECREF(obj);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1151,7 +1151,8 @@ py_tracemalloc_get_traces(PyObject *self, PyObject *obj)
|
|||
|
||||
/* the traceback hash table is used temporarily to intern traceback tuple
|
||||
of (filename, lineno) tuples */
|
||||
get_traces.tracebacks = hashtable_new(sizeof(traceback_t *), sizeof(PyObject *),
|
||||
get_traces.tracebacks = hashtable_new(sizeof(traceback_t *),
|
||||
sizeof(PyObject *),
|
||||
_Py_hashtable_hash_ptr,
|
||||
_Py_hashtable_compare_direct);
|
||||
if (get_traces.tracebacks == NULL) {
|
||||
|
@ -1186,8 +1187,9 @@ finally:
|
|||
tracemalloc_pyobject_decref_cb, NULL);
|
||||
_Py_hashtable_destroy(get_traces.tracebacks);
|
||||
}
|
||||
if (get_traces.traces != NULL)
|
||||
if (get_traces.traces != NULL) {
|
||||
_Py_hashtable_destroy(get_traces.traces);
|
||||
}
|
||||
|
||||
return get_traces.list;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue