]> granicus.if.org Git - python/commitdiff
Fix buildbot issues due to _ctypes failing to compile in 3.1.
authorAntoine Pitrou <solipsis@pitrou.net>
Tue, 10 Aug 2010 00:22:01 +0000 (00:22 +0000)
committerAntoine Pitrou <solipsis@pitrou.net>
Tue, 10 Aug 2010 00:22:01 +0000 (00:22 +0000)
Recorded rollback of revisions 83837,83841 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k

Misc/NEWS
Modules/_ctypes/_ctypes.c
Modules/_ctypes/callbacks.c
Modules/_ctypes/ctypes.h
Modules/_ctypes/libffi/fficonfig.py.in
Modules/_ctypes/libffi_msvc/ffi.c
Modules/_ctypes/libffi_msvc/ffi.h
Modules/_ctypes/malloc_closure.c
setup.py

index a79e4cd8b654f08e037f62df950b40bd9e967918..e5d3c4385009c244e37512c0bda67f4b1a483e58 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -15,11 +15,6 @@ Core and Builtins
 - Issue #5319: Print an error if flushing stdout fails at interpreter
   shutdown.
 
-- Issue #6869: Fix a refcount problem in the _ctypes extension.
-
-- Issue #5504: ctypes should now work with systems where mmap can't
-  be PROT_WRITE and PROT_EXEC.
-
 - Issue #8814: function annotations (the ``__annotations__`` attribute)
   are now included in the set of attributes copied by default by
   functools.wraps and functools.update_wrapper.  Patch by Terrence Cole.
index 3d53a47229b84dd70bfde175a7a07fa444e09937..c1b3093e596f8dd2660181ce4188b0eeafdff7a7 100644 (file)
@@ -3367,7 +3367,7 @@ PyCFuncPtr_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     self->callable = callable;
 
     self->thunk = thunk;
