]> granicus.if.org Git - python/commitdiff
Issue #26588:
authorVictor Stinner <victor.stinner@gmail.com>
Wed, 23 Mar 2016 08:25:01 +0000 (09:25 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Wed, 23 Mar 2016 08:25:01 +0000 (09:25 +0100)
* _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

Modules/_tracemalloc.c
Modules/hashtable.c
Modules/hashtable.h
Python/marshal.c

index 139b16963c92a4e3de18be1ee70b4c43d5208500..0bab540ee1a6a4296970254277a7f06c769b6c0a 100644 (file)
@@ -1263,7 +1263,7 @@ tracemalloc_pyobject_decref_cb(_Py_hashtable_t *tracebacks,
                                void *user_data)
 {
     PyObject *obj;
-    _Py_HASHTABLE_ENTRY_READ_DATA(tracebacks, entry, sizeof(obj), &obj);
+    _Py_HASHTABLE_ENTRY_READ_DATA(tracebacks, entry, obj);
     Py_DECREF(obj);
     return 0;
 }
index bb20cce58914363530c183cd7d7e220c90479c96..d80acc6b217139c537c6b5abd4585a1cb2c78621 100644 (file)
@@ -287,7 +287,7 @@ _Py_hashtable_pop_entry(_Py_hashtable_t *ht, size_t key_size, const void *pkey,
     ht->entries--;
 
     if (data != NULL)
-        _Py_HASHTABLE_ENTRY_READ_DATA(ht, entry, data_size, data);
+        _Py_HASHTABLE_ENTRY_READ_PDATA(ht, entry, data_size, data);
     ht->alloc.free(entry);
 
     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,
     }
 
     entry->key_hash = key_hash;
-    memcpy((void *)_Py_HASHTABLE_ENTRY_KEY(entry), pkey, key_size);
-
-    assert(data_size == ht->data_size);
-    memcpy(_Py_HASHTABLE_ENTRY_DATA(ht, entry), data, data_size);
+    _Py_HASHTABLE_ENTRY_WRITE_PKEY(key_size, entry, pkey);
+    _Py_HASHTABLE_ENTRY_WRITE_PDATA(ht, entry, data_size, data);
 
     _Py_slist_prepend(&ht->buckets[index], (_Py_slist_item_t*)entry);
     ht->entries++;
@@ -350,7 +348,7 @@ _Py_hashtable_get(_Py_hashtable_t *ht, size_t key_size,const void *pkey,
     entry = _Py_hashtable_get_entry(ht, key_size, pkey);
     if (entry == NULL)
         return 0;
-    _Py_HASHTABLE_ENTRY_READ_DATA(ht, entry, data_size, data);
+    _Py_HASHTABLE_ENTRY_READ_PDATA(ht, entry, data_size, data);
     return 1;
 }
 
index 4199aab3147fc4dd398547e54657004d25e3b207..9c3fbdd6712b91784f0822dfdef69aa11709a334 100644 (file)
@@ -30,10 +30,13 @@ typedef struct {
 } _Py_hashtable_entry_t;
 
 #define _Py_HASHTABLE_ENTRY_KEY(ENTRY) \
-        ((const void *)((char *)(ENTRY) + sizeof(_Py_hashtable_entry_t)))
+        ((const void *)((char *)(ENTRY) \
+                        + sizeof(_Py_hashtable_entry_t)))
 
 #define _Py_HASHTABLE_ENTRY_DATA(TABLE, ENTRY) \
-        ((char *)(ENTRY) + sizeof(_Py_hashtable_entry_t) + (TABLE)->key_size)
+        ((const void *)((char *)(ENTRY) \
+                        + sizeof(_Py_hashtable_entry_t) \
+                        + (TABLE)->key_size))
 
 /* Get a key value from pkey: use memcpy() rather than a pointer dereference
    to avoid memory alignment issues. */
@@ -49,10 +52,26 @@ typedef struct {
         memcpy(&(KEY), _Py_HASHTABLE_ENTRY_KEY(ENTRY), sizeof(KEY)); \
     } while (0)
 
-#define _Py_HASHTABLE_ENTRY_READ_DATA(TABLE, ENTRY, DATA_SIZE, DATA) \
+#define _Py_HASHTABLE_ENTRY_WRITE_PKEY(KEY_SIZE, ENTRY, PKEY) \
+    do { \
+        memcpy((void *)_Py_HASHTABLE_ENTRY_KEY(ENTRY), (PKEY), (KEY_SIZE)); \
+    } while (0)
+
+#define _Py_HASHTABLE_ENTRY_READ_PDATA(TABLE, ENTRY, DATA_SIZE, PDATA) \
+    do { \
+        assert((DATA_SIZE) == (TABLE)->data_size); \
+        memcpy((PDATA), _Py_HASHTABLE_ENTRY_DATA(TABLE, (ENTRY)), \
+               (DATA_SIZE)); \
+    } while (0)
+
+#define _Py_HASHTABLE_ENTRY_READ_DATA(TABLE, ENTRY, DATA) \
+    _Py_HASHTABLE_ENTRY_READ_PDATA((TABLE), (ENTRY), sizeof(DATA), &(DATA))
+
+#define _Py_HASHTABLE_ENTRY_WRITE_PDATA(TABLE, ENTRY, DATA_SIZE, PDATA) \
     do { \
         assert((DATA_SIZE) == (TABLE)->data_size); \
-        memcpy(DATA, _Py_HASHTABLE_ENTRY_DATA(TABLE, ENTRY), DATA_SIZE); \
+        memcpy((void *)_Py_HASHTABLE_ENTRY_DATA((TABLE), (ENTRY)), \
+               (PDATA), (DATA_SIZE)); \
     } while (0)
 
 
index 83a1885181d68689ff87156047ddfe74bdcb3163..3be77a82f4353c5bd253fbed1802300ae9527a31 100644 (file)
@@ -266,7 +266,7 @@ w_ref(PyObject *v, char *flag, WFILE *p)
     entry = _Py_HASHTABLE_GET_ENTRY(p->hashtable, v);
     if (entry != NULL) {
         /* write the reference index to the stream */
-        _Py_HASHTABLE_ENTRY_READ_DATA(p->hashtable, entry, sizeof(w), &w);
+        _Py_HASHTABLE_ENTRY_READ_DATA(p->hashtable, entry, w);
         /* we don't store "long" indices in the dict */
         assert(0 <= w && w <= 0x7fffffff);
         w_byte(TYPE_REF, p);