Merged revisions 59541-59561 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r59544 | raymond.hettinger | 2007-12-18 01:13:45 +0100 (Tue, 18 Dec 2007) | 1 line

  Add more namedtuple() test cases.  Neaten the code and comments.
........
  r59545 | christian.heimes | 2007-12-18 04:38:03 +0100 (Tue, 18 Dec 2007) | 3 lines

  Fixed for #1601: IDLE not working correctly on Windows (Py30a2/IDLE30a1)

  Amaury's ideas works great. Should we build the Python core with WINVER=0x0500 and _WIN32_WINNT=0x0500, too?
........
  r59546 | christian.heimes | 2007-12-18 10:00:13 +0100 (Tue, 18 Dec 2007) | 1 line

  Make it a bit easier to test Tcl/Tk and idle from a build dir.
........
  r59547 | christian.heimes | 2007-12-18 10:12:10 +0100 (Tue, 18 Dec 2007) | 1 line

  Removed several unused files from the PCbuild9 directory. They are relics from the past.
........
  r59548 | raymond.hettinger | 2007-12-18 19:26:18 +0100 (Tue, 18 Dec 2007) | 29 lines

  Speed-up dictionary constructor by about 10%.

  New opcode, STORE_MAP saves the compiler from awkward stack manipulations
  and specializes for dicts using PyDict_SetItem instead of PyObject_SetItem.

  Old disassembly:
                0 BUILD_MAP                0
                3 DUP_TOP
                4 LOAD_CONST               1 (1)
                7 ROT_TWO
                8 LOAD_CONST               2 ('x')
               11 STORE_SUBSCR
               12 DUP_TOP
               13 LOAD_CONST               3 (2)
               16 ROT_TWO
               17 LOAD_CONST               4 ('y')
               20 STORE_SUBSCR

  New disassembly:
                0 BUILD_MAP                0
                3 LOAD_CONST               1 (1)
                6 LOAD_CONST               2 ('x')
                9 STORE_MAP
               10 LOAD_CONST               3 (2)
               13 LOAD_CONST               4 ('y')
               16 STORE_MAP
........
  r59549 | thomas.heller | 2007-12-18 20:00:34 +0100 (Tue, 18 Dec 2007) | 2 lines

  Issue #1642: Fix segfault in ctypes when trying to delete attributes.
........
  r59551 | guido.van.rossum | 2007-12-18 21:10:42 +0100 (Tue, 18 Dec 2007) | 2 lines

  Issue #1645 by Alberto Bertogli.  Fix a comment.
........
  r59553 | raymond.hettinger | 2007-12-18 22:24:09 +0100 (Tue, 18 Dec 2007) | 12 lines

  Give meaning to the oparg for BUILD_MAP:  estimated size of the dictionary.

  Allows dictionaries to be pre-sized (upto 255 elements) saving time lost
  to re-sizes with their attendant mallocs and re-insertions.

  Has zero effect on small dictionaries (5 elements or fewer), a slight
  benefit for dicts upto 22 elements (because they had to resize once
  anyway), and more benefit for dicts upto 255 elements (saving multiple
  resizes during the build-up and reducing the number of collisions on
  the first insertions).  Beyond 255 elements, there is no addional benefit.
........
  r59554 | christian.heimes | 2007-12-18 22:56:09 +0100 (Tue, 18 Dec 2007) | 1 line

  Fixed #1649: IDLE error: dictionary changed size during iteration
........
  r59557 | raymond.hettinger | 2007-12-18 23:21:27 +0100 (Tue, 18 Dec 2007) | 1 line

  Simplify and speedup _asdict() for named tuples.
........
  r59558 | christian.heimes | 2007-12-19 00:22:54 +0100 (Wed, 19 Dec 2007) | 3 lines

  Applied patch #1635: Float patch for inf and nan on Windows (and other platforms).

  The patch unifies float("inf") and repr(float("inf")) on all platforms.
........
  r59559 | raymond.hettinger | 2007-12-19 00:51:15 +0100 (Wed, 19 Dec 2007) | 1 line

  Users demand iterable input for named tuples. The author capitulates.
........
  r59560 | raymond.hettinger | 2007-12-19 01:21:06 +0100 (Wed, 19 Dec 2007) | 1 line

  Beef-up tests for dict literals
........
  r59561 | raymond.hettinger | 2007-12-19 01:27:21 +0100 (Wed, 19 Dec 2007) | 1 line

  Zap a duplicate line
........
This commit is contained in:
Christian Heimes 2007-12-19 02:07:34 +00:00
parent 2c18161606
commit 99170a5dbf
42 changed files with 628 additions and 4149 deletions

View file

@ -114,7 +114,7 @@ PyFloat_FromDouble(double fval)
PyObject *
PyFloat_FromString(PyObject *v)
{
const char *s, *last, *end;
const char *s, *last, *end, *sp;
double x;
char buffer[256]; /* for errors */
char *s_buffer = NULL;
@ -146,6 +146,7 @@ PyFloat_FromString(PyObject *v)
PyErr_SetString(PyExc_ValueError, "empty string for float()");
goto error;
}
sp = s;
/* We don't care about overflow or underflow. If the platform supports
* them, infinities and signed zeroes (on underflow) are fine.
* However, strtod can return 0 for denormalized numbers, where atof
@ -161,7 +162,26 @@ PyFloat_FromString(PyObject *v)
byte at the end of the string, when the input is inf(inity). */
if (end > last)
end = last;
/* Check for inf and nan. This is done late because it rarely happens. */
if (end == s) {
char *p = (char*)sp;
int sign = 1;
if (*p == '-') {
sign = -1;
p++;
}
if (*p == '+') {
p++;
}
if (PyOS_strnicmp(p, "inf", 4) == 0) {
return PyFloat_FromDouble(sign * Py_HUGE_VAL);
}
#ifdef Py_NAN
if(PyOS_strnicmp(p, "nan", 4) == 0) {
return PyFloat_FromDouble(Py_NAN);
}
#endif
PyOS_snprintf(buffer, sizeof(buffer),
"invalid literal for float(): %.200s", s);
PyErr_SetString(PyExc_ValueError, buffer);
@ -250,7 +270,9 @@ format_double(char *buf, size_t buflen, double ob_fval, int precision)
{
register char *cp;
char format[32];
/* Subroutine for float_repr, float_str, and others.
int i;
/* Subroutine for float_repr, float_str and float_print.
We want float numbers to be recognizable as such,
i.e., they should contain a decimal point or an exponent.
However, %g may print the number as an integer;
@ -271,7 +293,33 @@ format_double(char *buf, size_t buflen, double ob_fval, int precision)
*cp++ = '.';
*cp++ = '0';
*cp++ = '\0';
return;
}
/* Checking the next three chars should be more than enough to
* detect inf or nan, even on Windows. We check for inf or nan
* at last because they are rare cases.
*/
for (i=0; *cp != '\0' && i<3; cp++, i++) {
if (isdigit(Py_CHARMASK(*cp)) || *cp == '.')
continue;
/* found something that is neither a digit nor point
* it might be a NaN or INF
*/
#ifdef Py_NAN
if (Py_IS_NAN(ob_fval)) {
strcpy(buf, "nan");
}
else
#endif
if (Py_IS_INFINITY(ob_fval)) {
cp = buf;
if (*cp == '-')
cp++;
strcpy(cp, "inf");
}
break;
}
}
static void