Kaydet (Commit) e647b476 authored tarafından Antoine Pitrou's avatar Antoine Pitrou

Fix buildbot issues due to _ctypes failing to compile in 3.1.

Recorded rollback of revisions 83837,83841 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k
üst bd25d598
...@@ -15,11 +15,6 @@ Core and Builtins ...@@ -15,11 +15,6 @@ Core and Builtins
- Issue #5319: Print an error if flushing stdout fails at interpreter - Issue #5319: Print an error if flushing stdout fails at interpreter
shutdown. 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) - Issue #8814: function annotations (the ``__annotations__`` attribute)
are now included in the set of attributes copied by default by are now included in the set of attributes copied by default by
functools.wraps and functools.update_wrapper. Patch by Terrence Cole. functools.wraps and functools.update_wrapper. Patch by Terrence Cole.
......
...@@ -3367,7 +3367,7 @@ PyCFuncPtr_new(PyTypeObject *type, PyObject *args, PyObject *kwds) ...@@ -3367,7 +3367,7 @@ PyCFuncPtr_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
self->callable = callable; self->callable = callable;
self->thunk = thunk; self->thunk = thunk;
*(void **)self->b_ptr = (void *)thunk->pcl_exec; *(void **)self->b_ptr = (void *)thunk->pcl;
Py_INCREF((PyObject *)thunk); /* for KeepRef */ Py_INCREF((PyObject *)thunk); /* for KeepRef */
if (-1 == KeepRef((CDataObject *)self, 0, (PyObject *)thunk)) { if (-1 == KeepRef((CDataObject *)self, 0, (PyObject *)thunk)) {
...@@ -5326,42 +5326,36 @@ PyInit__ctypes(void) ...@@ -5326,42 +5326,36 @@ PyInit__ctypes(void)
Struct_Type.tp_base = &PyCData_Type; Struct_Type.tp_base = &PyCData_Type;
if (PyType_Ready(&Struct_Type) < 0) if (PyType_Ready(&Struct_Type) < 0)
return NULL; return NULL;
Py_INCREF(&Struct_Type);
PyModule_AddObject(m, "Structure", (PyObject *)&Struct_Type); PyModule_AddObject(m, "Structure", (PyObject *)&Struct_Type);
Py_TYPE(&Union_Type) = &UnionType_Type; Py_TYPE(&Union_Type) = &UnionType_Type;
Union_Type.tp_base = &PyCData_Type; Union_Type.tp_base = &PyCData_Type;
if (PyType_Ready(&Union_Type) < 0) if (PyType_Ready(&Union_Type) < 0)
return NULL; return NULL;
Py_INCREF(&Union_Type);
PyModule_AddObject(m, "Union", (PyObject *)&Union_Type); PyModule_AddObject(m, "Union", (PyObject *)&Union_Type);
Py_TYPE(&PyCPointer_Type) = &PyCPointerType_Type; Py_TYPE(&PyCPointer_Type) = &PyCPointerType_Type;
PyCPointer_Type.tp_base = &PyCData_Type; PyCPointer_Type.tp_base = &PyCData_Type;
if (PyType_Ready(&PyCPointer_Type) < 0) if (PyType_Ready(&PyCPointer_Type) < 0)
return NULL; return NULL;
Py_INCREF(&PyCPointer_Type);
PyModule_AddObject(m, "_Pointer", (PyObject *)&PyCPointer_Type); PyModule_AddObject(m, "_Pointer", (PyObject *)&PyCPointer_Type);
Py_TYPE(&PyCArray_Type) = &PyCArrayType_Type; Py_TYPE(&PyCArray_Type) = &PyCArrayType_Type;
PyCArray_Type.tp_base = &PyCData_Type; PyCArray_Type.tp_base = &PyCData_Type;
if (PyType_Ready(&PyCArray_Type) < 0) if (PyType_Ready(&PyCArray_Type) < 0)
return NULL; return NULL;
Py_INCREF(&PyCArray_Type);
PyModule_AddObject(m, "Array", (PyObject *)&PyCArray_Type); PyModule_AddObject(m, "Array", (PyObject *)&PyCArray_Type);
Py_TYPE(&Simple_Type) = &PyCSimpleType_Type; Py_TYPE(&Simple_Type) = &PyCSimpleType_Type;
Simple_Type.tp_base = &PyCData_Type; Simple_Type.tp_base = &PyCData_Type;
if (PyType_Ready(&Simple_Type) < 0) if (PyType_Ready(&Simple_Type) < 0)
return NULL; return NULL;
Py_INCREF(&Simple_Type);
PyModule_AddObject(m, "_SimpleCData", (PyObject *)&Simple_Type); PyModule_AddObject(m, "_SimpleCData", (PyObject *)&Simple_Type);
Py_TYPE(&PyCFuncPtr_Type) = &PyCFuncPtrType_Type; Py_TYPE(&PyCFuncPtr_Type) = &PyCFuncPtrType_Type;
PyCFuncPtr_Type.tp_base = &PyCData_Type; PyCFuncPtr_Type.tp_base = &PyCData_Type;
if (PyType_Ready(&PyCFuncPtr_Type) < 0) if (PyType_Ready(&PyCFuncPtr_Type) < 0)
return NULL; return NULL;
Py_INCREF(&PyCFuncPtr_Type);
PyModule_AddObject(m, "CFuncPtr", (PyObject *)&PyCFuncPtr_Type); PyModule_AddObject(m, "CFuncPtr", (PyObject *)&PyCFuncPtr_Type);
/************************************************* /*************************************************
......
...@@ -16,8 +16,8 @@ CThunkObject_dealloc(PyObject *_self) ...@@ -16,8 +16,8 @@ CThunkObject_dealloc(PyObject *_self)
Py_XDECREF(self->converters); Py_XDECREF(self->converters);
Py_XDECREF(self->callable); Py_XDECREF(self->callable);
Py_XDECREF(self->restype); Py_XDECREF(self->restype);
if (self->pcl_write) if (self->pcl)
ffi_closure_free(self->pcl_write); _ctypes_free_closure(self->pcl);
PyObject_GC_Del(self); PyObject_GC_Del(self);
} }
...@@ -370,8 +370,7 @@ static CThunkObject* CThunkObject_new(Py_ssize_t nArgs) ...@@ -370,8 +370,7 @@ static CThunkObject* CThunkObject_new(Py_ssize_t nArgs)
return NULL; return NULL;
} }
p->pcl_exec = NULL; p->pcl = NULL;
p->pcl_write = NULL;
memset(&p->cif, 0, sizeof(p->cif)); memset(&p->cif, 0, sizeof(p->cif));
p->converters = NULL; p->converters = NULL;
p->callable = NULL; p->callable = NULL;
...@@ -401,9 +400,8 @@ CThunkObject *_ctypes_alloc_callback(PyObject *callable, ...@@ -401,9 +400,8 @@ CThunkObject *_ctypes_alloc_callback(PyObject *callable,
assert(CThunk_CheckExact((PyObject *)p)); assert(CThunk_CheckExact((PyObject *)p));
p->pcl_write = ffi_closure_alloc(sizeof(ffi_closure), p->pcl = _ctypes_alloc_closure();
&p->pcl_exec); if (p->pcl == NULL) {
if (p->pcl_write == NULL) {
PyErr_NoMemory(); PyErr_NoMemory();
goto error; goto error;
} }
...@@ -448,9 +446,7 @@ CThunkObject *_ctypes_alloc_callback(PyObject *callable, ...@@ -448,9 +446,7 @@ CThunkObject *_ctypes_alloc_callback(PyObject *callable,
"ffi_prep_cif failed with %d", result); "ffi_prep_cif failed with %d", result);
goto error; goto error;
} }
result = ffi_prep_closure_loc(p->pcl_write, &p->cif, closure_fcn, result = ffi_prep_closure(p->pcl, &p->cif, closure_fcn, p);
p,
p->pcl_exec);
if (result != FFI_OK) { if (result != FFI_OK) {
PyErr_Format(PyExc_RuntimeError, PyErr_Format(PyExc_RuntimeError,
"ffi_prep_closure failed with %d", result); "ffi_prep_closure failed with %d", result);
......
...@@ -58,8 +58,7 @@ struct tagCDataObject { ...@@ -58,8 +58,7 @@ struct tagCDataObject {
typedef struct { typedef struct {
PyObject_VAR_HEAD PyObject_VAR_HEAD
ffi_closure *pcl_write; /* the C callable, writeable */ ffi_closure *pcl; /* the C callable */
void *pcl_exec; /* the C callable, executable */
ffi_cif cif; ffi_cif cif;
int flags; int flags;
PyObject *converters; PyObject *converters;
......
ffi_sources = """ ffi_sources = """
src/prep_cif.c src/prep_cif.c
src/closures.c
src/dlmalloc.c
""".split() """.split()
ffi_platforms = { ffi_platforms = {
......
...@@ -371,11 +371,10 @@ ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, ...@@ -371,11 +371,10 @@ ffi_prep_incoming_args_SYSV(char *stack, void **rvalue,
extern void ffi_closure_OUTER(); extern void ffi_closure_OUTER();
ffi_status ffi_status
ffi_prep_closure_loc (ffi_closure* closure, ffi_prep_closure (ffi_closure* closure,
ffi_cif* cif, ffi_cif* cif,
void (*fun)(ffi_cif*,void*,void**,void*), void (*fun)(ffi_cif*,void*,void**,void*),
void *user_data, void *user_data)
void *codeloc)
{ {
short bytes; short bytes;
char *tramp; char *tramp;
...@@ -453,5 +452,6 @@ ffi_prep_closure_loc (ffi_closure* closure, ...@@ -453,5 +452,6 @@ ffi_prep_closure_loc (ffi_closure* closure,
closure->cif = cif; closure->cif = cif;
closure->user_data = user_data; closure->user_data = user_data;
closure->fun = fun; closure->fun = fun;
return FFI_OK; return FFI_OK;
} }
...@@ -221,15 +221,11 @@ typedef struct { ...@@ -221,15 +221,11 @@ typedef struct {
void *user_data; void *user_data;
} ffi_closure; } ffi_closure;
void ffi_closure_free(void *);
void *ffi_closure_alloc (size_t size, void **code);
ffi_status ffi_status
ffi_prep_closure_loc (ffi_closure*, ffi_prep_closure (ffi_closure*,
ffi_cif *, ffi_cif *,
void (*fun)(ffi_cif*,void*,void**,void*), void (*fun)(ffi_cif*,void*,void**,void*),
void *user_data, void *user_data);
void *codeloc);
typedef struct { typedef struct {
char tramp[FFI_TRAMPOLINE_SIZE]; char tramp[FFI_TRAMPOLINE_SIZE];
......
...@@ -89,7 +89,7 @@ static void more_core(void) ...@@ -89,7 +89,7 @@ static void more_core(void)
/******************************************************************/ /******************************************************************/
/* put the item back into the free list */ /* 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 *item = (ITEM *)p;
item->next = free_list; item->next = free_list;
...@@ -97,7 +97,7 @@ void ffi_closure_free(void *p) ...@@ -97,7 +97,7 @@ void ffi_closure_free(void *p)
} }
/* return one item from the free list, allocating more if needed */ /* 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; ITEM *item;
if (!free_list) if (!free_list)
...@@ -106,7 +106,5 @@ void *ffi_closure_alloc(size_t ignored, void** codeloc) ...@@ -106,7 +106,5 @@ void *ffi_closure_alloc(size_t ignored, void** codeloc)
return NULL; return NULL;
item = free_list; item = free_list;
free_list = item->next; free_list = item->next;
*codeloc = (void *)item; return item;
return (void *)item;
} }
...@@ -1636,7 +1636,8 @@ class PyBuildExt(build_ext): ...@@ -1636,7 +1636,8 @@ class PyBuildExt(build_ext):
'_ctypes/callbacks.c', '_ctypes/callbacks.c',
'_ctypes/callproc.c', '_ctypes/callproc.c',
'_ctypes/stgdict.c', '_ctypes/stgdict.c',
'_ctypes/cfield.c'] '_ctypes/cfield.c',
'_ctypes/malloc_closure.c']
depends = ['_ctypes/ctypes.h'] depends = ['_ctypes/ctypes.h']
if sys.platform == 'darwin': if sys.platform == 'darwin':
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment