diff options
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_ctypes/_ctypes.c | 2 | ||||
-rw-r--r-- | Modules/_ctypes/_ctypes_test.c | 35 | ||||
-rw-r--r-- | Modules/_ctypes/callproc.c | 1 | ||||
-rw-r--r-- | Modules/_ctypes/cfield.c | 29 | ||||
-rw-r--r-- | Modules/_ctypes/ctypes.h | 2 | ||||
-rwxr-xr-x | Modules/_ctypes/libffi/configure | 2 | ||||
-rw-r--r-- | Modules/_ctypes/libffi/configure.ac | 2 | ||||
-rw-r--r-- | Modules/_lsprof.c | 16 | ||||
-rw-r--r-- | Modules/_ssl.c | 25 | ||||
-rwxr-xr-x | Modules/makesetup | 2 | ||||
-rw-r--r-- | Modules/posixmodule.c | 2 | ||||
-rw-r--r-- | Modules/readline.c | 77 |
12 files changed, 179 insertions, 16 deletions
diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 75792ad..071f4c8 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -1104,7 +1104,7 @@ _type_ attribute. */ -static char *SIMPLE_TYPE_CHARS = "cbBhHiIlLdfuzZqQPXOvt"; +static char *SIMPLE_TYPE_CHARS = "cbBhHiIlLdfuzZqQPXOvtD"; static PyObject * c_wchar_p_from_param(PyObject *type, PyObject *value) diff --git a/Modules/_ctypes/_ctypes_test.c b/Modules/_ctypes/_ctypes_test.c index 39d9232..7048a2e 100644 --- a/Modules/_ctypes/_ctypes_test.c +++ b/Modules/_ctypes/_ctypes_test.c @@ -12,6 +12,29 @@ /* some functions handy for testing */ +EXPORT(long double)testfunc_Ddd(double a, double b) +{ + long double result = (long double)(a * b); + printf("testfunc_Ddd(%p, %p)\n", &a, &b); + printf("testfunc_Ddd(%g, %g)\n", a, b); + return result; +} + +EXPORT(long double)testfunc_DDD(long double a, long double b) +{ + long double result = a * b; + printf("testfunc_DDD(%p, %p)\n", &a, &b); + printf("testfunc_DDD(%Lg, %Lg)\n", a, b); + return result; +} + +EXPORT(int)testfunc_iii(int a, int b) +{ + int result = a * b; + printf("testfunc_iii(%p, %p)\n", &a, &b); + return result; +} + EXPORT(int)myprintf(char *fmt, ...) { int result; @@ -77,6 +100,14 @@ EXPORT(double) _testfunc_d_bhilfd(signed char b, short h, int i, long l, float f return (double)(b + h + i + l + f + d); } +EXPORT(long double) _testfunc_D_bhilfD(signed char b, short h, int i, long l, float f, long double d) +{ +/* printf("_testfunc_d_bhilfd got %d %d %d %ld %f %f\n", + b, h, i, l, f, d); +*/ + return (long double)(b + h + i + l + f + d); +} + EXPORT(char *) _testfunc_p_p(void *s) { return (char *)s; @@ -391,6 +422,7 @@ EXPORT(PY_LONG_LONG) tf_q(PY_LONG_LONG c) { S; return c/3; } EXPORT(unsigned PY_LONG_LONG) tf_Q(unsigned PY_LONG_LONG c) { U; return c/3; } EXPORT(float) tf_f(float c) { S; return c/3; } EXPORT(double) tf_d(double c) { S; return c/3; } +EXPORT(long double) tf_D(long double c) { S; return c/3; } #ifdef MS_WIN32 EXPORT(signed char) __stdcall s_tf_b(signed char c) { S; return c/3; } @@ -405,6 +437,7 @@ EXPORT(PY_LONG_LONG) __stdcall s_tf_q(PY_LONG_LONG c) { S; return c/3; } EXPORT(unsigned PY_LONG_LONG) __stdcall s_tf_Q(unsigned PY_LONG_LONG c) { U; return c/3; } EXPORT(float) __stdcall s_tf_f(float c) { S; return c/3; } EXPORT(double) __stdcall s_tf_d(double c) { S; return c/3; } +EXPORT(long double) __stdcall s_tf_D(long double c) { S; return c/3; } #endif /*******/ @@ -420,6 +453,7 @@ EXPORT(PY_LONG_LONG) tf_bq(signed char x, PY_LONG_LONG c) { S; return c/3; } EXPORT(unsigned PY_LONG_LONG) tf_bQ(signed char x, unsigned PY_LONG_LONG c) { U; return c/3; } EXPORT(float) tf_bf(signed char x, float c) { S; return c/3; } EXPORT(double) tf_bd(signed char x, double c) { S; return c/3; } +EXPORT(long double) tf_bD(signed char x, long double c) { S; return c/3; } EXPORT(void) tv_i(int c) { S; return; } #ifdef MS_WIN32 @@ -435,6 +469,7 @@ EXPORT(PY_LONG_LONG) __stdcall s_tf_bq(signed char x, PY_LONG_LONG c) { S; retur EXPORT(unsigned PY_LONG_LONG) __stdcall s_tf_bQ(signed char x, unsigned PY_LONG_LONG c) { U; return c/3; } EXPORT(float) __stdcall s_tf_bf(signed char x, float c) { S; return c/3; } EXPORT(double) __stdcall s_tf_bd(signed char x, double c) { S; return c/3; } +EXPORT(long double) __stdcall s_tf_bD(signed char x, long double c) { S; return c/3; } EXPORT(void) __stdcall s_tv_i(int c) { S; return; } #endif diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 3a98a74..1c66c48 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -444,6 +444,7 @@ union result { #ifdef HAVE_LONG_LONG PY_LONG_LONG q; #endif + long double D; double d; float f; void *p; diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c index f60dede..c36798a 100644 --- a/Modules/_ctypes/cfield.c +++ b/Modules/_ctypes/cfield.c @@ -977,6 +977,29 @@ Q_get_sw(void *ptr, Py_ssize_t size) */ +static PyObject * +D_set(void *ptr, PyObject *value, Py_ssize_t size) +{ + long double x; + + x = PyFloat_AsDouble(value); + if (x == -1 && PyErr_Occurred()) { + PyErr_Format(PyExc_TypeError, + " float expected instead of %s instance", + value->ob_type->tp_name); + return NULL; + } + memcpy(ptr, &x, sizeof(long double)); + _RET(value); +} + +static PyObject * +D_get(void *ptr, Py_ssize_t size) +{ + long double val; + memcpy(&val, ptr, sizeof(long double)); + return PyFloat_FromDouble(val); +} static PyObject * d_set(void *ptr, PyObject *value, Py_ssize_t size) @@ -1591,6 +1614,7 @@ static struct fielddesc formattable[] = { { 'B', B_set, B_get, &ffi_type_uchar}, { 'c', c_set, c_get, &ffi_type_schar}, { 'd', d_set, d_get, &ffi_type_double, d_set_sw, d_get_sw}, + { 'D', D_set, D_get, &ffi_type_longdouble}, { 'f', f_set, f_get, &ffi_type_float, f_set_sw, f_get_sw}, { 'h', h_set, h_get, &ffi_type_sshort, h_set_sw, h_get_sw}, { 'H', H_set, H_get, &ffi_type_ushort, H_set_sw, H_get_sw}, @@ -1673,6 +1697,7 @@ typedef struct { char c; int x; } s_int; typedef struct { char c; long x; } s_long; typedef struct { char c; float x; } s_float; typedef struct { char c; double x; } s_double; +typedef struct { char c; long double x; } s_long_double; typedef struct { char c; char *x; } s_char_p; typedef struct { char c; void *x; } s_void_p; @@ -1684,6 +1709,8 @@ typedef struct { char c; void *x; } s_void_p; */ #define FLOAT_ALIGN (sizeof(s_float) - sizeof(float)) #define DOUBLE_ALIGN (sizeof(s_double) - sizeof(double)) +#define LONGDOUBLE_ALIGN (sizeof(s_long_double) - sizeof(long double)) + /* #define CHAR_P_ALIGN (sizeof(s_char_p) - sizeof(char*)) */ #define VOID_P_ALIGN (sizeof(s_void_p) - sizeof(void*)) @@ -1729,6 +1756,8 @@ ffi_type ffi_type_sint64 = { 8, LONG_LONG_ALIGN, FFI_TYPE_SINT64 }; ffi_type ffi_type_float = { sizeof(float), FLOAT_ALIGN, FFI_TYPE_FLOAT }; ffi_type ffi_type_double = { sizeof(double), DOUBLE_ALIGN, FFI_TYPE_DOUBLE }; +ffi_type ffi_type_longdouble = { sizeof(long double), LONGDOUBLE_ALIGN, + FFI_TYPE_LONGDOUBLE }; /* ffi_type ffi_type_longdouble */ diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h index 52f6065..c78a6ea 100644 --- a/Modules/_ctypes/ctypes.h +++ b/Modules/_ctypes/ctypes.h @@ -30,6 +30,7 @@ union value { #ifdef HAVE_LONG_LONG PY_LONG_LONG ll; #endif + long double D; }; /* @@ -283,6 +284,7 @@ struct tagPyCArgObject { #ifdef HAVE_LONG_LONG PY_LONG_LONG q; #endif + long double D; double d; float f; void *p; diff --git a/Modules/_ctypes/libffi/configure b/Modules/_ctypes/libffi/configure index f65669e..bc7e474 100755 --- a/Modules/_ctypes/libffi/configure +++ b/Modules/_ctypes/libffi/configure @@ -3533,7 +3533,7 @@ x86_64-*-linux* | x86_64-*-freebsd* | x86_64-*-kfreebsd*-gnu) TARGET=X86_64; TAR sh-*-linux* | sh[34]*-*-linux*) TARGET=SH; TARGETDIR=sh;; sh-*-rtems*) TARGET=SH; TARGETDIR=sh;; sh64-*-linux* | sh5*-*-linux*) TARGET=SH64; TARGETDIR=sh64;; -hppa-*-linux* | parisc-*-linux*) TARGET=PA; TARGETDIR=pa;; +hppa*-*-linux* | parisc*-*-linux*) TARGET=PA; TARGETDIR=pa;; esac if test $TARGETDIR = unknown; then diff --git a/Modules/_ctypes/libffi/configure.ac b/Modules/_ctypes/libffi/configure.ac index 8870fcb..10b04dc 100644 --- a/Modules/_ctypes/libffi/configure.ac +++ b/Modules/_ctypes/libffi/configure.ac @@ -71,7 +71,7 @@ x86_64-*-linux* | x86_64-*-freebsd* | x86_64-*-kfreebsd*-gnu) TARGET=X86_64; TAR sh-*-linux* | sh[[34]]*-*-linux*) TARGET=SH; TARGETDIR=sh;; sh-*-rtems*) TARGET=SH; TARGETDIR=sh;; sh64-*-linux* | sh5*-*-linux*) TARGET=SH64; TARGETDIR=sh64;; -hppa-*-linux* | parisc-*-linux*) TARGET=PA; TARGETDIR=pa;; +hppa*-*-linux* | parisc*-*-linux*) TARGET=PA; TARGETDIR=pa;; esac if test $TARGETDIR = unknown; then diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c index dd74a43..a5740e7 100644 --- a/Modules/_lsprof.c +++ b/Modules/_lsprof.c @@ -372,11 +372,20 @@ ptrace_enter_call(PyObject *self, void *key, PyObject *userObj) ProfilerEntry *profEntry; ProfilerContext *pContext; + /* In the case of entering a generator expression frame via a + * throw (gen_send_ex(.., 1)), we may already have an + * Exception set here. We must not mess around with this + * exception, and some of the code under here assumes that + * PyErr_* is its own to mess around with, so we have to + * save and restore any current exception. */ + PyObject *last_type, *last_value, *last_tb; + PyErr_Fetch(&last_type, &last_value, &last_tb); + profEntry = getEntry(pObj, key); if (profEntry == NULL) { profEntry = newProfilerEntry(pObj, key, userObj); if (profEntry == NULL) - return; + goto restorePyerr; } /* grab a ProfilerContext out of the free list */ pContext = pObj->freelistProfilerContext; @@ -389,10 +398,13 @@ ptrace_enter_call(PyObject *self, void *key, PyObject *userObj) malloc(sizeof(ProfilerContext)); if (pContext == NULL) { pObj->flags |= POF_NOMEMORY; - return; + goto restorePyerr; } } initContext(pObj, pContext, profEntry); + +restorePyerr: + PyErr_Restore(last_type, last_value, last_tb); } static void diff --git a/Modules/_ssl.c b/Modules/_ssl.c index a31030a..ae0c34a 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -437,12 +437,15 @@ PySSL_issuer(PySSLObject *self) } static PyObject * -_create_dict_for_X509_NAME (X509_NAME *xname) +_create_tuple_for_X509_NAME (X509_NAME *xname) { - PyObject *pd = PyDict_New(); + PyObject *pt = NULL; + PyObject *entry_tuple = NULL; + int entry_count = X509_NAME_entry_count(xname); int index_counter; - if (pd == NULL) + pt = PyTuple_New(entry_count); + if (pt == NULL) return NULL; for (index_counter = 0; @@ -480,18 +483,20 @@ _create_dict_for_X509_NAME (X509_NAME *xname) Py_DECREF(name_obj); goto fail0; } - if (PyDict_SetItem(pd, name_obj, value_obj) < 0) { + entry_tuple = PyTuple_New(2); + if (entry_tuple == NULL) { Py_DECREF(name_obj); Py_DECREF(value_obj); goto fail0; } - Py_DECREF(name_obj); - Py_DECREF(value_obj); + PyTuple_SET_ITEM(entry_tuple, 0, name_obj); + PyTuple_SET_ITEM(entry_tuple, 1, value_obj); + PyTuple_SET_ITEM(pt, index_counter, entry_tuple); } - return pd; + return pt; fail0: - Py_XDECREF(pd); + Py_XDECREF(pt); return NULL; } @@ -520,7 +525,7 @@ PySSL_peercert(PySSLObject *self) if ((verification & SSL_VERIFY_PEER) == 0) return retval; - peer = _create_dict_for_X509_NAME( + peer = _create_tuple_for_X509_NAME( X509_get_subject_name(self->peer_cert)); if (peer == NULL) goto fail0; @@ -530,7 +535,7 @@ PySSL_peercert(PySSLObject *self) } Py_DECREF(peer); - issuer = _create_dict_for_X509_NAME( + issuer = _create_tuple_for_X509_NAME( X509_get_issuer_name(self->peer_cert)); if (issuer == NULL) goto fail0; diff --git a/Modules/makesetup b/Modules/makesetup index bc1b1b9..8862c36 100755 --- a/Modules/makesetup +++ b/Modules/makesetup @@ -238,7 +238,7 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' | no) SHAREDMODS="$SHAREDMODS $file";; esac rule="$file: $objs" - rule="$rule; \$(LDSHARED) $objs $libs $ExtraLibs -o $file" + rule="$rule; \$(BLDSHARED) $objs $libs $ExtraLibs -o $file" echo "$rule" >>$rulesf done done diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 770679e..75ce991 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -6540,6 +6540,8 @@ typedef BOOL (WINAPI *CRYPTGENRANDOM)(HCRYPTPROV hProv, DWORD dwLen,\ BYTE *pbBuffer ); static CRYPTGENRANDOM pCryptGenRandom = NULL; +/* This handle is never explicitly released. Instead, the operating + system will release it when the process terminates. */ static HCRYPTPROV hCryptProv = 0; static PyObject* diff --git a/Modules/readline.c b/Modules/readline.c index fd800ff..f620f62 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -198,6 +198,7 @@ set_hook(const char *funcname, PyObject **hook_var, PyObject *args) /* Exported functions to specify hook functions in Python */ +static PyObject *completion_display_matches_hook = NULL; static PyObject *startup_hook = NULL; #ifdef HAVE_RL_PRE_INPUT_HOOK @@ -205,6 +206,20 @@ static PyObject *pre_input_hook = NULL; #endif static PyObject * +set_completion_display_matches_hook(PyObject *self, PyObject *args) +{ + return set_hook("completion_display_matches_hook", + &completion_display_matches_hook, args); +} + +PyDoc_STRVAR(doc_set_completion_display_matches_hook, +"set_completion_display_matches_hook([function]) -> None\n\ +Set or remove the completion display function.\n\ +The function is called as\n\ + function(substitution, [matches], longest_match_length)\n\ +once each time matches need to be displayed."); + +static PyObject * set_startup_hook(PyObject *self, PyObject *args) { return set_hook("startup_hook", &startup_hook, args); @@ -245,6 +260,18 @@ static PyObject *begidx = NULL; static PyObject *endidx = NULL; +/* Get the completion type for the scope of the tab-completion */ +static PyObject * +get_completion_type(PyObject *self, PyObject *noarg) +{ + return PyInt_FromLong(rl_completion_type); +} + +PyDoc_STRVAR(doc_get_completion_type, +"get_completion_type() -> int\n\ +Get the type of completion being attempted."); + + /* Get the beginning index for the scope of the tab-completion */ static PyObject * @@ -557,6 +584,8 @@ static struct PyMethodDef readline_methods[] = METH_NOARGS, get_history_length_doc}, {"set_completer", set_completer, METH_VARARGS, doc_set_completer}, {"get_completer", get_completer, METH_NOARGS, doc_get_completer}, + {"get_completion_type", get_completion_type, + METH_NOARGS, doc_get_completion_type}, {"get_begidx", get_begidx, METH_NOARGS, doc_get_begidx}, {"get_endidx", get_endidx, METH_NOARGS, doc_get_endidx}, @@ -568,6 +597,8 @@ static struct PyMethodDef readline_methods[] = {"get_completer_delims", get_completer_delims, METH_NOARGS, doc_get_completer_delims}, + {"set_completion_display_matches_hook", set_completion_display_matches_hook, + METH_VARARGS, doc_set_completion_display_matches_hook}, {"set_startup_hook", set_startup_hook, METH_VARARGS, doc_set_startup_hook}, #ifdef HAVE_RL_PRE_INPUT_HOOK @@ -631,6 +662,48 @@ on_pre_input_hook(void) #endif +/* C function to call the Python completion_display_matches */ + +static void +on_completion_display_matches_hook(char **matches, + int num_matches, int max_length) +{ + if (completion_display_matches_hook != NULL) { + int i; + PyObject *m, *s; + PyObject *r; +#ifdef WITH_THREAD + PyGILState_STATE gilstate = PyGILState_Ensure(); +#endif + m = PyList_New(num_matches); + for (i = 0; i < num_matches; i++) { + s = PyString_FromString(matches[i+1]); + PyList_SetItem(m, i, s); + } + + r = PyObject_CallFunction(completion_display_matches_hook, + "sOi", matches[0], m, max_length); + + Py_DECREF(m); + + if (r == NULL || + (r != Py_None && PyInt_AsLong(r) == -1 && PyErr_Occurred())) { + goto error; + } + + Py_DECREF(r); + goto done; + error: + PyErr_Clear(); + Py_XDECREF(r); + done: +#ifdef WITH_THREAD + PyGILState_Release(gilstate); +#endif + } +} + + /* C function to call the Python completer. */ static char * @@ -708,6 +781,10 @@ setup_readline(void) rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ +#ifdef HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK + rl_completion_display_matches_hook = + (rl_compdisp_func_t *)on_completion_display_matches_hook; +#endif rl_startup_hook = (Function *)on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK rl_pre_input_hook = (Function *)on_pre_input_hook; |