-    *(void **)self->b_ptr = (void *)thunk->pcl_exec;
+    *(void **)self->b_ptr = (void *)thunk->pcl;
 
     Py_INCREF((PyObject *)thunk); /* for KeepRef */
     if (-1 == KeepRef((CDataObject *)self, 0, (PyObject *)thunk)) {
@@ -5326,42 +5326,36 @@ PyInit__ctypes(void)
     Struct_Type.tp_base = &PyCData_Type;
     if (PyType_Ready(&Struct_Type) < 0)
         return NULL;
-    Py_INCREF(&Struct_Type);
     PyModule_AddObject(m, "Structure", (PyObject *)&Struct_Type);
 
     Py_TYPE(&Union_Type) = &UnionType_Type;
     Union_Type.tp_base = &PyCData_Type;
     if (PyType_Ready(&Union_Type) < 0)
         return NULL;
-    Py_INCREF(&Union_Type);
     PyModule_AddObject(m, "Union", (PyObject *)&Union_Type);
 
     Py_TYPE(&PyCPointer_Type) = &PyCPointerType_Type;
     PyCPointer_Type.tp_base = &PyCData_Type;
     if (PyType_Ready(&PyCPointer_Type) < 0)
         return NULL;
-    Py_INCREF(&PyCPointer_Type);
     PyModule_AddObject(m, "_Pointer", (PyObject *)&PyCPointer_Type);
 
     Py_TYPE(&PyCArray_Type) = &PyCArrayType_Type;
     PyCArray_Type.tp_base = &PyCData_Type;
     if (PyType_Ready(&PyCArray_Type) < 0)
         return NULL;
-    Py_INCREF(&PyCArray_Type);
     PyModule_AddObject(m, "Array", (PyObject *)&PyCArray_Type);
 
     Py_TYPE(&Simple_Type) = &PyCSimpleType_Type;
     Simple_Type.tp_base = &PyCData_Type;
     if (PyType_Ready(&Simple_Type) < 0)
         return NULL;
-    Py_INCREF(&Simple_Type);
     PyModule_AddObject(m, "_SimpleCData", (PyObject *)&Simple_Type);
 
     Py_TYPE(&PyCFuncPtr_Type) = &PyCFuncPtrType_Type;
     PyCFuncPtr_Type.tp_base = &PyCData_Type;
     if (PyType_Ready(&PyCFuncPtr_Type) < 0)
         return NULL;
-    Py_INCREF(&PyCFuncPtr_Type);
     PyModule_AddObject(m, "CFuncPtr", (PyObject *)&PyCFuncPtr_Type);
 
     /*************************************************
index dd19d80ef09f6516ac90b82f7f38e6e320938b26..5c82f77c581f690b0ea9c17d623449c02373cddd 100644 (file)
@@ -16,8 +16,8 @@ CThunkObject_dealloc(PyObject *_self)
     Py_XDECREF(self->converters);
     Py_XDECREF(self->callable);
     Py_XDECREF(self->restype);
-    if (self->pcl_write)
-        ffi_closure_free(self->pcl_write);
+    if (self->pcl)
+        _ctypes_free_closure(self->pcl);
     PyObject_GC_Del(self);
 }
 
@@ -370,8 +370,7 @@ static CThunkObject* CThunkObject_new(Py_ssize_t nArgs)
         return NULL;
     }
 
-    p->pcl_exec = NULL;
-    p->pcl_write = NULL;
+    p->pcl = NULL;
     memset(&p->cif, 0, sizeof(p->cif));
     p->converters = NULL;
     p->callable = NULL;
@@ -401,9 +400,8 @@ CThunkObject *_ctypes_alloc_callback(PyObject *callable,
 
     assert(CThunk_CheckExact((PyObject *)p));
 
-    p->pcl_write = ffi_closure_alloc(sizeof(ffi_closure),
-                                                                        &p->pcl_exec);
-    if (p->pcl_write == NULL) {
+    p->pcl = _ctypes_alloc_closure();
+    if (p->pcl == NULL) {
         PyErr_NoMemory();
         goto error;
     }
@@ -448,9 +446,7 @@ CThunkObject *_ctypes_alloc_callback(PyObject *callable,
                      "ffi_prep_cif failed with %d", result);
         goto error;
     }
-    result = ffi_prep_closure_loc(p->pcl_write, &p->cif, closure_fcn,
-                                 p,
-                                 p->pcl_exec);
+    result = ffi_prep_closure(p->pcl, &p->cif, closure_fcn, p);
     if (result != FFI_OK) {
         PyErr_Format(PyExc_RuntimeError,
                      "ffi_prep_closure failed with %d", result);
index 27abe65145fb00f4f52979dfbbafa984164402da..0af5fa1ddf4acb2147b4dbff0468f9b6e462dc4a 100644 (file)
@@ -58,8 +58,7 @@ struct tagCDataObject {
 
 typedef struct {
     PyObject_VAR_HEAD
-    ffi_closure *pcl_write; /* the C callable, writeable */
-    void *pcl_exec;         /* the C callable, executable */
+    ffi_closure *pcl; /* the C callable */
     ffi_cif cif;
     int flags;
     PyObject *converters;
index 775c9e3d4bf3a2fd3f62da1ad36359dac96b4717..10293273588b1be8ccbfd0b4fec931af5123e389 100644 (file)
@@ -1,7 +1,5 @@
 ffi_sources = """
 src/prep_cif.c
-src/closures.c
-src/dlmalloc.c
 """.split()
 
 ffi_platforms = {
index 65581a773fa5a466ba81c43b30c2114f7777d692..763d179c8b935f9342273161c63b3fac78f0959b 100644 (file)
@@ -371,11 +371,10 @@ ffi_prep_incoming_args_SYSV(char *stack, void **rvalue,
 extern void ffi_closure_OUTER();
 
 ffi_status
-ffi_prep_closure_loc (ffi_closure* closure,
-                                         ffi_cif* cif,
-                                         void (*fun)(ffi_cif*,void*,void**,void*),
-                                         void *user_data,
-                                         void *codeloc)
+ffi_prep_closure (ffi_closure* closure,
+                 ffi_cif* cif,
+                 void (*fun)(ffi_cif*,void*,void**,void*),
+                 void *user_data)
 {
   short bytes;
   char *tramp;
@@ -453,5 +452,6 @@ ffi_prep_closure_loc (ffi_closure* closure,
   closure->cif  = cif;
   closure->user_data = user_data;
   closure->fun  = fun;
+
   return FFI_OK;
 }
index efb14c5f6f3aa11cb28616fe72aa22d979bef0ed..a88d8744f7f240f7f7d83ce28ca22825ddda6bee 100644 (file)
@@ -221,15 +221,11 @@ typedef struct {
   void      *user_data;
 } ffi_closure;
 
-void ffi_closure_free(void *);
-void *ffi_closure_alloc (size_t size, void **code);
-
 ffi_status
-ffi_prep_closure_loc (ffi_closure*,
+ffi_prep_closure (ffi_closure*,
                  ffi_cif *,
                  void (*fun)(ffi_cif*,void*,void**,void*),
-                 void *user_data,
-                 void *codeloc);
+                 void *user_data);
 
 typedef struct {
   char tramp[FFI_TRAMPOLINE_SIZE];
index 519941b692da93d9ddaf4c1d59ba593d766cf92c..ae857a2f129447ece25c512d4b63802d48f03738 100644 (file)
@@ -89,7 +89,7 @@ static void more_core(void)
 /******************************************************************/
 
 /* put the item back into the free list */
-void ffi_closure_free(void *p)
+void _ctypes_free_closure(void *p)
 {
     ITEM *item = (ITEM *)p;
     item->next = free_list;
@@ -97,7 +97,7 @@ void ffi_closure_free(void *p)
 }
 
 /* return one item from the free list, allocating more if needed */
-void *ffi_closure_alloc(size_t ignored, void** codeloc)
+void *_ctypes_alloc_closure(void)
 {
     ITEM *item;
     if (!free_list)
@@ -106,7 +106,5 @@ void *ffi_closure_alloc(size_t ignored, void** codeloc)
         return NULL;
     item = free_list;
     free_list = item->next;
-       *codeloc = (void *)item;
-    return (void *)item;
+    return item;
 }
-
index 3cfd275088f7b2329a5442075232a8b19c597a1a..332033dd7fa5d94ac9486c20bce2165c2d06eb08 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -1636,7 +1636,8 @@ class PyBuildExt(build_ext):
                    '_ctypes/callbacks.c',
                    '_ctypes/callproc.c',
                    '_ctypes/stgdict.c',
-                   '_ctypes/cfield.c']
+                   '_ctypes/cfield.c',
+                   '_ctypes/malloc_closure.c']
         depends = ['_ctypes/ctypes.h']
 
         if sys.platform == 'darwin':