]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] gh-46376: Revert "Return existing pointer when possible in ctypes (GH-107131...
authorŁukasz Langa <lukasz@langa.pl>
Mon, 4 Sep 2023 14:24:16 +0000 (16:24 +0200)
committerGitHub <noreply@github.com>
Mon, 4 Sep 2023 14:24:16 +0000 (16:24 +0200)
This reverts commit 54aaaadef8a44324f6be674707c67a3516470ff6.

Co-authored-by: T. Wouters <thomas@python.org>
Lib/test/test_ctypes/test_keeprefs.py
Modules/_ctypes/_ctypes.c

index 61650ad1704753d33e4f1e140d53e5850e4cca26..e20adc7696f501ceab83ea2b6b1337f0ed80071b 100644 (file)
@@ -93,33 +93,6 @@ class PointerTestCase(unittest.TestCase):
         x = pointer(i)
         self.assertEqual(x._objects, {'1': i})
 
-    def test_pp_ownership(self):
-        d = c_int(123)
-        n = c_int(456)
-
-        p = pointer(d)
-        pp = pointer(p)
-
-        self.assertIs(pp._objects['1'], p)
-        self.assertIs(pp._objects['0']['1'], d)
-
-        pp.contents.contents = n
-
-        self.assertIs(pp._objects['1'], p)
-        self.assertIs(pp._objects['0']['1'], n)
-
-        self.assertIs(p._objects['1'], n)
-        self.assertEqual(len(p._objects), 1)
-
-        del d
-        del p
-
-        self.assertIs(pp._objects['0']['1'], n)
-        self.assertEqual(len(pp._objects), 2)
-
-        del n
-
-        self.assertEqual(len(pp._objects), 2)
 
 class PointerToStructure(unittest.TestCase):
     def test(self):
index 8496077322a662ee7880ed59dc2e62eb5029d461..534ef8c1d6cf8f4b9e4bc027c09036d266006baf 100644 (file)
@@ -5122,8 +5122,6 @@ static PyObject *
 Pointer_get_contents(CDataObject *self, void *closure)
 {
     StgDictObject *stgdict;
-    PyObject *keep, *ptr_probe;
-    CDataObject *ptr2ptr;
 
     if (*(void **)self->b_ptr == NULL) {
         PyErr_SetString(PyExc_ValueError,
@@ -5133,33 +5131,6 @@ Pointer_get_contents(CDataObject *self, void *closure)
 
     stgdict = PyObject_stgdict((PyObject *)self);
     assert(stgdict); /* Cannot be NULL for pointer instances */
-
-    keep = GetKeepedObjects(self);
-    if (keep != NULL) {
-        // check if it's a pointer to a pointer:
-        // pointers will have '0' key in the _objects
-        ptr_probe = PyDict_GetItemString(keep, "0");
-
-        if (ptr_probe != NULL) {
-            ptr2ptr = (CDataObject*) PyDict_GetItemString(keep, "1");
-            if (ptr2ptr ==  NULL) {
-                PyErr_SetString(PyExc_ValueError,
-                "Unexpected NULL pointer in _objects");
-                return NULL;
-            }
-            // don't construct a new object,
-            // return existing one instead to preserve refcount
-            assert(
-                *(void**) self->b_ptr == ptr2ptr->b_ptr ||
-                *(void**) self->b_value.c == ptr2ptr->b_ptr ||
-                *(void**) self->b_ptr == ptr2ptr->b_value.c ||
-                *(void**) self->b_value.c == ptr2ptr->b_value.c
-            ); // double-check that we are returning the same thing
-            Py_INCREF(ptr2ptr);
-            return (PyObject *) ptr2ptr;
-        }
-    }
-
     return PyCData_FromBaseObj(stgdict->proto,
                              (PyObject *)self, 0,
                              *(void **)self->b_ptr);