From b76922a7be9196af9281cd2d167f1afd81d1fb6e Mon Sep 17 00:00:00 2001 From: Christian Heimes <christian@cheimes.de> Date: Tue, 11 Dec 2007 01:06:40 +0000 Subject: [PATCH] Merged revisions 59450-59464 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r59455 | guido.van.rossum | 2007-12-10 21:42:53 +0100 (Mon, 10 Dec 2007) | 2 lines Remove a 2.2-ism. ........ r59459 | christian.heimes | 2007-12-10 23:28:56 +0100 (Mon, 10 Dec 2007) | 4 lines Backport of r59456:59458 from py3k to trunk Issue #1580: New free format floating point representation based on "Floating-Point Printer Sample Code", by Robert G. Burger. For example repr(11./5) now returns '2.2' instead of '2.2000000000000002'. Thanks to noam for the patch! I had to modify doubledigits.c slightly to support X64 and IA64 machines on Windows. I also added the new file to the three project files. ........ r59460 | guido.van.rossum | 2007-12-11 00:00:12 +0100 (Tue, 11 Dec 2007) | 4 lines Patch #1643738 by Ulisses Furquim -- make the is_tripped variable in signalmodule.c more robust. Includes Martin von Loewis's suggestion to set is_tripped after .tripped. ........ r59463 | kurt.kaiser | 2007-12-11 01:04:57 +0100 (Tue, 11 Dec 2007) | 2 lines format_paragraph_event wasn't returning 'break' ........ r59464 | christian.heimes | 2007-12-11 01:54:34 +0100 (Tue, 11 Dec 2007) | 3 lines The new float repr causes too much trouble and pain. I'm disabling the feature until we have sorted out the issues on all machines. 64bit machines seem to have issues and Guido has reported even worse. Guido: It's pretty bad actually -- repr(1e5) comes out as '1.0'... Ditto for repr(1eN) for most N... Both in 2.6 and in 3.0... ........ --- Lib/DocXMLRPCServer.py | 3 +-- Lib/idlelib/FormatParagraph.py | 1 + Lib/test/test_float.py | 3 ++- Misc/ACKS | 1 + Modules/signalmodule.c | 31 ++++++++++++++++++++++----- Objects/floatobject.c | 13 ++++++++++- PCbuild/pythoncore.vcproj | 3 +++ PCbuild8/pythoncore/pythoncore.vcproj | 4 ++++ PCbuild9/pythoncore.vcproj | 4 ++++ 9 files changed, 54 insertions(+), 9 deletions(-) diff --git a/Lib/DocXMLRPCServer.py b/Lib/DocXMLRPCServer.py index 86c7bfb2257..504b6699882 100644 --- a/Lib/DocXMLRPCServer.py +++ b/Lib/DocXMLRPCServer.py @@ -123,8 +123,7 @@ class ServerHTMLDoc(pydoc.HTMLDoc): result = result + '<p>%s</p>\n' % doc contents = [] - method_items = list(methods.items()) - method_items.sort() + method_items = sorted(methods.items()) for key, value in method_items: contents.append(self.docroutine(value, key, funcs=fdict)) result = result + self.bigsection( diff --git a/Lib/idlelib/FormatParagraph.py b/Lib/idlelib/FormatParagraph.py index 9b4b3cb000e..02f96d493a3 100644 --- a/Lib/idlelib/FormatParagraph.py +++ b/Lib/idlelib/FormatParagraph.py @@ -75,6 +75,7 @@ class FormatParagraph: else: text.mark_set("insert", last) text.see("insert") + return "break" def find_paragraph(text, mark): lineno, col = map(int, mark.split(".")) diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py index 2ba6dbc7895..922de7aa04f 100644 --- a/Lib/test/test_float.py +++ b/Lib/test/test_float.py @@ -166,7 +166,8 @@ def test_main(): UnknownFormatTestCase, IEEEFormatTestCase, FormatTestCase, - ReprTestCase) + #ReprTestCase + ) if __name__ == '__main__': test_main() diff --git a/Misc/ACKS b/Misc/ACKS index 26bbb0b0b68..17ef503ff0e 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -225,6 +225,7 @@ Tadayoshi Funaba Gyro Funch Peter Funk Geoff Furnish +Ulisses Furquim Lele Gaifax Santiago Gala Yitzchak Gale diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 5f38b9b5121..76c8198518c 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -75,7 +75,8 @@ static struct { PyObject *func; } Handlers[NSIG]; -static int is_tripped = 0; /* Speed up sigcheck() when none tripped */ +/* Speed up sigcheck() when none tripped */ +static volatile sig_atomic_t is_tripped = 0; static PyObject *DefaultHandler; static PyObject *IgnoreHandler; @@ -122,8 +123,10 @@ signal_handler(int sig_num) /* See NOTES section above */ if (getpid() == main_pid) { #endif - is_tripped++; Handlers[sig_num].tripped = 1; + /* Set is_tripped after setting .tripped, as it gets + cleared in PyErr_CheckSignals() before .tripped. */ + is_tripped = 1; Py_AddPendingCall(checksignals_witharg, NULL); #ifdef WITH_THREAD } @@ -597,13 +600,31 @@ PyErr_CheckSignals(void) if (!is_tripped) return 0; + #ifdef WITH_THREAD if (PyThread_get_thread_ident() != main_thread) return 0; #endif + + /* + * The is_stripped variable is meant to speed up the calls to + * PyErr_CheckSignals (both directly or via pending calls) when no + * signal has arrived. This variable is set to 1 when a signal arrives + * and it is set to 0 here, when we know some signals arrived. This way + * we can run the registered handlers with no signals blocked. + * + * NOTE: with this approach we can have a situation where is_tripped is + * 1 but we have no more signals to handle (Handlers[i].tripped + * is 0 for every signal i). This won't do us any harm (except + * we're gonna spent some cycles for nothing). This happens when + * we receive a signal i after we zero is_tripped and before we + * check Handlers[i].tripped. + */ + is_tripped = 0; + if (!(f = (PyObject *)PyEval_GetFrame())) f = Py_None; - + for (i = 1; i < NSIG; i++) { if (Handlers[i].tripped) { PyObject *result = NULL; @@ -621,7 +642,7 @@ PyErr_CheckSignals(void) Py_DECREF(result); } } - is_tripped = 0; + return 0; } @@ -632,7 +653,7 @@ PyErr_CheckSignals(void) void PyErr_SetInterrupt(void) { - is_tripped++; + is_tripped = 1; Handlers[SIGINT].tripped = 1; Py_AddPendingCall((int (*)(void *))PyErr_CheckSignals, NULL); } diff --git a/Objects/floatobject.c b/Objects/floatobject.c index b17f7be996c..48d29d7042c 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -281,6 +281,7 @@ format_float(char *buf, size_t buflen, PyFloatObject *v, int precision) format_double(buf, buflen, PyFloat_AS_DOUBLE(v), precision); } +#ifdef Py_BROKEN_REPR /* The following function is based on Tcl_PrintDouble, * from tclUtil.c. */ @@ -382,6 +383,8 @@ format_float_repr(char *buf, PyFloatObject *v) format_double_repr(buf, PyFloat_AS_DOUBLE(v)); } +#endif /* Py_BROKEN_REPR */ + /* Macro and helper that convert PyObject obj to a C double and store the value in dbl. If conversion to double raises an exception, obj is set to NULL, and the function invoking this macro returns NULL. If @@ -434,8 +437,14 @@ convert_to_double(PyObject **v, double *dbl) static PyObject * float_repr(PyFloatObject *v) { +#ifdef Py_BROKEN_REPR char buf[30]; format_float_repr(buf, v); +#else + char buf[100]; + format_float(buf, sizeof(buf), v, PREC_REPR); +#endif + return PyUnicode_FromString(buf); } @@ -1327,9 +1336,11 @@ _PyFloat_Init(void) double_format = detected_double_format; float_format = detected_float_format; - + +#ifdef Py_BROKEN_REPR /* Initialize floating point repr */ _PyFloat_DigitsInit(); +#endif } void diff --git a/PCbuild/pythoncore.vcproj b/PCbuild/pythoncore.vcproj index 326eacc9a92..2ac8e25d275 100644 --- a/PCbuild/pythoncore.vcproj +++ b/PCbuild/pythoncore.vcproj @@ -487,6 +487,9 @@ <File RelativePath="..\Objects\dictobject.c"> </File> + <!--File + RelativePath="..\Objects\doubledigits.c"> + </File--> <File RelativePath="..\Objects\doubledigits.c"> </File> diff --git a/PCbuild8/pythoncore/pythoncore.vcproj b/PCbuild8/pythoncore/pythoncore.vcproj index 9a848d72972..1a780225e32 100644 --- a/PCbuild8/pythoncore/pythoncore.vcproj +++ b/PCbuild8/pythoncore/pythoncore.vcproj @@ -827,6 +827,10 @@ RelativePath="..\..\Objects\dictobject.c" > </File> + <!--File + RelativePath="..\..\Objects\doubledigits.c" + > + </File--> <File RelativePath="..\..\Objects\doubledigits.c" > diff --git a/PCbuild9/pythoncore.vcproj b/PCbuild9/pythoncore.vcproj index 646cb4f9cf6..42eaa2e4046 100644 --- a/PCbuild9/pythoncore.vcproj +++ b/PCbuild9/pythoncore.vcproj @@ -1362,6 +1362,10 @@ RelativePath="..\Objects\dictobject.c" > </File> + <!--File + RelativePath="..\Objects\doubledigits.c" + > + </File--> <File RelativePath="..\Objects\doubledigits.c" > -- 2.30.9