Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e8c6b2f

Browse files
committed
Issue #26588:
* _Py_HASHTABLE_ENTRY_DATA: change type from "char *" to "const void *" * Add _Py_HASHTABLE_ENTRY_WRITE_PKEY() macro * Rename _Py_HASHTABLE_ENTRY_WRITE_DATA() macro to _Py_HASHTABLE_ENTRY_WRITE_PDATA() * Add _Py_HASHTABLE_ENTRY_WRITE_DATA() macro
1 parent 42bcf37 commit e8c6b2f

4 files changed

Lines changed: 29 additions & 12 deletions

File tree

Modules/_tracemalloc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1263,7 +1263,7 @@ tracemalloc_pyobject_decref_cb(_Py_hashtable_t *tracebacks,
12631263
void *user_data)
12641264
{
12651265
PyObject *obj;
1266-
_Py_HASHTABLE_ENTRY_READ_DATA(tracebacks, entry, sizeof(obj), &obj);
1266+
_Py_HASHTABLE_ENTRY_READ_DATA(tracebacks, entry, obj);
12671267
Py_DECREF(obj);
12681268
return 0;
12691269
}

Modules/hashtable.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ _Py_hashtable_pop_entry(_Py_hashtable_t *ht, size_t key_size, const void *pkey,
287287
ht->entries--;
288288

289289
if (data != NULL)
290-
_Py_HASHTABLE_ENTRY_READ_DATA(ht, entry, data_size, data);
290+
_Py_HASHTABLE_ENTRY_READ_PDATA(ht, entry, data_size, data);
291291
ht->alloc.free(entry);
292292

293293
if ((float)ht->entries / (float)ht->num_buckets < HASHTABLE_LOW)
@@ -325,10 +325,8 @@ _Py_hashtable_set(_Py_hashtable_t *ht, size_t key_size, const void *pkey,
325325
}
326326

327327
entry->key_hash = key_hash;
328-
memcpy((void *)_Py_HASHTABLE_ENTRY_KEY(entry), pkey, key_size);
329-
330-
assert(data_size == ht->data_size);
331-
memcpy(_Py_HASHTABLE_ENTRY_DATA(ht, entry), data, data_size);
328+
_Py_HASHTABLE_ENTRY_WRITE_PKEY(key_size, entry, pkey);
329+
_Py_HASHTABLE_ENTRY_WRITE_PDATA(ht, entry, data_size, data);
332330

333331
_Py_slist_prepend(&ht->buckets[index], (_Py_slist_item_t*)entry);
334332
ht->entries++;
@@ -350,7 +348,7 @@ _Py_hashtable_get(_Py_hashtable_t *ht, size_t key_size,const void *pkey,
350348
entry = _Py_hashtable_get_entry(ht, key_size, pkey);
351349
if (entry == NULL)
352350
return 0;
353-
_Py_HASHTABLE_ENTRY_READ_DATA(ht, entry, data_size, data);
351+
_Py_HASHTABLE_ENTRY_READ_PDATA(ht, entry, data_size, data);
354352
return 1;
355353
}
356354

Modules/hashtable.h

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,13 @@ typedef struct {
3030
} _Py_hashtable_entry_t;
3131

3232
#define _Py_HASHTABLE_ENTRY_KEY(ENTRY) \
33-
((const void *)((char *)(ENTRY) + sizeof(_Py_hashtable_entry_t)))
33+
((const void *)((char *)(ENTRY) \
34+
+ sizeof(_Py_hashtable_entry_t)))
3435

3536
#define _Py_HASHTABLE_ENTRY_DATA(TABLE, ENTRY) \
36-
((char *)(ENTRY) + sizeof(_Py_hashtable_entry_t) + (TABLE)->key_size)
37+
((const void *)((char *)(ENTRY) \
38+
+ sizeof(_Py_hashtable_entry_t) \
39+
+ (TABLE)->key_size))
3740

3841
/* Get a key value from pkey: use memcpy() rather than a pointer dereference
3942
to avoid memory alignment issues. */
@@ -49,10 +52,26 @@ typedef struct {
4952
memcpy(&(KEY), _Py_HASHTABLE_ENTRY_KEY(ENTRY), sizeof(KEY)); \
5053
} while (0)
5154

52-
#define _Py_HASHTABLE_ENTRY_READ_DATA(TABLE, ENTRY, DATA_SIZE, DATA) \
55+
#define _Py_HASHTABLE_ENTRY_WRITE_PKEY(KEY_SIZE, ENTRY, PKEY) \
56+
do { \
57+
memcpy((void *)_Py_HASHTABLE_ENTRY_KEY(ENTRY), (PKEY), (KEY_SIZE)); \
58+
} while (0)
59+
60+
#define _Py_HASHTABLE_ENTRY_READ_PDATA(TABLE, ENTRY, DATA_SIZE, PDATA) \
61+
do { \
62+
assert((DATA_SIZE) == (TABLE)->data_size); \
63+
memcpy((PDATA), _Py_HASHTABLE_ENTRY_DATA(TABLE, (ENTRY)), \
64+
(DATA_SIZE)); \
65+
} while (0)
66+
67+
#define _Py_HASHTABLE_ENTRY_READ_DATA(TABLE, ENTRY, DATA) \
68+
_Py_HASHTABLE_ENTRY_READ_PDATA((TABLE), (ENTRY), sizeof(DATA), &(DATA))
69+
70+
#define _Py_HASHTABLE_ENTRY_WRITE_PDATA(TABLE, ENTRY, DATA_SIZE, PDATA) \
5371
do { \
5472
assert((DATA_SIZE) == (TABLE)->data_size); \
55-
memcpy(DATA, _Py_HASHTABLE_ENTRY_DATA(TABLE, ENTRY), DATA_SIZE); \
73+
memcpy((void *)_Py_HASHTABLE_ENTRY_DATA((TABLE), (ENTRY)), \
74+
(PDATA), (DATA_SIZE)); \
5675
} while (0)
5776

5877

Python/marshal.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ w_ref(PyObject *v, char *flag, WFILE *p)
266266
entry = _Py_HASHTABLE_GET_ENTRY(p->hashtable, v);
267267
if (entry != NULL) {
268268
/* write the reference index to the stream */
269-
_Py_HASHTABLE_ENTRY_READ_DATA(p->hashtable, entry, sizeof(w), &w);
269+
_Py_HASHTABLE_ENTRY_READ_DATA(p->hashtable, entry, w);
270270
/* we don't store "long" indices in the dict */
271271
assert(0 <= w && w <= 0x7fffffff);
272272
w_byte(TYPE_REF, p);

0 commit comments

Comments
 (0)