Commit 386ef4a4 authored by Christian Heimes's avatar Christian Heimes

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
........
parent 9eff2219
......@@ -1047,6 +1047,22 @@ The following functions provide locale-independent string to number conversions.
See the Unix man page :manpage:`atof(2)` for details.
.. cfunction:: char * PyOS_stricmp(char *s1, char *s2)
Case insensitive comparsion of strings. The functions works almost
identical to :cfunc:`strcmp` except that it ignores the case.
.. versionadded:: 2.6
.. cfunction:: char * PyOS_strnicmp(char *s1, char *s2, Py_ssize_t size)
Case insensitive comparsion of strings. The functions works almost
identical to :cfunc:`strncmp` except that it ignores the case.
.. versionadded:: 2.6
.. _reflection:
......
......@@ -421,27 +421,31 @@ Example::
__slots__ = ()
_fields = ('x', 'y')
def __new__(cls, x, y):
return tuple.__new__(cls, (x, y))
_cast = classmethod(tuple.__new__)
def __repr__(self):
return 'Point(x=%r, y=%r)' % self
def _asdict(self):
def _asdict(t):
'Return a new dict which maps field names to their values'
return dict(zip(('x', 'y'), self))
return {'x': t[0], 'y': t[1]}
def _replace(self, **kwds):
'Return a new Point object replacing specified fields with new values'
return Point(*map(kwds.get, ('x', 'y'), self))
return Point._cast(map(kwds.get, ('x', 'y'), self))
@property
def _fields(self):
return ('x', 'y')
x = property(itemgetter(0))
y = property(itemgetter(1))
>>> p = Point(11, y=22) # instantiate with positional or keyword arguments
>>> p[0] + p[1] # indexable like the regular tuple (11, 22)
>>> p[0] + p[1] # indexable like the plain tuple (11, 22)
33
>>> x, y = p # unpack like a regular tuple
>>> x, y
......@@ -456,33 +460,30 @@ by the :mod:`csv` or :mod:`sqlite3` modules::
EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')
from itertools import starmap
import csv
for record in starmap(EmployeeRecord, csv.reader(open("employees.csv", "rb"))):
for emp in map(EmployeeRecord._cast, csv.reader(open("employees.csv", "rb"))):
print(emp.name, emp.title)
import sqlite3
conn = sqlite3.connect('/companydata')
cursor = conn.cursor()
cursor.execute('SELECT name, age, title, department, paygrade FROM employees')
for emp in starmap(EmployeeRecord, cursor.fetchall()):
for emp in map(EmployeeRecord._cast, cursor.fetchall()):
print emp.name, emp.title
When casting a single record to a named tuple, use the star-operator [#]_ to unpack
the values::
In addition to the methods inherited from tuples, named tuples support
three additonal methods and a read-only attribute.
>>> t = [11, 22]
>>> Point(*t) # the star-operator unpacks any iterable object
Point(x=11, y=22)
.. method:: namedtuple._cast(iterable)
When casting a dictionary to a named tuple, use the double-star-operator::
Class method returning a new instance taking the positional arguments from the *iterable*.
Useful for casting existing sequences and iterables to named tuples:
>>> d = {'x': 11, 'y': 22}
>>> Point(**d)
Point(x=11, y=22)
::
In addition to the methods inherited from tuples, named tuples support
two additonal methods and a read-only attribute.
>>> t = [11, 22]
>>> Point._cast(t)
Point(x=11, y=22)
.. method:: somenamedtuple._asdict()
......@@ -529,6 +530,12 @@ function:
>>> getattr(p, 'x')
11
When casting a dictionary to a named tuple, use the double-star-operator [#]_::
>>> d = {'x': 11, 'y': 22}
>>> Point(**d)
Point(x=11, y=22)
Since a named tuple is a regular Python class, it is easy to add or change
functionality. For example, the display format can be changed by overriding
the :meth:`__repr__` method:
......@@ -551,5 +558,5 @@ and customizing it with :meth:`_replace`:
.. rubric:: Footnotes
.. [#] For information on the star-operator see
.. [#] For information on the double-star-operator see
:ref:`tut-unpacking-arguments` and :ref:`calls`.
......@@ -435,7 +435,8 @@ available. They are listed here in alphabetical order.
Convert a string or a number to floating point. If the argument is a string, it
must contain a possibly signed decimal or floating point number, possibly
embedded in whitespace. Otherwise, the argument may be an integer
embedded in whitespace. The argument may also be [+|-]nan or [+|-]inf.
Otherwise, the argument may be a plain integer
or a floating point number, and a floating point number with the same value
(within Python's floating point precision) is returned. If no argument is
given, returns ``0.0``.
......@@ -447,9 +448,10 @@ available. They are listed here in alphabetical order.
single: Infinity
When passing in a string, values for NaN and Infinity may be returned, depending
on the underlying C library. The specific set of strings accepted which cause
these values to be returned depends entirely on the C library and is known to
vary.
on the underlying C library. Float accepts the strings nan, inf and -inf for
NaN and positive or negative infinity. The case and a leading + are ignored as
well as a leading - is ignored for NaN. Float always represents NaN and infinity
as nan, inf or -inf.
The float type is described in :ref:`typesnumeric`.
......
......@@ -285,7 +285,7 @@ numeric operations have a higher priority than comparison operations):
+---------------------+---------------------------------+-------+--------------------+
| ``int(x)`` | *x* converted to integer | \(3) | :func:`int` |
+---------------------+---------------------------------+-------+--------------------+
| ``float(x)`` | *x* converted to floating point | | :func:`float` |
| ``float(x)`` | *x* converted to floating point | \(6) | :func:`float` |
+---------------------+---------------------------------+-------+--------------------+
| ``complex(re, im)`` | a complex number with real part | | :func:`complex` |
| | *re*, imaginary part *im*. | | |
......@@ -329,6 +329,13 @@ Notes:
as in C; see functions :func:`floor` and :func:`ceil` in the :mod:`math` module
for well-defined conversions.
(6)
float also accepts the strings "nan" and "inf" with an optional prefix "+"
or "-" for Not a Number (NaN) and positive or negative infinity.
.. versionadded:: 2.6
.. % XXXJH exceptions: overflow (when? what operations?) zerodivision
......
......@@ -114,6 +114,7 @@
#include "eval.h"
#include "pystrtod.h"
#include "pystrcmp.h"
/* _Py_Mangle is defined in compile.c */
PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name);
......
......@@ -123,6 +123,7 @@ PyAPI_FUNC(Py_ssize_t) PyDict_Size(PyObject *mp);
PyAPI_FUNC(PyObject *) PyDict_Copy(PyObject *mp);
PyAPI_FUNC(int) PyDict_Contains(PyObject *mp, PyObject *key);
PyAPI_FUNC(int) _PyDict_Contains(PyObject *mp, PyObject *key, long hash);
PyAPI_FUNC(PyObject *) _PyDict_NewPresized(Py_ssize_t minused);
/* PyDict_Update(mp, other) is equivalent to PyDict_Merge(mp, other, 1). */
PyAPI_FUNC(int) PyDict_Update(PyObject *mp, PyObject *other);
......
......@@ -36,6 +36,7 @@ extern "C" {
#define INPLACE_FLOOR_DIVIDE 28
#define INPLACE_TRUE_DIVIDE 29
#define STORE_MAP 54
#define INPLACE_ADD 55
#define INPLACE_SUBTRACT 56
#define INPLACE_MULTIPLY 57
......
......@@ -332,6 +332,17 @@ extern "C" {
#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE)
#endif
/* High precision defintion of pi and e (Euler)
* The values are taken from libc6's math.h.
*/
#ifndef Py_MATH_PI
#define Py_MATH_PI 3.1415926535897932384626433832795029L
#endif
#ifndef Py_MATH_E
#define Py_MATH_E 2.7182818284590452353602874713526625L
#endif
/* Py_IS_NAN(X)
* Return 1 if float or double arg is a NaN, else 0.
* Caution:
......@@ -341,8 +352,12 @@ extern "C" {
* a platform where it doesn't work.
*/
#ifndef Py_IS_NAN
#ifdef HAVE_ISNAN
#define Py_IS_NAN(X) isnan(X)
#else
#define Py_IS_NAN(X) ((X) != (X))
#endif
#endif
/* Py_IS_INFINITY(X)
* Return 1 if float or double arg is an infinity, else 0.
......@@ -353,8 +368,12 @@ extern "C" {
* Override in pyconfig.h if you have a better spelling on your platform.
*/
#ifndef Py_IS_INFINITY
#ifdef HAVE_ISINF
#define Py_IS_INFINITY(X) isinf(X)
#else
#define Py_IS_INFINITY(X) ((X) && (X)*0.5 == (X))
#endif
#endif
/* Py_IS_FINITE(X)
* Return 1 if float or double arg is neither infinite nor NAN, else 0.
......@@ -362,8 +381,12 @@ extern "C" {
* macro for this particular test is useful
*/
#ifndef Py_IS_FINITE
#ifdef HAVE_ISFINITE
#define Py_IS_FINITE(X) isfinite
#else
#define Py_IS_FINITE(X) (!Py_IS_INFINITY(X) && !Py_IS_NAN(X))
#endif
#endif
/* HUGE_VAL is supposed to expand to a positive double infinity. Python
* uses Py_HUGE_VAL instead because some platforms are broken in this
......@@ -376,6 +399,15 @@ extern "C" {
#define Py_HUGE_VAL HUGE_VAL
#endif
/* Py_NAN
* A value that evaluates to a NaN. On IEEE 754 platforms INF*0 or
* INF/INF works. Define Py_NO_NAN in pyconfig.h if your platform
* doesn't support NaNs.
*/
#if !defined(Py_NAN) && !defined(Py_NO_NAN)
#define Py_NAN (Py_HUGE_VAL * 0.)
#endif
/* Py_OVERFLOWED(X)
* Return 1 iff a libm function overflowed. Set errno to 0 before calling
* a libm function, and invoke this macro after, passing the function
......
#ifndef Py_STRCMP_H
#define Py_STRCMP_H
#ifdef __cplusplus
extern "C" {
#endif
PyAPI_FUNC(int) PyOS_mystrnicmp(const char *, const char *, Py_ssize_t);
PyAPI_FUNC(int) PyOS_mystricmp(const char *, const char *);
#ifdef MS_WINDOWS
#define PyOS_strnicmp strnicmp
#define PyOS_stricmp stricmp
#else
#define PyOS_strnicmp PyOS_mystrnicmp
#define PyOS_stricmp PyOS_mystricmp
#endif
#ifdef __cplusplus
}
#endif
#endif /* !Py_STRCMP_H */
__all__ = ['deque', 'defaultdict', 'namedtuple']
from _collections import deque, defaultdict
from operator import itemgetter as _itemgetter
from itertools import izip as _izip
from keyword import iskeyword as _iskeyword
import sys as _sys
# For bootstrapping reasons, the collection ABCs are defined in _abcoll.py.
# They should however be considered an integral part of collections.py.
from _abcoll import *
import _abcoll
__all__ += _abcoll.__all__
from _collections import deque, defaultdict
from operator import itemgetter as _itemgetter
from keyword import iskeyword as _iskeyword
import sys as _sys
def namedtuple(typename, field_names, verbose=False):
"""Returns a new subclass of tuple with named fields.
......@@ -19,9 +17,9 @@ def namedtuple(typename, field_names, verbose=False):
>>> Point.__doc__ # docstring for the new class
'Point(x, y)'
>>> p = Point(11, y=22) # instantiate with positional args or keywords
>>> p[0] + p[1] # works just like the tuple (11, 22)
>>> p[0] + p[1] # indexable like a plain tuple
33
>>> x, y = p # unpacks just like a tuple
>>> x, y = p # unpack like a regular tuple
>>> x, y
(11, 22)
>>> p.x + p.y # fields also accessable by name
......@@ -58,31 +56,35 @@ def namedtuple(typename, field_names, verbose=False):
# Create and fill-in the class template
argtxt = repr(field_names).replace("'", "")[1:-1] # tuple repr without parens or quotes
reprtxt = ', '.join('%s=%%r' % name for name in field_names)
dicttxt = ', '.join('%r: t[%d]' % (name, pos) for pos, name in enumerate(field_names))
template = '''class %(typename)s(tuple):
'%(typename)s(%(argtxt)s)' \n
__slots__ = () \n
_fields = property(lambda self: %(field_names)r) \n
def __new__(cls, %(argtxt)s):
return tuple.__new__(cls, (%(argtxt)s)) \n
_cast = classmethod(tuple.__new__) \n
def __repr__(self):
return '%(typename)s(%(reprtxt)s)' %% self \n
def _asdict(self, dict=dict, zip=zip):
def _asdict(t):
'Return a new dict which maps field names to their values'
return dict(zip(%(field_names)r, self)) \n
return {%(dicttxt)s} \n
def _replace(self, **kwds):
'Return a new %(typename)s object replacing specified fields with new values'
return %(typename)s(*map(kwds.get, %(field_names)r, self)) \n\n''' % locals()
return %(typename)s._cast(map(kwds.get, %(field_names)r, self)) \n
@property
def _fields(self):
return %(field_names)r \n\n''' % locals()
for i, name in enumerate(field_names):
template += ' %s = property(itemgetter(%d))\n' % (name, i)
if verbose:
print(template)
# Execute the template string in a temporary namespace
namespace = dict(itemgetter=_itemgetter, zip=_izip)
namespace = dict(itemgetter=_itemgetter)
try:
exec(template, namespace)
except SyntaxError as e:
raise SyntaxError(e.message + ':\n' + template)
raise SyntaxError(e.msg + ':\n' + template) from e
result = namespace[typename]
# For pickling to work, the __module__ variable needs to be set to the frame
......
import unittest
from ctypes import *
class X(Structure):
_fields_ = [("foo", c_int)]
class TestCase(unittest.TestCase):
def test_simple(self):
self.assertRaises(TypeError,
delattr, c_int(42), "value")
def test_chararray(self):
self.assertRaises(TypeError,
delattr, (c_char * 5)(), "value")
def test_struct(self):
self.assertRaises(TypeError,
delattr, X(), "foo")
if __name__ == "__main__":
unittest.main()
......@@ -11,6 +11,10 @@ import sys, os
# the real Tcl library will do.
prefix = os.path.join(sys.prefix,"tcl")
if not os.path.exists(prefix):
# devdir/../tcltk/lib
prefix = os.path.join(sys.prefix, os.path.pardir, "tcltk", "lib")
prefix = os.path.abspath(prefix)
# if this does not exist, no further search is needed
if os.path.exists(prefix):
if "TCL_LIBRARY" not in os.environ:
......
......@@ -71,6 +71,7 @@ def_op('BINARY_TRUE_DIVIDE', 27)
def_op('INPLACE_FLOOR_DIVIDE', 28)
def_op('INPLACE_TRUE_DIVIDE', 29)
def_op('STORE_MAP', 54)
def_op('INPLACE_ADD', 55)
def_op('INPLACE_SUBTRACT', 56)
def_op('INPLACE_MULTIPLY', 57)
......@@ -123,7 +124,7 @@ name_op('LOAD_NAME', 101) # Index in name list
def_op('BUILD_TUPLE', 102) # Number of tuple items
def_op('BUILD_LIST', 103) # Number of list items
def_op('BUILD_SET', 104) # Number of set items
def_op('BUILD_MAP', 105) # Always zero for now
def_op('BUILD_MAP', 105) # Number of dict entries (upto 255)
name_op('LOAD_ATTR', 106) # Index in name list
def_op('COMPARE_OP', 107) # Comparison operator
hascompare.append(107)
......
......@@ -49,6 +49,7 @@ class TestNamedTuple(unittest.TestCase):
self.assertEqual(repr(p), 'Point(x=11, y=22)')
self.assert_('__dict__' not in dir(p)) # verify instance has no dict
self.assert_('__weakref__' not in dir(p))
self.assertEqual(p, Point._cast([11, 22])) # test _cast classmethod
self.assertEqual(p._fields, ('x', 'y')) # test _fields attribute
self.assertEqual(p._replace(x=1), (1, 22)) # test _replace method
self.assertEqual(p._asdict(), dict(x=11, y=22)) # test _asdict method
......@@ -93,9 +94,40 @@ class TestNamedTuple(unittest.TestCase):
def test_odd_sizes(self):
Zero = namedtuple('Zero', '')
self.assertEqual(Zero(), ())
self.assertEqual(Zero._cast([]), ())
self.assertEqual(repr(Zero()), 'Zero()')
self.assertEqual(Zero()._asdict(), {})
self.assertEqual(Zero()._fields, ())
Dot = namedtuple('Dot', 'd')
self.assertEqual(Dot(1), (1,))
self.assertEqual(Dot._cast([1]), (1,))
self.assertEqual(Dot(1).d, 1)
self.assertEqual(repr(Dot(1)), 'Dot(d=1)')
self.assertEqual(Dot(1)._asdict(), {'d':1})
self.assertEqual(Dot(1)._replace(d=999), (999,))
self.assertEqual(Dot(1)._fields, ('d',))
# n = 10000
n = 254 # SyntaxError: more than 255 arguments:
import string, random
names = [''.join([random.choice(string.ascii_letters) for j in range(10)]) for i in range(n)]
Big = namedtuple('Big', names)
b = Big(*range(n))
self.assertEqual(b, tuple(range(n)))
self.assertEqual(Big._cast(range(n)), tuple(range(n)))
for pos, name in enumerate(names):
self.assertEqual(getattr(b, name), pos)
repr(b) # make sure repr() doesn't blow-up
d = b._asdict()
d_expected = dict(zip(names, range(n)))
self.assertEqual(d, d_expected)
b2 = b._replace(**dict([(names[1], 999),(names[-5], 42)]))
b2_expected = list(range(n))
b2_expected[1] = 999
b2_expected[-5] = 42
self.assertEqual(b2, tuple(b2_expected))
self.assertEqual(b._fields, tuple(names))
class TestOneTrickPonyABCs(unittest.TestCase):
......
import unittest
from test import test_support
import sys, UserDict
import sys, UserDict, random, string
class DictTest(unittest.TestCase):
......@@ -11,6 +11,15 @@ class DictTest(unittest.TestCase):
self.assertEqual(dict(), {})
self.assert_(dict() is not {})
def test_literal_constructor(self):
# check literal constructor for different sized dicts (to exercise the BUILD_MAP oparg
items = []
for n in range(400):
dictliteral = '{' + ', '.join('%r: %d' % item for item in items) + '}'
self.assertEqual(eval(dictliteral), dict(items))
items.append((''.join([random.choice(string.ascii_letters) for j in range(8)]), n))
random.shuffle(items)
def test_bool(self):
self.assert_(not {})
self.assert_({1: 2})
......
......@@ -3,6 +3,12 @@ import unittest, struct
import os
from test import test_support
def isinf(x):
return x * 0.5 == x
def isnan(x):
return x != x
class FormatFunctionsTestCase(unittest.TestCase):
def setUp(self):
......@@ -159,6 +165,70 @@ class ReprTestCase(unittest.TestCase):
self.assertEqual(v, eval(repr(v)))
floats_file.close()
# Beginning with Python 2.6 float has cross platform compatible
# ways to create and representate inf and nan
class InfNanTest(unittest.TestCase):
def test_inf_from_str(self):
self.assert_(isinf(float("inf")))
self.assert_(isinf(float("+inf")))
self.assert_(isinf(float("-inf")))
self.assertEqual(repr(float("inf")), "inf")
self.assertEqual(repr(float("+inf")), "inf")
self.assertEqual(repr(float("-inf")), "-inf")
self.assertEqual(repr(float("INF")), "inf")
self.assertEqual(repr(float("+Inf")), "inf")
self.assertEqual(repr(float("-iNF")), "-inf")
self.assertEqual(str(float("inf")), "inf")
self.assertEqual(str(float("+inf")), "inf")
self.assertEqual(str(float("-inf")), "-inf")
self.assertRaises(ValueError, float, "info")
self.assertRaises(ValueError, float, "+info")
self.assertRaises(ValueError, float, "-info")
self.assertRaises(ValueError, float, "in")
self.assertRaises(ValueError, float, "+in")
self.assertRaises(ValueError, float, "-in")
def test_inf_as_str(self):
self.assertEqual(repr(1e300 * 1e300), "inf")
self.assertEqual(repr(-1e300 * 1e300), "-inf")
self.assertEqual(str(1e300 * 1e300), "inf")
self.assertEqual(str(-1e300 * 1e300), "-inf")
def test_nan_from_str(self):
self.assert_(isnan(float("nan")))
self.assert_(isnan(float("+nan")))
self.assert_(isnan(float("-nan")))
self.assertEqual(repr(float("nan")), "nan")
self.assertEqual(repr(float("+nan")), "nan")
self.assertEqual(repr(float("-nan")), "nan")
self.assertEqual(repr(float("NAN")), "nan")
self.assertEqual(repr(float("+NAn")), "nan")
self.assertEqual(repr(float("-NaN")), "nan")
self.assertEqual(str(float("nan")), "nan")
self.assertEqual(str(float("+nan")), "nan")
self.assertEqual(str(float("-nan")), "nan")
self.assertRaises(ValueError, float, "nana")
self.assertRaises(ValueError, float, "+nana")
self.assertRaises(ValueError, float, "-nana")
self.assertRaises(ValueError, float, "na")
self.assertRaises(ValueError, float, "+na")
self.assertRaises(ValueError, float, "-na")
def test_nan_as_str(self):
self.assertEqual(repr(1e300 * 1e300 * 0), "nan")
self.assertEqual(repr(-1e300 * 1e300 * 0), "nan")
self.assertEqual(str(1e300 * 1e300 * 0), "nan")
self.assertEqual(str(-1e300 * 1e300 * 0), "nan")
def test_main():
test_support.run_unittest(
......@@ -166,7 +236,8 @@ def test_main():
UnknownFormatTestCase,
IEEEFormatTestCase,
FormatTestCase,
#ReprTestCase
ReprTestCase,
InfNanTest,
)
if __name__ == '__main__':
......
......@@ -275,6 +275,7 @@ PYTHON_OBJS= \
Python/sysmodule.o \
Python/traceback.o \
Python/getopt.o \
Python/pystrcmp.o \
Python/pystrtod.o \
Python/formatter_unicode.o \
Python/$(DYNLOADFILE) \
......@@ -585,6 +586,8 @@ PYTHON_HEADERS= \
Include/pymem.h \
Include/pyport.h \
Include/pystate.h \
Include/pystrtod.h \
Include/pystrcmp.h \
Include/pythonrun.h \
Include/rangeobject.h \
Include/setobject.h \
......
......@@ -783,6 +783,12 @@ CharArray_set_value(CDataObject *self, PyObject *value)
char *ptr;
Py_ssize_t size;
if (value == NULL) {
PyErr_SetString(PyExc_TypeError,
"can't delete attribute");
return -1;
}
if (PyUnicode_Check(value)) {
value = PyUnicode_AsEncodedString(value,
conversion_mode_encoding,
......@@ -838,6 +844,11 @@ WCharArray_set_value(CDataObject *self, PyObject *value)
{
Py_ssize_t result = 0;
if (value == NULL) {
PyErr_SetString(PyExc_TypeError,
"can't delete attribute");
return -1;
}
if (PyString_Check(value)) {
value = PyUnicode_FromEncodedObject(value,
conversion_mode_encoding,
......@@ -4022,6 +4033,11 @@ Simple_set_value(CDataObject *self, PyObject *value)
PyObject *result;
StgDictObject *dict = PyObject_stgdict((PyObject *)self);
if (value == NULL) {
PyErr_SetString(PyExc_TypeError,
"can't delete attribute");
return -1;
}
assert(dict); /* Cannot be NULL for CDataObject instances */
assert(dict->setfunc);
result = dict->setfunc(self->b_ptr, value, dict->size);
......
......@@ -195,6 +195,11 @@ CField_set(CFieldObject *self, PyObject *inst, PyObject *value)
assert(CDataObject_Check(inst));
dst = (CDataObject *)inst;
ptr = dst->b_ptr + self->offset;
if (value == NULL) {
PyErr_SetString(PyExc_TypeError,
"can't delete attribute");
return -1;
}
return CData_set(inst, self->proto, self->setfunc, value,
self->index, self->size, ptr);
}
......
......@@ -2181,12 +2181,12 @@ See recv() for documentation about the flags.");
/*
* This is the guts of the recv() and recv_into() methods, which reads into a
* char buffer. If you have any inc/def ref to do to the objects that contain
* the buffer, do it in the caller. This function returns the number of bytes
* succesfully read. If there was an error, it returns -1. Note that it is
* also possible that we return a number of bytes smaller than the request
* bytes.
* This is the guts of the recvfrom() and recvfrom_into() methods, which reads
* into a char buffer. If you have any inc/def ref to do to the objects that
* contain the buffer, do it in the caller. This function returns the number
* of bytes succesfully read. If there was an error, it returns -1. Note
* that it is also possible that we return a number of bytes smaller than the
* request bytes.
*
* 'addr' is a return value for the address object. Note that you must decref
* it yourself.
......
......@@ -551,6 +551,23 @@ dictresize(PyDictObject *mp, Py_ssize_t minused)
return 0;
}
/* Create a new dictionary pre-sized to hold an estimated number of elements.
Underestimates are okay because the dictionary will resize as necessary.
Overestimates just mean the dictionary will be more sparse than usual.
*/
PyObject *
_PyDict_NewPresized(Py_ssize_t minused)
{
PyObject *op = PyDict_New();
if (minused>5 && op != NULL && dictresize((PyDictObject *)op, minused) == -1) {
Py_DECREF(op);
return NULL;
}
return op;
}
/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
* that may occur (originally dicts supported only string keys, and exceptions
* weren't possible). So, while the original intent was that a NULL return
......
......@@ -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
......
......@@ -386,6 +386,15 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */
/* Fairly standard from here! */
/* Define to 1 if you have the `copysign' function. */
/* #define HAVE_COPYSIGN 1*/
/* Define to 1 if you have the `isinf' function. */
#define HAVE_ISINF 1
/* Define to 1 if you have the `isnan' function. */
#define HAVE_ISNAN 1
/* Define if on AIX 3.
System headers sometimes define this.
We just want to avoid a redefinition error message. */
......
......@@ -700,6 +700,10 @@
<File
RelativePath="..\Python\pystate.c">
</File>
<File
RelativePath="..\Python\pystrcmp.c"
>
</File>
<File
RelativePath="..\Python\pystrtod.c">
</File>
......
......@@ -735,6 +735,10 @@
RelativePath="..\..\Python\pystate.c"
>
</File>
<File
RelativePath="..\..\Python\pystrcmp.c"
>
</File>
<File
RelativePath="..\..\Python\pystrtod.c"
>
......@@ -1213,6 +1217,10 @@
RelativePath="..\..\Include\pystate.h"
>
</File>
<File
RelativePath="..\..\Include\pystrcmp.h"
>
</File>
<File
RelativePath="..\..\Include\pystrtod.h"
>
......
This diff is collapsed.
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE 7, 1
#pragma code_page(1252)
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
......@@ -56,7 +56,7 @@
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="$(tcltkDir)\lib\tcl84.lib $(tcltkDir)\lib\tk84.lib $(tcltkDir)\lib\tix8.4\tix84.lib"
AdditionalDependencies="$(tcltkLib)"
/>
<Tool
Name="VCALinkTool"
......@@ -118,7 +118,7 @@
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="$(tcltk64Dir)\lib\tcl84.lib $(tcltk64Dir)\lib\tk84.lib $(tcltk64Dir)\lib\tix8.4\tix84.lib"
AdditionalDependencies="$(tcltk64Lib)"
/>
<Tool
Name="VCALinkTool"
......@@ -180,7 +180,7 @@
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="$(tcltkDir)\lib\tcl84.lib $(tcltkDir)\lib\tk84.lib $(tcltkDir)\lib\tix8.4\tix84.lib"
AdditionalDependencies="$(tcltkLib)"
/>
<Tool
Name="VCALinkTool"
......@@ -243,7 +243,7 @@
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="$(tcltk64Dir)\lib\tcl84.lib $(tcltk64Dir)\lib\tk84.lib $(tcltk64Dir)\lib\tix8.4\tix84.lib"
AdditionalDependencies="$(tcltk64Lib)"
/>
<Tool
Name="VCALinkTool"
......@@ -305,7 +305,7 @@
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="$(tcltkDir)\lib\tcl84.lib $(tcltkDir)\lib\tk84.lib $(tcltkDir)\lib\tix8.4\tix84.lib"
AdditionalDependencies="$(tcltkLib)"
/>
<Tool
Name="VCALinkTool"
......@@ -368,7 +368,7 @@
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="$(tcltk64Dir)\lib\tcl84.lib $(tcltk64Dir)\lib\tk84.lib $(tcltk64Dir)\lib\tix8.4\tix84.lib"
AdditionalDependencies="$(tcltk64Lib)"
TargetMachine="17"
/>
<Tool
......@@ -431,7 +431,7 @@
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="$(tcltkDir)\lib\tcl84.lib $(tcltkDir)\lib\tk84.lib $(tcltkDir)\lib\tix8.4\tix84.lib"
AdditionalDependencies="$(tcltkLib)"
/>
<Tool
Name="VCALinkTool"
......@@ -494,7 +494,7 @@
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="$(tcltk64Dir)\lib\tcl84.lib $(tcltk64Dir)\lib\tk84.lib $(tcltk64Dir)\lib\tix8.4\tix84.lib"
AdditionalDependencies="$(tcltk64Lib)"
TargetMachine="17"
/>
<Tool
......
......@@ -12,14 +12,24 @@ import shutil
here = os.path.abspath(os.path.dirname(__file__))
par = os.path.pardir
TCL = "tcl8.4.16"
TK = "tk8.4.16"
TIX = "tix-8.4.0"
#TIX = "Tix8.4.2"
ROOT = os.path.abspath(os.path.join(here, par, par))
NMAKE = "nmake /nologo "
if 1:
TCL = "tcl8.4.16"
TK = "tk8.4.16"
TIX = "tix-8.4.0"
else:
TCL = "tcl8.5b3"
TK = "tcl8.5b3"
TIX = "Tix8.4.2"
def system(cmd):
ROOT = os.path.abspath(os.path.join(here, par, par))
# Windows 2000 compatibility: WINVER 0x0500
# http://msdn2.microsoft.com/en-us/library/aa383745.aspx
NMAKE = "nmake /nologo /f %s COMPILERFLAGS=-DWINVER=0x0500 %s %s"
def nmake(makefile, command="", **kw):
defines = ' '.join(k+'='+v for k, v in kw.items())
cmd = NMAKE % (makefile, defines, command)
print("\n\n"+cmd+"\n")
if os.system(cmd) != 0:
raise RuntimeError(cmd)
......@@ -35,31 +45,29 @@ def build(platform, clean):
# TCL
tcldir = os.path.join(ROOT, TCL)
if True:
if 1:
os.chdir(os.path.join(tcldir, "win"))
if clean:
system(NMAKE + "/f makefile.vc clean")
system(NMAKE + "/f makefile.vc")
system(NMAKE + "/f makefile.vc INSTALLDIR=%s install" % dest)
nmake("makefile.vc", "clean")
nmake("makefile.vc")
nmake("makefile.vc", "install", INSTALLDIR=dest)
# TK
if True:
if 1:
os.chdir(os.path.join(ROOT, TK, "win"))
if clean:
system(NMAKE + "/f makefile.vc clean")
system(NMAKE + "/f makefile.vc TCLDIR=%s" % tcldir)
system(NMAKE + "/f makefile.vc TCLDIR=%s INSTALLDIR=%s install" %
(tcldir, dest))
nmake("makefile.vc", "clean", TCLDIR=tcldir)
nmake("makefile.vc", TCLDIR=tcldir)
nmake("makefile.vc", "install", TCLDIR=tcldir, INSTALLDIR=dest)
# TIX
if True:
if 1:
# python9.mak is available at http://svn.python.org
os.chdir(os.path.join(ROOT, TIX, "win"))
if clean:
system(NMAKE + "/f python9.mak clean")
system(NMAKE + "/f python9.mak MACHINE=%s" % machine)
system(NMAKE + "/f python9.mak install")
nmake("python9.mak", "clean")
nmake("python9.mak", MACHINE=machine)
nmake("python9.mak", "install")
def main():
if len(sys.argv) < 2 or sys.argv[1] not in ("Win32", "x64"):
......
@echo off
rem start idle
rem Usage: idle [-d]
rem -d Run Debug build (python_d.exe). Else release build.
setlocal
set exe=python
PATH %PATH%;..\..\tcltk\bin
if "%1"=="-d" (set exe=python_d) & shift
set cmd=%exe% ../Lib/idlelib/idle.py %1 %2 %3 %4 %5 %6 %7 %8 %9
echo on
%cmd%
......@@ -68,4 +68,12 @@
Name="tcltk64Dir"
Value="..\..\tcltk64"
/>
<UserMacro
Name="tcltkLib"
Value="$(tcltkDir)\lib\tcl84.lib $(tcltkDir)\lib\tk84.lib $(tcltkDir)\lib\tix8.4\tix84.lib"
/>
<UserMacro
Name="tcltk64Lib"
Value="$(tcltk64Dir)\lib\tcl84.lib $(tcltk64Dir)\lib\tk84.lib $(tcltk64Dir)\lib\tix8.4\tix84.lib"
/>
</VisualStudioPropertySheet>
<?xml version="1.0"?>
<project>
<target name="all" description="Build all targets.">
<solution configuration="release">
<projects>
<include name="make_versioninfo.vcproj" />
</projects>
</solution>
<exec program="make_versioninfo" output="pythonnt_rc.h" />
<solution configuration="release" solutionfile="pcbuild.sln">
<excludeprojects>
<include name="_bsddb.vcproj" />
</excludeprojects>
</solution>
</target>
</project>
This diff is collapsed.
This diff is collapsed.
......@@ -878,6 +878,10 @@
RelativePath="..\Include\pystate.h"
>
</File>
<File
RelativePath="..\Include\pystrcmp.h"
>
</File>
<File
RelativePath="..\Include\pystrtod.h"
>
......@@ -1714,6 +1718,10 @@
RelativePath="..\Python\pystate.c"
>
</File>
<File
RelativePath="..\Python\pystrcmp.c"
>
</File>
<File
RelativePath="..\Python\pystrtod.c"
>
......
......@@ -1787,11 +1787,23 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
break;
case BUILD_MAP:
x = PyDict_New();
x = _PyDict_NewPresized((Py_ssize_t)oparg);
PUSH(x);
if (x != NULL) continue;
break;
case STORE_MAP:
w = TOP(); /* key */
u = SECOND(); /* value */
v = THIRD(); /* dict */
STACKADJ(-2);
assert (PyDict_CheckExact(v));
err = PyDict_SetItem(v, w, u); /* v[w] = u */
Py_DECREF(u);
Py_DECREF(w);
if (err == 0) continue;
break;
case LOAD_ATTR:
w = GETITEM(names, oparg);
v = TOP();
......
......@@ -714,6 +714,8 @@ opcode_stack_effect(int opcode, int oparg)
return -1;
case STORE_SUBSCR:
return -3;
case STORE_MAP:
return -2;
case DELETE_SUBSCR:
return -2;
......@@ -3169,19 +3171,14 @@ compiler_visit_expr(struct compiler *c, expr_ty e)
case IfExp_kind:
return compiler_ifexp(c, e);
case Dict_kind:
/* XXX get rid of arg? */
ADDOP_I(c, BUILD_MAP, 0);
n = asdl_seq_LEN(e->v.Dict.values);
/* We must arrange things just right for STORE_SUBSCR.
It wants the stack to look like (value) (dict) (key) */
ADDOP_I(c, BUILD_MAP, (n>255 ? 255 : n));
for (i = 0; i < n; i++) {
ADDOP(c, DUP_TOP);
VISIT(c, expr,
(expr_ty)asdl_seq_GET(e->v.Dict.values, i));
ADDOP(c, ROT_TWO);
VISIT(c, expr,
(expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
ADDOP(c, STORE_SUBSCR);
ADDOP(c, STORE_MAP);
}
break;
case Set_kind:
......
......@@ -66,7 +66,7 @@ extern time_t PyOS_GetLastModificationTime(char *, FILE *);
Python 2.5c1: 62121 (fix wrong lnotab with for loops and
storing constants that should have been removed)
Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp)
Python 2.6a0: 62141 (peephole optimizations)
Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode)
Python 3000: 3000
3010 (removed UNARY_CONVERT)
3020 (added BUILD_SET)
......@@ -77,9 +77,10 @@ extern time_t PyOS_GetLastModificationTime(char *, FILE *);
3070 (PEP 3109 raise changes)
3080 (PEP 3137 make __file__ and __name__ unicode)
3090 (kill str8 interning)
3100 (merge from 2.6a0, see 62151)
.
*/
#define MAGIC (3090 | ((long)'\r'<<16) | ((long)'\n'<<24))
#define MAGIC (3100 | ((long)'\r'<<16) | ((long)'\n'<<24))
/* Magic word as global; note that _PyImport_Init() can change the
value of this global to accommodate for alterations of how the
......
/* Cross platform case insenstive string compare functions
*/
#include "Python.h"
int
PyOS_mystrnicmp(const char *s1, const char *s2, Py_ssize_t size)
{
if (size == 0)
return 0;
while ((--size > 0) && (tolower(*s1) == tolower(*s2))) {
if (!*s1++ || !*s2++)
break;
}
return tolower(*s1) - tolower(*s2);
}
int
PyOS_mystricmp(const char *s1, const char *s2)
{
while (*s1 && (tolower(*s1++) == tolower(*s2++))) {
;
}
return (tolower(*s1) - tolower(*s2));
}
#! /bin/sh
# From configure.in Revision: 59484 .
# From configure.in Revision: 59533 .
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.61 for python 3.0.
#
......@@ -20581,6 +20581,9 @@ echo "${ECHO_T}default LIBC=\"$LIBC\"" >&6; }
fi
# ************************************
# * Check for mathematical functions *
# ************************************
# check for hypot() in math library
LIBS_SAVE=$LIBS
LIBS="$LIBS $LIBM"
......@@ -20686,6 +20689,105 @@ fi
done
for ac_func in copysign isfinite isnan isinf
do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
{ echo "$as_me:$LINENO: checking for $ac_func" >&5
echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
For example, HP-UX 11i <limits.h> declares gettimeofday. */
#define $ac_func innocuous_$ac_func
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func (); below.
Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
<limits.h> exists even on freestanding compilers. */
#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif
#undef $ac_func
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char $ac_func ();
/* The GNU C library defines this for functions which it implements
to always fail with ENOSYS. Some functions are actually named
something starting with __ and the normal name is an alias. */
#if defined __stub_$ac_func || defined __stub___$ac_func
choke me
#endif
int
main ()
{
return $ac_func ();
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
(eval "$ac_link") 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest$ac_exeext &&
$as_test_x conftest$ac_exeext; then
eval "$as_ac_var=yes"
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
eval "$as_ac_var=no"
fi
rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
conftest$ac_exeext conftest.$ac_ext
fi
ac_res=`eval echo '${'$as_ac_var'}'`
{ echo "$as_me:$LINENO: result: $ac_res" >&5
echo "${ECHO_T}$ac_res" >&6; }
if test `eval echo '${'$as_ac_var'}'` = yes; then
cat >>confdefs.h <<_ACEOF
#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF
fi
done
LIBS=$LIBS_SAVE
# check for wchar.h
......
......@@ -2944,10 +2944,16 @@ else AC_MSG_ERROR([proper usage is --with-libc=STRING])
fi],
[AC_MSG_RESULT(default LIBC="$LIBC")])
# ************************************
# * Check for mathematical functions *
# ************************************
# check for hypot() in math library
LIBS_SAVE=$LIBS
LIBS="$LIBS $LIBM"
AC_REPLACE_FUNCS(hypot)
AC_CHECK_FUNCS(copysign isfinite isnan isinf)
LIBS=$LIBS_SAVE
# check for wchar.h
......
......@@ -82,6 +82,9 @@
/* Define to 1 if you have the <conio.h> header file. */
#undef HAVE_CONIO_H
/* Define to 1 if you have the `copysign' function. */
#undef HAVE_COPYSIGN
/* Define to 1 if you have the `ctermid' function. */
#undef HAVE_CTERMID
......@@ -285,6 +288,15 @@
/* Define to 1 if you have the <io.h> header file. */
#undef HAVE_IO_H
/* Define to 1 if you have the `isfinite' function. */
#undef HAVE_ISFINITE
/* Define to 1 if you have the `isinf' function. */
#undef HAVE_ISINF
/* Define to 1 if you have the `isnan' function. */
#undef HAVE_ISNAN
/* Define to 1 if you have the `kill' function. */
#undef HAVE_KILL
......@@ -1034,3 +1046,4 @@
#endif /*Py_PYCONFIG_H*/
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment