aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'dev-lang/python/files/2.6/24_all_ctypes_mmap_wx.patch')
-rw-r--r--dev-lang/python/files/2.6/24_all_ctypes_mmap_wx.patch124
1 files changed, 124 insertions, 0 deletions
diff --git a/dev-lang/python/files/2.6/24_all_ctypes_mmap_wx.patch b/dev-lang/python/files/2.6/24_all_ctypes_mmap_wx.patch
new file mode 100644
index 0000000..918d97c
--- /dev/null
+++ b/dev-lang/python/files/2.6/24_all_ctypes_mmap_wx.patch
@@ -0,0 +1,124 @@
+https://bugs.gentoo.org/show_bug.cgi?id=329499
+http://bugs.python.org/issue5504
+http://hg.python.org/cpython/rev/e13ea83e2edb
+
+--- Modules/_ctypes/callbacks.c
++++ Modules/_ctypes/callbacks.c
+@@ -21,8 +21,8 @@
+ Py_XDECREF(self->converters);
+ Py_XDECREF(self->callable);
+ Py_XDECREF(self->restype);
+- if (self->pcl)
+- FreeClosure(self->pcl);
++ if (self->pcl_write)
++ ffi_closure_free(self->pcl_write);
+ PyObject_GC_Del(self);
+ }
+
+@@ -373,7 +373,8 @@
+ return NULL;
+ }
+
+- p->pcl = NULL;
++ p->pcl_exec = NULL;
++ p->pcl_write = NULL;
+ memset(&p->cif, 0, sizeof(p->cif));
+ p->converters = NULL;
+ p->callable = NULL;
+@@ -403,8 +404,9 @@
+
+ assert(CThunk_CheckExact(p));
+
+- p->pcl = MallocClosure();
+- if (p->pcl == NULL) {
++ p->pcl_write = ffi_closure_alloc(sizeof(ffi_closure),
++ &p->pcl_exec);
++ if (p->pcl_write == NULL) {
+ PyErr_NoMemory();
+ goto error;
+ }
+@@ -449,7 +451,9 @@
+ "ffi_prep_cif failed with %d", result);
+ goto error;
+ }
+- result = ffi_prep_closure(p->pcl, &p->cif, closure_fcn, p);
++ result = ffi_prep_closure_loc(p->pcl_write, &p->cif, closure_fcn,
++ p,
++ p->pcl_exec);
+ if (result != FFI_OK) {
+ PyErr_Format(PyExc_RuntimeError,
+ "ffi_prep_closure failed with %d", result);
+--- Modules/_ctypes/_ctypes.c
++++ Modules/_ctypes/_ctypes.c
+@@ -3443,7 +3443,7 @@
+ self->callable = callable;
+
+ self->thunk = thunk;
+- *(void **)self->b_ptr = (void *)thunk->pcl;
++ *(void **)self->b_ptr = (void *)thunk->pcl_exec;
+
+ Py_INCREF((PyObject *)thunk); /* for KeepRef */
+ if (-1 == KeepRef((CDataObject *)self, 0, (PyObject *)thunk)) {
+--- Modules/_ctypes/ctypes.h
++++ Modules/_ctypes/ctypes.h
+@@ -95,7 +95,8 @@
+
+ typedef struct {
+ PyObject_VAR_HEAD
+- ffi_closure *pcl; /* the C callable */
++ ffi_closure *pcl_write; /* the C callable, writeable */
++ void *pcl_exec; /* the C callable, executable */
+ ffi_cif cif;
+ int flags;
+ PyObject *converters;
+@@ -427,9 +428,6 @@
+
+ #endif
+
+-extern void FreeClosure(void *);
+-extern void *MallocClosure(void);
+-
+ extern void _AddTraceback(char *, char *, int);
+
+ extern PyObject *CData_FromBaseObj(PyObject *type, PyObject *base, Py_ssize_t index, char *adr);
+--- Modules/_ctypes/malloc_closure.c
++++ Modules/_ctypes/malloc_closure.c
+@@ -93,7 +93,7 @@
+ /******************************************************************/
+
+ /* put the item back into the free list */
+-void FreeClosure(void *p)
++void ffi_closure_free(void *p)
+ {
+ ITEM *item = (ITEM *)p;
+ item->next = free_list;
+@@ -101,7 +101,7 @@
+ }
+
+ /* return one item from the free list, allocating more if needed */
+-void *MallocClosure(void)
++void *ffi_closure_alloc(size_t ignored, void** codeloc)
+ {
+ ITEM *item;
+ if (!free_list)
+@@ -110,5 +110,7 @@
+ return NULL;
+ item = free_list;
+ free_list = item->next;
+- return item;
++ *codeloc = (void *)item;
++ return (void *)item;
+ }
++
+--- setup.py
++++ setup.py
+@@ -1885,8 +1885,7 @@
+ '_ctypes/callbacks.c',
+ '_ctypes/callproc.c',
+ '_ctypes/stgdict.c',
+- '_ctypes/cfield.c',
+- '_ctypes/malloc_closure.c']
++ '_ctypes/cfield.c']
+ depends = ['_ctypes/ctypes.h']
+
+ if sys.platform == 'darwin':