Fis issue5504: ctypes does now work with systems where mmap can't be

PROT_WRITE and PROT_EXEC.
This commit is contained in:
Thomas Heller 2010-08-08 17:56:41 +00:00
parent 6fe8c41e8f
commit 001d3a1d8a
9 changed files with 35 additions and 23 deletions

View File

@ -26,6 +26,9 @@ Core and Builtins
Library Library
------- -------
- Issue5504 - ctypes should now work with systems where mmap can't be
PROT_WRITE and PROT_EXEC.
- Fix Issue8280 - urllib2's Request method will remove fragements in the url. - Fix Issue8280 - urllib2's Request method will remove fragements in the url.
This is how it is supposed to work, wget and curl do the same. Previous This is how it is supposed to work, wget and curl do the same. Previous
behavior was wrong. behavior was wrong.

View File

@ -3463,7 +3463,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; *(void **)self->b_ptr = (void *)thunk->pcl_exec;
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)) {

View File

@ -21,8 +21,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) if (self->pcl_write)
_ctypes_free_closure(self->pcl); ffi_closure_free(self->pcl_write);
PyObject_GC_Del(self); PyObject_GC_Del(self);
} }
@ -391,7 +391,8 @@ static CThunkObject* CThunkObject_new(Py_ssize_t nArgs)
return NULL; return NULL;
} }
p->pcl = NULL; p->pcl_exec = 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;
@ -421,8 +422,9 @@ CThunkObject *_ctypes_alloc_callback(PyObject *callable,
assert(CThunk_CheckExact(p)); assert(CThunk_CheckExact(p));
p->pcl = _ctypes_alloc_closure(); p->pcl_write = ffi_closure_alloc(sizeof(ffi_closure),
if (p->pcl == NULL) { &p->pcl_exec);
if (p->pcl_write == NULL) {
PyErr_NoMemory(); PyErr_NoMemory();
goto error; goto error;
} }
@ -467,7 +469,9 @@ 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(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) { 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);

View File

@ -95,7 +95,8 @@ struct tagCDataObject {
typedef struct { typedef struct {
PyObject_VAR_HEAD 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; ffi_cif cif;
int flags; int flags;
PyObject *converters; PyObject *converters;
@ -428,9 +429,6 @@ extern Py_ssize_t PyUnicode_AsWideChar_fixed(PyUnicodeObject *, wchar_t *, Py_ss
#endif #endif
#endif #endif
extern void _ctypes_free_closure(void *);
extern void *_ctypes_alloc_closure(void);
extern void _ctypes_add_traceback(char *, char *, int); extern void _ctypes_add_traceback(char *, char *, int);
extern PyObject *PyCData_FromBaseObj(PyObject *type, PyObject *base, Py_ssize_t index, char *adr); extern PyObject *PyCData_FromBaseObj(PyObject *type, PyObject *base, Py_ssize_t index, char *adr);

View File

@ -1,5 +1,7 @@
ffi_sources = """ ffi_sources = """
src/prep_cif.c src/prep_cif.c
src/closures.c
src/dlmalloc.c
""".split() """.split()
ffi_platforms = { ffi_platforms = {

View File

@ -371,10 +371,11 @@ 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 (ffi_closure* closure, ffi_prep_closure_loc (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;
@ -452,6 +453,5 @@ ffi_prep_closure (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;
} }

View File

@ -221,11 +221,15 @@ 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 (ffi_closure*, ffi_prep_closure_loc (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];

View File

@ -93,7 +93,7 @@ static void more_core(void)
/******************************************************************/ /******************************************************************/
/* put the item back into the free list */ /* put the item back into the free list */
void _ctypes_free_closure(void *p) void ffi_closure_free(void *p)
{ {
ITEM *item = (ITEM *)p; ITEM *item = (ITEM *)p;
item->next = free_list; item->next = free_list;
@ -101,7 +101,7 @@ void _ctypes_free_closure(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 *_ctypes_alloc_closure(void) void *ffi_closure_alloc(size_t ignored, void** codeloc)
{ {
ITEM *item; ITEM *item;
if (!free_list) if (!free_list)
@ -110,5 +110,7 @@ void *_ctypes_alloc_closure(void)
return NULL; return NULL;
item = free_list; item = free_list;
free_list = item->next; free_list = item->next;
return item; *codeloc = (void *)item;
return (void *)item;
} }

View File

@ -1867,8 +1867,7 @@ 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':