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

@ -1048,6 +1048,22 @@ The following functions provide locale-independent string to number conversions.
See the Unix man page :manpage:`atof(2)` for details. 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: .. _reflection:
Reflection Reflection

View File

@ -421,27 +421,31 @@ Example::
__slots__ = () __slots__ = ()
_fields = ('x', 'y')
def __new__(cls, x, y): def __new__(cls, x, y):
return tuple.__new__(cls, (x, y)) return tuple.__new__(cls, (x, y))
_cast = classmethod(tuple.__new__)
def __repr__(self): def __repr__(self):
return 'Point(x=%r, y=%r)' % 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 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): def _replace(self, **kwds):
'Return a new Point object replacing specified fields with new values' '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)) x = property(itemgetter(0))
y = property(itemgetter(1)) y = property(itemgetter(1))
>>> p = Point(11, y=22) # instantiate with positional or keyword arguments >>> 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 33
>>> x, y = p # unpack like a regular tuple >>> x, y = p # unpack like a regular tuple
>>> x, y >>> x, y
@ -456,34 +460,31 @@ by the :mod:`csv` or :mod:`sqlite3` modules::
EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade') EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')
from itertools import starmap
import csv 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) print(emp.name, emp.title)
import sqlite3 import sqlite3
conn = sqlite3.connect('/companydata') conn = sqlite3.connect('/companydata')
cursor = conn.cursor() cursor = conn.cursor()
cursor.execute('SELECT name, age, title, department, paygrade FROM employees') 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 print emp.name, emp.title
When casting a single record to a named tuple, use the star-operator [#]_ to unpack In addition to the methods inherited from tuples, named tuples support
the values:: three additonal methods and a read-only attribute.
.. method:: namedtuple._cast(iterable)
Class method returning a new instance taking the positional arguments from the *iterable*.
Useful for casting existing sequences and iterables to named tuples:
::
>>> t = [11, 22] >>> t = [11, 22]
>>> Point(*t) # the star-operator unpacks any iterable object >>> Point._cast(t)
Point(x=11, y=22) Point(x=11, y=22)
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)
In addition to the methods inherited from tuples, named tuples support
two additonal methods and a read-only attribute.
.. method:: somenamedtuple._asdict() .. method:: somenamedtuple._asdict()
Return a new dict which maps field names to their corresponding values: Return a new dict which maps field names to their corresponding values:
@ -529,6 +530,12 @@ function:
>>> getattr(p, 'x') >>> getattr(p, 'x')
11 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 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 functionality. For example, the display format can be changed by overriding
the :meth:`__repr__` method: the :meth:`__repr__` method:
@ -551,5 +558,5 @@ and customizing it with :meth:`_replace`:
.. rubric:: Footnotes .. rubric:: Footnotes
.. [#] For information on the star-operator see .. [#] For information on the double-star-operator see
:ref:`tut-unpacking-arguments` and :ref:`calls`. :ref:`tut-unpacking-arguments` and :ref:`calls`.

View File

@ -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 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 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 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 (within Python's floating point precision) is returned. If no argument is
given, returns ``0.0``. given, returns ``0.0``.
@ -447,9 +448,10 @@ available. They are listed here in alphabetical order.
single: Infinity single: Infinity
When passing in a string, values for NaN and Infinity may be returned, depending 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 on the underlying C library. Float accepts the strings nan, inf and -inf for
these values to be returned depends entirely on the C library and is known to NaN and positive or negative infinity. The case and a leading + are ignored as
vary. 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`. The float type is described in :ref:`typesnumeric`.

View File

@ -285,7 +285,7 @@ numeric operations have a higher priority than comparison operations):
+---------------------+---------------------------------+-------+--------------------+ +---------------------+---------------------------------+-------+--------------------+
| ``int(x)`` | *x* converted to integer | \(3) | :func:`int` | | ``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` | | ``complex(re, im)`` | a complex number with real part | | :func:`complex` |
| | *re*, imaginary part *im*. | | | | | *re*, imaginary part *im*. | | |
@ -329,6 +329,13 @@ Notes:
as in C; see functions :func:`floor` and :func:`ceil` in the :mod:`math` module as in C; see functions :func:`floor` and :func:`ceil` in the :mod:`math` module
for well-defined conversions. 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 .. % XXXJH exceptions: overflow (when? what operations?) zerodivision

View File

@ -114,6 +114,7 @@
#include "eval.h" #include "eval.h"
#include "pystrtod.h" #include "pystrtod.h"
#include "pystrcmp.h"
/* _Py_Mangle is defined in compile.c */ /* _Py_Mangle is defined in compile.c */
PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name); PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name);

View File

@ -123,6 +123,7 @@ PyAPI_FUNC(Py_ssize_t) PyDict_Size(PyObject *mp);
PyAPI_FUNC(PyObject *) PyDict_Copy(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);
PyAPI_FUNC(int) _PyDict_Contains(PyObject *mp, PyObject *key, long hash); 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). */ /* PyDict_Update(mp, other) is equivalent to PyDict_Merge(mp, other, 1). */
PyAPI_FUNC(int) PyDict_Update(PyObject *mp, PyObject *other); PyAPI_FUNC(int) PyDict_Update(PyObject *mp, PyObject *other);

View File

@ -36,6 +36,7 @@ extern "C" {
#define INPLACE_FLOOR_DIVIDE 28 #define INPLACE_FLOOR_DIVIDE 28
#define INPLACE_TRUE_DIVIDE 29 #define INPLACE_TRUE_DIVIDE 29
#define STORE_MAP 54
#define INPLACE_ADD 55 #define INPLACE_ADD 55
#define INPLACE_SUBTRACT 56 #define INPLACE_SUBTRACT 56
#define INPLACE_MULTIPLY 57 #define INPLACE_MULTIPLY 57

View File

@ -332,6 +332,17 @@ extern "C" {
#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE) #define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE)
#endif #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) /* Py_IS_NAN(X)
* Return 1 if float or double arg is a NaN, else 0. * Return 1 if float or double arg is a NaN, else 0.
* Caution: * Caution:
@ -341,8 +352,12 @@ extern "C" {
* a platform where it doesn't work. * a platform where it doesn't work.
*/ */
#ifndef Py_IS_NAN #ifndef Py_IS_NAN
#ifdef HAVE_ISNAN
#define Py_IS_NAN(X) isnan(X)
#else
#define Py_IS_NAN(X) ((X) != (X)) #define Py_IS_NAN(X) ((X) != (X))
#endif #endif
#endif
/* Py_IS_INFINITY(X) /* Py_IS_INFINITY(X)
* Return 1 if float or double arg is an infinity, else 0. * 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. * Override in pyconfig.h if you have a better spelling on your platform.
*/ */
#ifndef Py_IS_INFINITY #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)) #define Py_IS_INFINITY(X) ((X) && (X)*0.5 == (X))
#endif #endif
#endif
/* Py_IS_FINITE(X) /* Py_IS_FINITE(X)
* Return 1 if float or double arg is neither infinite nor NAN, else 0. * 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 * macro for this particular test is useful
*/ */
#ifndef Py_IS_FINITE #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)) #define Py_IS_FINITE(X) (!Py_IS_INFINITY(X) && !Py_IS_NAN(X))
#endif #endif
#endif
/* HUGE_VAL is supposed to expand to a positive double infinity. Python /* HUGE_VAL is supposed to expand to a positive double infinity. Python
* uses Py_HUGE_VAL instead because some platforms are broken in this * uses Py_HUGE_VAL instead because some platforms are broken in this
@ -376,6 +399,15 @@ extern "C" {
#define Py_HUGE_VAL HUGE_VAL #define Py_HUGE_VAL HUGE_VAL
#endif #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) /* Py_OVERFLOWED(X)
* Return 1 iff a libm function overflowed. Set errno to 0 before calling * Return 1 iff a libm function overflowed. Set errno to 0 before calling
* a libm function, and invoke this macro after, passing the function * a libm function, and invoke this macro after, passing the function

23
Include/pystrcmp.h Normal file
View File

@ -0,0 +1,23 @@
#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 */

View File

@ -1,17 +1,15 @@
__all__ = ['deque', 'defaultdict', 'namedtuple'] __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. # For bootstrapping reasons, the collection ABCs are defined in _abcoll.py.
# They should however be considered an integral part of collections.py. # They should however be considered an integral part of collections.py.
from _abcoll import * from _abcoll import *
import _abcoll import _abcoll
__all__ += _abcoll.__all__ __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): def namedtuple(typename, field_names, verbose=False):
"""Returns a new subclass of tuple with named fields. """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.__doc__ # docstring for the new class
'Point(x, y)' 'Point(x, y)'
>>> p = Point(11, y=22) # instantiate with positional args or keywords >>> 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 33
>>> x, y = p # unpacks just like a tuple >>> x, y = p # unpack like a regular tuple
>>> x, y >>> x, y
(11, 22) (11, 22)
>>> p.x + p.y # fields also accessable by name >>> 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 # Create and fill-in the class template
argtxt = repr(field_names).replace("'", "")[1:-1] # tuple repr without parens or quotes argtxt = repr(field_names).replace("'", "")[1:-1] # tuple repr without parens or quotes
reprtxt = ', '.join('%s=%%r' % name for name in field_names) 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): template = '''class %(typename)s(tuple):
'%(typename)s(%(argtxt)s)' \n '%(typename)s(%(argtxt)s)' \n
__slots__ = () \n __slots__ = () \n
_fields = property(lambda self: %(field_names)r) \n
def __new__(cls, %(argtxt)s): def __new__(cls, %(argtxt)s):
return tuple.__new__(cls, (%(argtxt)s)) \n return tuple.__new__(cls, (%(argtxt)s)) \n
_cast = classmethod(tuple.__new__) \n
def __repr__(self): def __repr__(self):
return '%(typename)s(%(reprtxt)s)' %% self \n 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 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): def _replace(self, **kwds):
'Return a new %(typename)s object replacing specified fields with new values' '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): for i, name in enumerate(field_names):
template += ' %s = property(itemgetter(%d))\n' % (name, i) template += ' %s = property(itemgetter(%d))\n' % (name, i)
if verbose: if verbose:
print(template) print(template)
# Execute the template string in a temporary namespace # Execute the template string in a temporary namespace
namespace = dict(itemgetter=_itemgetter, zip=_izip) namespace = dict(itemgetter=_itemgetter)
try: try:
exec(template, namespace) exec(template, namespace)
except SyntaxError as e: except SyntaxError as e:
raise SyntaxError(e.message + ':\n' + template) raise SyntaxError(e.msg + ':\n' + template) from e
result = namespace[typename] result = namespace[typename]
# For pickling to work, the __module__ variable needs to be set to the frame # For pickling to work, the __module__ variable needs to be set to the frame

View File

@ -0,0 +1,21 @@
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()

View File

@ -11,6 +11,10 @@ import sys, os
# the real Tcl library will do. # the real Tcl library will do.
prefix = os.path.join(sys.prefix,"tcl") 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 this does not exist, no further search is needed
if os.path.exists(prefix): if os.path.exists(prefix):
if "TCL_LIBRARY" not in os.environ: if "TCL_LIBRARY" not in os.environ:

View File

@ -71,6 +71,7 @@ def_op('BINARY_TRUE_DIVIDE', 27)
def_op('INPLACE_FLOOR_DIVIDE', 28) def_op('INPLACE_FLOOR_DIVIDE', 28)
def_op('INPLACE_TRUE_DIVIDE', 29) def_op('INPLACE_TRUE_DIVIDE', 29)
def_op('STORE_MAP', 54)
def_op('INPLACE_ADD', 55) def_op('INPLACE_ADD', 55)
def_op('INPLACE_SUBTRACT', 56) def_op('INPLACE_SUBTRACT', 56)
def_op('INPLACE_MULTIPLY', 57) 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_TUPLE', 102) # Number of tuple items
def_op('BUILD_LIST', 103) # Number of list items def_op('BUILD_LIST', 103) # Number of list items
def_op('BUILD_SET', 104) # Number of set 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 name_op('LOAD_ATTR', 106) # Index in name list
def_op('COMPARE_OP', 107) # Comparison operator def_op('COMPARE_OP', 107) # Comparison operator
hascompare.append(107) hascompare.append(107)

View File

@ -49,6 +49,7 @@ class TestNamedTuple(unittest.TestCase):
self.assertEqual(repr(p), 'Point(x=11, y=22)') self.assertEqual(repr(p), 'Point(x=11, y=22)')
self.assert_('__dict__' not in dir(p)) # verify instance has no dict self.assert_('__dict__' not in dir(p)) # verify instance has no dict
self.assert_('__weakref__' not in dir(p)) 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._fields, ('x', 'y')) # test _fields attribute
self.assertEqual(p._replace(x=1), (1, 22)) # test _replace method self.assertEqual(p._replace(x=1), (1, 22)) # test _replace method
self.assertEqual(p._asdict(), dict(x=11, y=22)) # test _asdict 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): def test_odd_sizes(self):
Zero = namedtuple('Zero', '') Zero = namedtuple('Zero', '')
self.assertEqual(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') Dot = namedtuple('Dot', 'd')
self.assertEqual(Dot(1), (1,)) 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): class TestOneTrickPonyABCs(unittest.TestCase):

View File

@ -1,7 +1,7 @@
import unittest import unittest
from test import test_support from test import test_support
import sys, UserDict import sys, UserDict, random, string
class DictTest(unittest.TestCase): class DictTest(unittest.TestCase):
@ -11,6 +11,15 @@ class DictTest(unittest.TestCase):
self.assertEqual(dict(), {}) self.assertEqual(dict(), {})
self.assert_(dict() is not {}) 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): def test_bool(self):
self.assert_(not {}) self.assert_(not {})
self.assert_({1: 2}) self.assert_({1: 2})

View File

@ -3,6 +3,12 @@ import unittest, struct
import os import os
from test import test_support from test import test_support
def isinf(x):
return x * 0.5 == x
def isnan(x):
return x != x
class FormatFunctionsTestCase(unittest.TestCase): class FormatFunctionsTestCase(unittest.TestCase):
def setUp(self): def setUp(self):
@ -159,6 +165,70 @@ class ReprTestCase(unittest.TestCase):
self.assertEqual(v, eval(repr(v))) self.assertEqual(v, eval(repr(v)))
floats_file.close() 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(): def test_main():
test_support.run_unittest( test_support.run_unittest(
@ -166,7 +236,8 @@ def test_main():
UnknownFormatTestCase, UnknownFormatTestCase,
IEEEFormatTestCase, IEEEFormatTestCase,
FormatTestCase, FormatTestCase,
#ReprTestCase ReprTestCase,
InfNanTest,
) )
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -275,6 +275,7 @@ PYTHON_OBJS= \
Python/sysmodule.o \ Python/sysmodule.o \
Python/traceback.o \ Python/traceback.o \
Python/getopt.o \ Python/getopt.o \
Python/pystrcmp.o \
Python/pystrtod.o \ Python/pystrtod.o \
Python/formatter_unicode.o \ Python/formatter_unicode.o \
Python/$(DYNLOADFILE) \ Python/$(DYNLOADFILE) \
@ -585,6 +586,8 @@ PYTHON_HEADERS= \
Include/pymem.h \ Include/pymem.h \
Include/pyport.h \ Include/pyport.h \
Include/pystate.h \ Include/pystate.h \
Include/pystrtod.h \
Include/pystrcmp.h \
Include/pythonrun.h \ Include/pythonrun.h \
Include/rangeobject.h \ Include/rangeobject.h \
Include/setobject.h \ Include/setobject.h \

View File

@ -783,6 +783,12 @@ CharArray_set_value(CDataObject *self, PyObject *value)
char *ptr; char *ptr;
Py_ssize_t size; Py_ssize_t size;
if (value == NULL) {
PyErr_SetString(PyExc_TypeError,
"can't delete attribute");
return -1;
}
if (PyUnicode_Check(value)) { if (PyUnicode_Check(value)) {
value = PyUnicode_AsEncodedString(value, value = PyUnicode_AsEncodedString(value,
conversion_mode_encoding, conversion_mode_encoding,
@ -838,6 +844,11 @@ WCharArray_set_value(CDataObject *self, PyObject *value)
{ {
Py_ssize_t result = 0; Py_ssize_t result = 0;
if (value == NULL) {
PyErr_SetString(PyExc_TypeError,
"can't delete attribute");
return -1;
}
if (PyString_Check(value)) { if (PyString_Check(value)) {
value = PyUnicode_FromEncodedObject(value, value = PyUnicode_FromEncodedObject(value,
conversion_mode_encoding, conversion_mode_encoding,
@ -4022,6 +4033,11 @@ Simple_set_value(CDataObject *self, PyObject *value)
PyObject *result; PyObject *result;
StgDictObject *dict = PyObject_stgdict((PyObject *)self); 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); /* Cannot be NULL for CDataObject instances */
assert(dict->setfunc); assert(dict->setfunc);
result = dict->setfunc(self->b_ptr, value, dict->size); result = dict->setfunc(self->b_ptr, value, dict->size);

View File

@ -195,6 +195,11 @@ CField_set(CFieldObject *self, PyObject *inst, PyObject *value)
assert(CDataObject_Check(inst)); assert(CDataObject_Check(inst));
dst = (CDataObject *)inst; dst = (CDataObject *)inst;
ptr = dst->b_ptr + self->offset; 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, return CData_set(inst, self->proto, self->setfunc, value,
self->index, self->size, ptr); self->index, self->size, ptr);
} }

View File

@ -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 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
* char buffer. If you have any inc/def ref to do to the objects that contain * into a char buffer. If you have any inc/def ref to do to the objects that
* the buffer, do it in the caller. This function returns the number of bytes * contain the buffer, do it in the caller. This function returns the number
* succesfully read. If there was an error, it returns -1. Note that it is * of bytes succesfully read. If there was an error, it returns -1. Note
* also possible that we return a number of bytes smaller than the request * that it is also possible that we return a number of bytes smaller than the
* bytes. * request bytes.
* *
* 'addr' is a return value for the address object. Note that you must decref * 'addr' is a return value for the address object. Note that you must decref
* it yourself. * it yourself.

View File

@ -551,6 +551,23 @@ dictresize(PyDictObject *mp, Py_ssize_t minused)
return 0; 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 /* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
* that may occur (originally dicts supported only string keys, and exceptions * that may occur (originally dicts supported only string keys, and exceptions
* weren't possible). So, while the original intent was that a NULL return * weren't possible). So, while the original intent was that a NULL return

View File

@ -114,7 +114,7 @@ PyFloat_FromDouble(double fval)
PyObject * PyObject *
PyFloat_FromString(PyObject *v) PyFloat_FromString(PyObject *v)
{ {
const char *s, *last, *end; const char *s, *last, *end, *sp;
double x; double x;
char buffer[256]; /* for errors */ char buffer[256]; /* for errors */
char *s_buffer = NULL; char *s_buffer = NULL;
@ -146,6 +146,7 @@ PyFloat_FromString(PyObject *v)
PyErr_SetString(PyExc_ValueError, "empty string for float()"); PyErr_SetString(PyExc_ValueError, "empty string for float()");
goto error; goto error;
} }
sp = s;
/* We don't care about overflow or underflow. If the platform supports /* We don't care about overflow or underflow. If the platform supports
* them, infinities and signed zeroes (on underflow) are fine. * them, infinities and signed zeroes (on underflow) are fine.
* However, strtod can return 0 for denormalized numbers, where atof * 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). */ byte at the end of the string, when the input is inf(inity). */
if (end > last) if (end > last)
end = last; end = last;
/* Check for inf and nan. This is done late because it rarely happens. */
if (end == s) { 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), PyOS_snprintf(buffer, sizeof(buffer),
"invalid literal for float(): %.200s", s); "invalid literal for float(): %.200s", s);
PyErr_SetString(PyExc_ValueError, buffer); PyErr_SetString(PyExc_ValueError, buffer);
@ -250,7 +270,9 @@ format_double(char *buf, size_t buflen, double ob_fval, int precision)
{ {
register char *cp; register char *cp;
char format[32]; 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, We want float numbers to be recognizable as such,
i.e., they should contain a decimal point or an exponent. i.e., they should contain a decimal point or an exponent.
However, %g may print the number as an integer; 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++ = '.';
*cp++ = '0'; *cp++ = '0';
*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 static void

View File

@ -386,6 +386,15 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */
/* Fairly standard from here! */ /* 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. /* Define if on AIX 3.
System headers sometimes define this. System headers sometimes define this.
We just want to avoid a redefinition error message. */ We just want to avoid a redefinition error message. */

View File

@ -700,6 +700,10 @@
<File <File
RelativePath="..\Python\pystate.c"> RelativePath="..\Python\pystate.c">
</File> </File>
<File
RelativePath="..\Python\pystrcmp.c"
>
</File>
<File <File
RelativePath="..\Python\pystrtod.c"> RelativePath="..\Python\pystrtod.c">
</File> </File>

View File

@ -735,6 +735,10 @@
RelativePath="..\..\Python\pystate.c" RelativePath="..\..\Python\pystate.c"
> >
</File> </File>
<File
RelativePath="..\..\Python\pystrcmp.c"
>
</File>
<File <File
RelativePath="..\..\Python\pystrtod.c" RelativePath="..\..\Python\pystrtod.c"
> >
@ -1213,6 +1217,10 @@
RelativePath="..\..\Include\pystate.h" RelativePath="..\..\Include\pystate.h"
> >
</File> </File>
<File
RelativePath="..\..\Include\pystrcmp.h"
>
</File>
<File <File
RelativePath="..\..\Include\pystrtod.h" RelativePath="..\..\Include\pystrtod.h"
> >

View File

@ -1,514 +0,0 @@
Document Type: WSE
item: Global
Version=8.14
Flags=00000100
Split=1420
Languages=65 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Copy Default=1
Japanese Font Name=MS Gothic
Japanese Font Size=10
Start Gradient=0 0 255
End Gradient=0 0 0
Windows Flags=00000000000000000000101000001000
Message Font=MS Sans Serif
Font Size=8
Disk Label=GLBS
Disk Filename=INSTALL
Patch Flags=0000000000000001
Patch Threshold=200
Patch Memory=4096
Per-User Version ID=1
Crystal Format=10111100101100000010001001001001
Step View=&Properties
end
item: Remark
Text=Note from Tim: This is a verbatim copy of Wise's Uninstal.wse, altered at the end to write
end
item: Remark
Text=uninstall info under HKCU instead of HKLM if our DOADMIN var is false.
end
item: Remark
end
item: Remark
Text= Install Support for uninstalling the application.
end
item: Remark
end
item: Set Variable
Variable=UNINSTALL_PATH
Value=%_LOGFILE_PATH_%
Flags=00000010
end
item: Set Variable
Variable=UNINSTALL_PATH
Value=%UNINSTALL_PATH%\UNWISE.EXE
end
item: Compiler Variable If
Variable=_EXE_OS_TYPE_
Value=WIN32
end
item: Install File
Source=%_WISE_%\UNWISE32.EXE
Destination=%UNINSTALL_PATH%
Flags=0000000000000010
end
item: Compiler Variable Else
end
item: Install File
Source=%_WISE_%\UNWISE.EXE
Destination=%UNINSTALL_PATH%
Flags=0000000000000010
end
item: Compiler Variable End
end
item: Remark
end
item: Remark
Text= Install Support for multiple languages
end
item: Remark
end
item: Set Variable
Variable=UNINSTALL_LANG
Value=%UNINSTALL_PATH%
Flags=00000010
end
item: Set Variable
Variable=UNINSTALL_LANG
Value=%UNINSTALL_LANG%\UNWISE.INI
end
item: Compiler Variable If
Variable=_LANG_LIST_
Value=C
Flags=00000010
end
item: Compiler Variable If
Value=%_WISE_%\LANGUAGE\UNWISE.FRA
Flags=00000011
end
item: If/While Statement
Variable=LANG
Value=%_LANG_C_NAME_%
end
item: Install File
Source=%_WISE_%\LANGUAGE\UNWISE.FRA
Destination=%UNINSTALL_LANG%
Flags=0000000000000010
end
item: End Block
end
item: Compiler Variable End
end
item: Compiler Variable End
end
item: Compiler Variable If
Variable=_LANG_LIST_
Value=D
Flags=00000010
end
item: Compiler Variable If
Value=%_WISE_%\LANGUAGE\UNWISE.FRA
Flags=00000011
end
item: If/While Statement
Variable=LANG
Value=%_LANG_D_NAME_%
end
item: Install File
Source=%_WISE_%\LANGUAGE\UNWISE.FRA
Destination=%UNINSTALL_LANG%
Flags=0000000000000010
end
item: End Block
end
item: Compiler Variable End
end
item: Compiler Variable End
end
item: Compiler Variable If
Variable=_LANG_LIST_
Value=E
Flags=00000010
end
item: Compiler Variable If
Value=%_WISE_%\LANGUAGE\UNWISE.DEU
Flags=00000011
end
item: If/While Statement
Variable=LANG
Value=%_LANG_E_NAME_%
end
item: Install File
Source=%_WISE_%\LANGUAGE\UNWISE.DEU
Destination=%UNINSTALL_LANG%
Flags=0000000000000010
end
item: End Block
end
item: Compiler Variable End
end
item: Compiler Variable End
end
item: Compiler Variable If
Variable=_LANG_LIST_
Value=F
Flags=00000010
end
item: Compiler Variable If
Value=%_WISE_%\LANGUAGE\UNWISE.PTG
Flags=00000011
end
item: If/While Statement
Variable=LANG
Value=%_LANG_F_NAME_%
end
item: Install File
Source=%_WISE_%\LANGUAGE\UNWISE.PTG
Destination=%UNINSTALL_LANG%
Flags=0000000000000010
end
item: End Block
end
item: Compiler Variable End
end
item: Compiler Variable End
end
item: Compiler Variable If
Variable=_LANG_LIST_
Value=G
Flags=00000010
end
item: Compiler Variable If
Value=%_WISE_%\LANGUAGE\UNWISE.ESP
Flags=00000011
end
item: If/While Statement
Variable=LANG
Value=%_LANG_G_NAME_%
end
item: Install File
Source=%_WISE_%\LANGUAGE\UNWISE.ESP
Destination=%UNINSTALL_LANG%
Flags=0000000000000010
end
item: End Block
end
item: Compiler Variable End
end
item: Compiler Variable End
end
item: Compiler Variable If
Variable=_LANG_LIST_
Value=H
Flags=00000010
end
item: Compiler Variable If
Value=%_WISE_%\LANGUAGE\UNWISE.ESP
Flags=00000011
end
item: If/While Statement
Variable=LANG
Value=%_LANG_H_NAME_%
end
item: Install File
Source=%_WISE_%\LANGUAGE\UNWISE.ESP
Destination=%UNINSTALL_LANG%
Flags=0000000000000010
end
item: End Block
end
item: Compiler Variable End
end
item: Compiler Variable End
end
item: Compiler Variable If
Variable=_LANG_LIST_
Value=I
Flags=00000010
end
item: Compiler Variable If
Value=%_WISE_%\LANGUAGE\UNWISE.ITA
Flags=00000011
end
item: If/While Statement
Variable=LANG
Value=%_LANG_I_NAME_%
end
item: Install File
Source=%_WISE_%\LANGUAGE\UNWISE.ITA
Destination=%UNINSTALL_LANG%
Flags=0000000000000010
end
item: End Block
end
item: Compiler Variable End
end
item: Compiler Variable End
end
item: Compiler Variable If
Variable=_LANG_LIST_
Value=J
Flags=00000010
end
item: Compiler Variable If
Value=%_WISE_%\LANGUAGE\UNWISE.DAN
Flags=00000011
end
item: If/While Statement
Variable=LANG
Value=%_LANG_J_NAME_%
end
item: Install File
Source=%_WISE_%\LANGUAGE\UNWISE.DAN
Destination=%UNINSTALL_LANG%
Flags=0000000000000010
end
item: End Block
end
item: Compiler Variable End
end
item: Compiler Variable End
end
item: Compiler Variable If
Variable=_LANG_LIST_
Value=K
Flags=00000010
end
item: Compiler Variable If
Value=%_WISE_%\LANGUAGE\UNWISE.FIN
Flags=00000011
end
item: If/While Statement
Variable=LANG
Value=%_LANG_K_NAME_%
end
item: Install File
Source=%_WISE_%\LANGUAGE\UNWISE.FIN
Destination=%UNINSTALL_LANG%
Flags=0000000000000010
end
item: End Block
end
item: Compiler Variable End
end
item: Compiler Variable End
end
item: Compiler Variable If
Variable=_LANG_LIST_
Value=L
Flags=00000010
end
item: Compiler Variable If
Value=%_WISE_%\LANGUAGE\UNWISE.ISL
Flags=00000011
end
item: If/While Statement
Variable=LANG
Value=%_LANG_L_NAME_%
end
item: Install File
Source=%_WISE_%\LANGUAGE\UNWISE.ISL
Destination=%UNINSTALL_LANG%
Flags=0000000000000010
end
item: End Block
end
item: Compiler Variable End
end
item: Compiler Variable End
end
item: Compiler Variable If
Variable=_LANG_LIST_
Value=M
Flags=00000010
end
item: Compiler Variable If
Value=%_WISE_%\LANGUAGE\UNWISE.NLD
Flags=00000011
end
item: If/While Statement
Variable=LANG
Value=%_LANG_M_NAME_%
end
item: Install File
Source=%_WISE_%\LANGUAGE\UNWISE.NLD
Destination=%UNINSTALL_LANG%
Flags=0000000000000010
end
item: End Block
end
item: Compiler Variable End
end
item: Compiler Variable End
end
item: Compiler Variable If
Variable=_LANG_LIST_
Value=N
Flags=00000010
end
item: Compiler Variable If
Value=%_WISE_%\LANGUAGE\UNWISE.NOR
Flags=00000011
end
item: If/While Statement
Variable=LANG
Value=%_LANG_N_NAME_%
end
item: Install File
Source=%_WISE_%\LANGUAGE\UNWISE.NOR
Destination=%UNINSTALL_LANG%
Flags=0000000000000010
end
item: End Block
end
item: Compiler Variable End
end
item: Compiler Variable End
end
item: Compiler Variable If
Variable=_LANG_LIST_
Value=O
Flags=00000010
end
item: Compiler Variable If
Value=%_WISE_%\LANGUAGE\UNWISE.SVE
Flags=00000011
end
item: If/While Statement
Variable=LANG
Value=%_LANG_O_NAME_%
end
item: Install File
Source=%_WISE_%\LANGUAGE\UNWISE.SVE
Destination=%UNINSTALL_LANG%
Flags=0000000000000010
end
item: End Block
end
item: Compiler Variable End
end
item: Compiler Variable End
end
item: Compiler Variable If
Variable=_LANG_LIST_
Value=P
Flags=00000010
end
item: Compiler Variable If
Value=%_WISE_%\LANGUAGE\UNWISE.JPN
Flags=00000011
end
item: If/While Statement
Variable=LANG
Value=%_LANG_P_NAME_%
end
item: Install File
Source=%_WISE_%\LANGUAGE\UNWISE.JPN
Destination=%UNINSTALL_LANG%
Flags=0000000000000010
end
item: End Block
end
item: Compiler Variable End
end
item: Compiler Variable End
end
item: Remark
end
item: Remark
Text= Install the add/remove or uninstall icon
end
item: Remark
end
item: Set Variable
Variable=UNINSTALL_PATH
Value=%UNINSTALL_PATH%
Flags=00010100
end
item: Set Variable
Variable=INST_LOG_PATH
Value=%_LOGFILE_PATH_%
Flags=00010100
end
item: Check Configuration
Flags=10111011
end
item: If/While Statement
Variable=DOADMIN
Value=1
end
item: Remark
Text=Write uninstall info under HKLM. This if/else/end block added by Tim.
end
item: Edit Registry
Total Keys=1
Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
New Value=%APPTITLE%
Value Name=DisplayName
Root=2
end
item: Edit Registry
Total Keys=1
Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
New Value=%UNINSTALL_PATH% %INST_LOG_PATH%
New Value=
Value Name=UninstallString
Root=2
end
item: Else Statement
end
item: Remark
Text=The same, but write under HKCU instead.
end
item: Edit Registry
Total Keys=1
Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
New Value=%APPTITLE%
Value Name=DisplayName
Root=1
end
item: Edit Registry
Total Keys=1
Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
New Value=%UNINSTALL_PATH% %INST_LOG_PATH%
New Value=
Value Name=UninstallString
Root=1
end
item: End Block
end
item: Else Statement
end
item: Add ProgMan Icon
Group=%GROUP%
Icon Name=Uninstall %APPTITLE%
Command Line=%UNINSTALL_PATH% %INST_LOG_PATH%
end
item: End Block
end
item: Check Configuration
Flags=11110010
end
item: If/While Statement
Variable=DOBRAND
Value=1
end
item: Edit Registry
Total Keys=2
item: Key
Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
New Value=%COMPANY%
Value Name=RegCompany
Root=2
end
item: Key
Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
New Value=%NAME%
Value Name=RegOwner
Root=2
end
end
item: End Block
end
item: End Block
end

View File

@ -1,61 +0,0 @@
// 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

View File

@ -56,7 +56,7 @@
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="$(tcltkDir)\lib\tcl84.lib $(tcltkDir)\lib\tk84.lib $(tcltkDir)\lib\tix8.4\tix84.lib" AdditionalDependencies="$(tcltkLib)"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
@ -118,7 +118,7 @@
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="$(tcltk64Dir)\lib\tcl84.lib $(tcltk64Dir)\lib\tk84.lib $(tcltk64Dir)\lib\tix8.4\tix84.lib" AdditionalDependencies="$(tcltk64Lib)"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
@ -180,7 +180,7 @@
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="$(tcltkDir)\lib\tcl84.lib $(tcltkDir)\lib\tk84.lib $(tcltkDir)\lib\tix8.4\tix84.lib" AdditionalDependencies="$(tcltkLib)"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
@ -243,7 +243,7 @@
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="$(tcltk64Dir)\lib\tcl84.lib $(tcltk64Dir)\lib\tk84.lib $(tcltk64Dir)\lib\tix8.4\tix84.lib" AdditionalDependencies="$(tcltk64Lib)"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
@ -305,7 +305,7 @@
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="$(tcltkDir)\lib\tcl84.lib $(tcltkDir)\lib\tk84.lib $(tcltkDir)\lib\tix8.4\tix84.lib" AdditionalDependencies="$(tcltkLib)"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
@ -368,7 +368,7 @@
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="$(tcltk64Dir)\lib\tcl84.lib $(tcltk64Dir)\lib\tk84.lib $(tcltk64Dir)\lib\tix8.4\tix84.lib" AdditionalDependencies="$(tcltk64Lib)"
TargetMachine="17" TargetMachine="17"
/> />
<Tool <Tool
@ -431,7 +431,7 @@
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="$(tcltkDir)\lib\tcl84.lib $(tcltkDir)\lib\tk84.lib $(tcltkDir)\lib\tix8.4\tix84.lib" AdditionalDependencies="$(tcltkLib)"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
@ -494,7 +494,7 @@
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="$(tcltk64Dir)\lib\tcl84.lib $(tcltk64Dir)\lib\tk84.lib $(tcltk64Dir)\lib\tix8.4\tix84.lib" AdditionalDependencies="$(tcltk64Lib)"
TargetMachine="17" TargetMachine="17"
/> />
<Tool <Tool

View File

@ -12,14 +12,24 @@ import shutil
here = os.path.abspath(os.path.dirname(__file__)) here = os.path.abspath(os.path.dirname(__file__))
par = os.path.pardir par = os.path.pardir
TCL = "tcl8.4.16" if 1:
TK = "tk8.4.16" TCL = "tcl8.4.16"
TIX = "tix-8.4.0" TK = "tk8.4.16"
#TIX = "Tix8.4.2" TIX = "tix-8.4.0"
ROOT = os.path.abspath(os.path.join(here, par, par)) else:
NMAKE = "nmake /nologo " 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: if os.system(cmd) != 0:
raise RuntimeError(cmd) raise RuntimeError(cmd)
@ -35,31 +45,29 @@ def build(platform, clean):
# TCL # TCL
tcldir = os.path.join(ROOT, TCL) tcldir = os.path.join(ROOT, TCL)
if True: if 1:
os.chdir(os.path.join(tcldir, "win")) os.chdir(os.path.join(tcldir, "win"))
if clean: if clean:
system(NMAKE + "/f makefile.vc clean") nmake("makefile.vc", "clean")
system(NMAKE + "/f makefile.vc") nmake("makefile.vc")
system(NMAKE + "/f makefile.vc INSTALLDIR=%s install" % dest) nmake("makefile.vc", "install", INSTALLDIR=dest)
# TK # TK
if True: if 1:
os.chdir(os.path.join(ROOT, TK, "win")) os.chdir(os.path.join(ROOT, TK, "win"))
if clean: if clean:
system(NMAKE + "/f makefile.vc clean") nmake("makefile.vc", "clean", TCLDIR=tcldir)
system(NMAKE + "/f makefile.vc TCLDIR=%s" % tcldir) nmake("makefile.vc", TCLDIR=tcldir)
system(NMAKE + "/f makefile.vc TCLDIR=%s INSTALLDIR=%s install" % nmake("makefile.vc", "install", TCLDIR=tcldir, INSTALLDIR=dest)
(tcldir, dest))
# TIX # TIX
if True: if 1:
# python9.mak is available at http://svn.python.org # python9.mak is available at http://svn.python.org
os.chdir(os.path.join(ROOT, TIX, "win")) os.chdir(os.path.join(ROOT, TIX, "win"))
if clean: if clean:
system(NMAKE + "/f python9.mak clean") nmake("python9.mak", "clean")
system(NMAKE + "/f python9.mak MACHINE=%s" % machine) nmake("python9.mak", MACHINE=machine)
system(NMAKE + "/f python9.mak install") nmake("python9.mak", "install")
def main(): def main():
if len(sys.argv) < 2 or sys.argv[1] not in ("Win32", "x64"): if len(sys.argv) < 2 or sys.argv[1] not in ("Win32", "x64"):

15
PCbuild9/idle.bat Normal file
View File

@ -0,0 +1,15 @@
@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%

View File

@ -68,4 +68,12 @@
Name="tcltk64Dir" Name="tcltk64Dir"
Value="..\..\tcltk64" 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> </VisualStudioPropertySheet>

View File

@ -1,17 +0,0 @@
<?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>

View File

@ -1,337 +0,0 @@
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
; This is the whole ball of wax for an Inno installer for Python.
; To use, download Inno Setup from http://www.jrsoftware.org/isdl.htm/,
; install it, and double-click on this file. That launches the Inno
; script compiler. The GUI is extemely simple, and has only one button
; you may not recognize instantly: click it. You're done. It builds
; the installer into PCBuild/Python-2.2a1.exe. Size and speed of the
; installer are competitive with the Wise installer; Inno uninstall
; seems much quicker than Wise (but also feebler, and the uninstall
; log is in some un(human)readable binary format).
;
; What's Done
; -----------
; All the usual Windows Python files are installed by this now.
; All the usual Windows Python Start menu entries are created and
; work fine.
; .py, .pyw, .pyc and .pyo extensions are registered.
; PROBLEM: Inno uninstall does not restore their previous registry
; associations (if any). Wise did. This will make life
; difficult for alpha (etc) testers.
; The Python install is fully functional for "typical" uses.
;
; What's Not Done
; ---------------
; None of "Mark Hammond's" registry entries are written.
; No installation of files is done into the system dir:
; The MS DLLs aren't handled at all by this yet.
; Python22.dll is unpacked into the main Python dir.
;
; Inno can't do different things on NT/2000 depending on whether the user
; has Admin privileges, so I don't know how to "solve" either of those,
; short of building two installers (one *requiring* Admin privs, the
; other not doing anything that needs Admin privs).
;
; Inno has no concept of variables, so lots of lines in this file need
; to be fiddled by hand across releases. Simplest way out: stick this
; file in a giant triple-quoted r-string (note that backslashes are
; required all over the place here -- forward slashes DON'T WORK in
; Inno), and use %(yadda)s string interpolation to do substitutions; i.e.,
; write a very simple Python program to *produce* this script.
[Setup]
AppName=Python and combined Win32 Extensions
AppVerName=Python 2.2.2 and combined Win32 Extensions 150
AppId=Python 2.2.2.150
AppVersion=2.2.2.150
AppCopyright=Python is Copyright © 2001 Python Software Foundation. Win32 Extensions are Copyright © 1996-2001 Greg Stein and Mark Hammond.
; Default install dir; value of {app} later (unless user overrides).
; {sd} = system root drive, probably "C:".
DefaultDirName={sd}\Python22
;DefaultDirName={pf}\Python
; Start menu folder name; value of {group} later (unless user overrides).
DefaultGroupName=Python 2.2
; Point SourceDir to one above PCBuild = src.
; means this script can run unchanged from anyone's CVS tree, no matter
; what they called the top-level directories.
SourceDir=.
OutputDir=..
OutputBaseFilename=Python-2.2.2-Win32-150-Setup
AppPublisher=PythonLabs at Digital Creations
AppPublisherURL=http://www.python.org
AppSupportURL=http://www.python.org
AppUpdatesURL=http://www.python.org
AlwaysCreateUninstallIcon=true
ChangesAssociations=true
UninstallLogMode=new
AllowNoIcons=true
AdminPrivilegesRequired=true
UninstallDisplayIcon={app}\pyc.ico
WizardDebug=false
; The fewer screens the better; leave these commented.
Compression=bzip
InfoBeforeFile=LICENSE.txt
;InfoBeforeFile=Misc\NEWS
; uncomment the following line if you want your installation to run on NT 3.51 too.
; MinVersion=4,3.51
[Types]
Name: normal; Description: Select desired components; Flags: iscustom
[Components]
Name: main; Description: Python and Win32 Extensions; Types: normal
Name: docs; Description: Python documentation (HTML); Types: normal
Name: tk; Description: TCL/TK, tkinter, and Idle; Types: normal
Name: tools; Description: Python utility scripts (Tools\); Types: normal
Name: test; Description: Python test suite (Lib\test\); Types: normal
[Tasks]
Name: extensions; Description: Register file associations (.py, .pyw, .pyc, .pyo); Components: main; Check: IsAdminLoggedOn
[Files]
; Caution: Using forward slashes instead screws up in amazing ways.
; Unknown: By the time Components (and other attrs) are added to these lines, they're
; going to get awfully long. But don't see a way to continue logical lines across
; physical lines.
Source: LICENSE.txt; DestDir: {app}; CopyMode: alwaysoverwrite
Source: README.txt; DestDir: {app}; CopyMode: alwaysoverwrite
Source: News.txt; DestDir: {app}; CopyMode: alwaysoverwrite
Source: *.ico; DestDir: {app}; CopyMode: alwaysoverwrite; Components: main
Source: python.exe; DestDir: {app}; CopyMode: alwaysoverwrite; Components: main
Source: pythonw.exe; DestDir: {app}; CopyMode: alwaysoverwrite; Components: main
Source: w9xpopen.exe; DestDir: {app}; CopyMode: alwaysoverwrite; Components: main
Source: DLLs\tcl83.dll; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: tk
Source: DLLs\tk83.dll; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: tk
Source: tcl\*.*; DestDir: {app}\tcl; CopyMode: alwaysoverwrite; Components: tk; Flags: recursesubdirs
Source: sysdir\python22.dll; DestDir: {sys}; CopyMode: alwaysskipifsameorolder; Components: main; Flags: sharedfile restartreplace
Source: sysdir\PyWinTypes22.dll; DestDir: {sys}; CopyMode: alwaysskipifsameorolder; Components: main; Flags: restartreplace sharedfile
Source: sysdir\pythoncom22.dll; DestDir: {sys}; CopyMode: alwaysskipifsameorolder; Components: main; Flags: restartreplace sharedfile
Source: DLLs\_socket.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
Source: libs\_socket.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
Source: DLLs\_sre.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
Source: libs\_sre.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
Source: DLLs\_symtable.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
Source: libs\_symtable.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
Source: DLLs\_testcapi.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
Source: libs\_testcapi.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
Source: DLLs\_tkinter.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: tk
Source: libs\_tkinter.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: tk
Source: DLLs\bsddb.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
Source: libs\bsddb.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
Source: DLLs\mmap.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
Source: libs\mmap.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
Source: DLLs\parser.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
Source: libs\parser.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
Source: DLLs\pyexpat.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
Source: libs\pyexpat.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
Source: DLLs\select.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
Source: libs\select.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
Source: DLLs\unicodedata.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
Source: libs\unicodedata.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
Source: DLLs\_winreg.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
Source: libs\_winreg.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
Source: DLLs\winsound.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
Source: libs\winsound.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
Source: DLLs\zlib.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
Source: libs\zlib.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
Source: libs\python22.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
Source: DLLs\expat.dll; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
Source: Lib\*.py; DestDir: {app}\Lib; CopyMode: alwaysoverwrite; Components: main
Source: Lib\distutils\*.*; DestDir: {app}\Lib\distutils; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
Source: Lib\email\*.*; DestDir: {app}\Lib\email; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
Source: Lib\encodings\*.*; DestDir: {app}\Lib\encodings; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
Source: Lib\lib-old\*.*; DestDir: {app}\Lib\lib-old; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
Source: Lib\xml\*.*; DestDir: {app}\Lib\xml; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
Source: Lib\test\*.*; DestDir: {app}\Lib\test; CopyMode: alwaysoverwrite; Components: test; Flags: recursesubdirs
Source: Lib\site-packages\README.txt; DestDir: {app}\Lib\site-packages; CopyMode: alwaysoverwrite; Components: main
Source: Lib\site-packages\PyWin32.chm; DestDir: {app}\Lib\site-packages; CopyMode: alwaysoverwrite; Components: docs
Source: Lib\site-packages\win32\*.*; DestDir: {app}\Lib\site-packages\win32; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
Source: Lib\site-packages\win32com\*.*; DestDir: {app}\Lib\site-packages\win32com; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
Source: Lib\site-packages\win32comext\*.*; DestDir: {app}\Lib\site-packages\win32comext; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
Source: Lib\lib-tk\*.py; DestDir: {app}\Lib\lib-tk; CopyMode: alwaysoverwrite; Components: tk; Flags: recursesubdirs
Source: include\*.h; DestDir: {app}\include; CopyMode: alwaysoverwrite; Components: main
Source: Tools\idle\*.*; DestDir: {app}\Tools\idle; CopyMode: alwaysoverwrite; Components: tk; Flags: recursesubdirs
Source: Tools\pynche\*.*; DestDir: {app}\Tools\pynche; CopyMode: alwaysoverwrite; Components: tools; Flags: recursesubdirs
Source: Tools\scripts\*.*; DestDir: {app}\Tools\Scripts; CopyMode: alwaysoverwrite; Components: tools; Flags: recursesubdirs
Source: Tools\webchecker\*.*; DestDir: {app}\Tools\webchecker; CopyMode: alwaysoverwrite; Components: tools; Flags: recursesubdirs
Source: Tools\versioncheck\*.*; DestDir: {app}\Tools\versioncheck; CopyMode: alwaysoverwrite; Components: tools; Flags: recursesubdirs
Source: Doc\*.*; DestDir: {app}\Doc; CopyMode: alwaysoverwrite; Flags: recursesubdirs; Components: docs
[Icons]
Name: {group}\Python (command line); Filename: {app}\python.exe; WorkingDir: {app}; Components: main
Name: {group}\Python Manuals; Filename: {app}\Doc\index.html; WorkingDir: {app}; Components: docs
Name: {group}\Win32 Extensions Help; Filename: {app}\Lib\site-packages\PyWin32.chm; WorkingDir: {app}\Lib\site-packages; Components: docs
Name: {group}\Module Docs; Filename: {app}\pythonw.exe; WorkingDir: {app}; Parameters: """{app}\Tools\Scripts\pydoc.pyw"""; Components: tools
Name: {group}\IDLE (Python GUI); Filename: {app}\pythonw.exe; WorkingDir: {app}; Parameters: """{app}\Tools\idle\idle.pyw"""; Components: tools
[Registry]
; Register .py
Tasks: extensions; Root: HKCR; Subkey: .py; ValueType: string; ValueName: ; ValueData: Python File; Flags: uninsdeletevalue
Tasks: extensions; Root: HKCR; Subkey: .py; ValueType: string; ValueName: Content Type; ValueData: text/plain; Flags: uninsdeletevalue
Tasks: extensions; Root: HKCR; Subkey: Python File; ValueType: string; ValueName: ; ValueData: Python File; Flags: uninsdeletekey
Tasks: extensions; Root: HKCR; Subkey: Python File\DefaultIcon; ValueType: string; ValueName: ; ValueData: {app}\Py.ico
Tasks: extensions; Root: HKCR; Subkey: Python File\shell\open\command; ValueType: string; ValueName: ; ValueData: """{app}\python.exe"" ""%1"" %*"
; Register .pyc
Tasks: extensions; Root: HKCR; Subkey: .pyc; ValueType: string; ValueName: ; ValueData: Python CompiledFile; Flags: uninsdeletevalue
Tasks: extensions; Root: HKCR; Subkey: Python CompiledFile; ValueType: string; ValueName: ; ValueData: Compiled Python File; Flags: uninsdeletekey
Tasks: extensions; Root: HKCR; Subkey: Python CompiledFile\DefaultIcon; ValueType: string; ValueName: ; ValueData: {app}\pyc.ico
Tasks: extensions; Root: HKCR; Subkey: Python CompiledFile\shell\open\command; ValueType: string; ValueName: ; ValueData: """{app}\python.exe"" ""%1"" %*"
; Register .pyo
Tasks: extensions; Root: HKCR; Subkey: .pyo; ValueType: string; ValueName: ; ValueData: Python CompiledFile; Flags: uninsdeletevalue
; Register .pyw
Tasks: extensions; Root: HKCR; Subkey: .pyw; ValueType: string; ValueName: ; ValueData: Python NoConFile; Flags: uninsdeletevalue
Tasks: extensions; Root: HKCR; Subkey: .pyw; ValueType: string; ValueName: Content Type; ValueData: text/plain; Flags: uninsdeletevalue
Tasks: extensions; Root: HKCR; Subkey: Python NoConFile; ValueType: string; ValueName: ; ValueData: Python File (no console); Flags: uninsdeletekey
Tasks: extensions; Root: HKCR; Subkey: Python NoConFile\DefaultIcon; ValueType: string; ValueName: ; ValueData: {app}\Py.ico
Tasks: extensions; Root: HKCR; Subkey: Python NoConFile\shell\open\command; ValueType: string; ValueName: ; ValueData: """{app}\pythonw.exe"" ""%1"" %*"
; Python Registry Keys
Root: HKLM; Subkey: SOFTWARE\Python; Flags: uninsdeletekeyifempty; Check: IsAdminLoggedOn
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore; Flags: uninsdeletekeyifempty
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2; Flags: uninsdeletekeyifempty
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\PythonPath; ValueData: "{app}\Lib;{app}\DLLs"; Flags: uninsdeletekeyifempty
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\PythonPath\tk; ValueData: {app}\Lib\lib-tk; Flags: uninsdeletekey; Components: tk
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\PythonPath\win32; ValueData: "{app}\lib\site-packages\win32;{app}\lib\site-packages\win32\lib"; Flags: uninsdeletekey
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\PythonPath\win32com; ValueData: C:\Python\lib\site-packages; Flags: uninsdeletekey
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\Modules; Flags: uninsdeletekeyifempty
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\Modules\pythoncom; ValueData: {sys}\pythoncom22.dll; Flags: uninsdeletekey
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\Modules\pywintypes; ValueData: {sys}\PyWinTypes22.dll; Flags: uninsdeletekey
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\InstallPath; ValueData: {app}; Flags: uninsdeletekeyifempty; ValueType: string
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\InstallPath\InstallGroup; ValueData: {group}; Flags: uninsdeletekey
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\Help; Flags: uninsdeletekeyifempty
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\Help\Main Python Documentation; ValueType: string; ValueData: {app}\Doc\index.html; Flags: uninsdeletekey; Components: docs
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\Help\Python Win32 Documentation; ValueType: string; ValueData: {app}\lib\site-packages\PyWin32.chm; Flags: uninsdeletekey; Components: docs
[_ISTool]
EnableISX=true
[Code]
Program Setup;
Function IsAdminNotLoggedOn(): Boolean;
begin
Result := Not IsAdminLoggedOn();
end;
begin
end.
[UninstallDelete]
Name: {app}\Lib\distutils\command\*.pyc; Type: files
Name: {app}\Lib\distutils\command\*.pyo; Type: files
Name: {app}\Lib\distutils\command; Type: dirifempty
Name: {app}\Lib\distutils\*.pyc; Type: files
Name: {app}\Lib\distutils\*.pyo; Type: files
Name: {app}\Lib\distutils; Type: dirifempty
Name: {app}\Lib\email\test\*.pyc; Type: files
Name: {app}\Lib\email\test\*.pyo; Type: files
Name: {app}\Lib\email\test; Type: dirifempty
Name: {app}\Lib\email\*.pyc; Type: files
Name: {app}\Lib\email\*.pyo; Type: files
Name: {app}\Lib\email; Type: dirifempty
Name: {app}\Lib\encodings\*.pyc; Type: files
Name: {app}\Lib\encodings\*.pyo; Type: files
Name: {app}\Lib\encodings; Type: dirifempty
Name: {app}\Lib\lib-old\*.pyc; Type: files
Name: {app}\Lib\lib-old\*.pyo; Type: files
Name: {app}\Lib\lib-old; Type: dirifempty
Name: {app}\Lib\lib-tk\*.pyc; Type: files
Name: {app}\Lib\lib-tk\*.pyo; Type: files
Name: {app}\Lib\lib-tk; Type: dirifempty
Name: {app}\Lib\test\*.pyc; Type: files
Name: {app}\Lib\test\*.pyo; Type: files
Name: {app}\Lib\test; Type: dirifempty
Name: {app}\Lib\xml\dom\*.pyc; Type: files
Name: {app}\Lib\xml\dom\*.pyo; Type: files
Name: {app}\Lib\xml\dom; Type: dirifempty
Name: {app}\Lib\xml\parsers\*.pyc; Type: files
Name: {app}\Lib\xml\parsers\*.pyo; Type: files
Name: {app}\Lib\xml\parsers; Type: dirifempty
Name: {app}\Lib\xml\sax\*.pyc; Type: files
Name: {app}\Lib\xml\sax\*.pyo; Type: files
Name: {app}\Lib\xml\sax; Type: dirifempty
Name: {app}\Lib\xml\*.pyc; Type: files
Name: {app}\Lib\xml\*.pyo; Type: files
Name: {app}\Lib\xml; Type: dirifempty
Name: {app}\Lib\site-packages\win32; Type: filesandordirs
Name: {app}\Lib\site-packages\win32com; Type: filesandordirs
Name: {app}\Lib\site-packages\win32comext; Type: filesandordirs
Name: {app}\Lib\site-packages\pythoncom.py*; Type: files
Name: {app}\Lib\site-packages; Type: dirifempty
Name: {app}\Lib\*.pyc; Type: files
Name: {app}\Lib; Type: dirifempty
Name: {app}\Tools\pynche\*.pyc; Type: files
Name: {app}\Tools\pynche\*.pyo; Type: files
Name: {app}\Tools\pynche; Type: dirifempty
Name: {app}\Tools\idle\*.pyc; Type: files
Name: {app}\Tools\idle\*.pyo; Type: files
Name: {app}\Tools\idle; Type: dirifempty
Name: {app}\Tools\scripts\*.pyc; Type: files
Name: {app}\Tools\scripts\*.pyo; Type: files
Name: {app}\Tools\scripts; Type: dirifempty
Name: {app}\Tools\versioncheck\*.pyc; Type: files
Name: {app}\Tools\versioncheck\*.pyo; Type: files
Name: {app}\Tools\versioncheck; Type: dirifempty
Name: {app}\Tools\webchecker\*.pyc; Type: files
Name: {app}\Tools\webchecker\*.pyo; Type: files
Name: {app}\Tools\webchecker; Type: dirifempty
Name: {app}\Tools; Type: dirifempty

File diff suppressed because it is too large Load Diff

View File

@ -878,6 +878,10 @@
RelativePath="..\Include\pystate.h" RelativePath="..\Include\pystate.h"
> >
</File> </File>
<File
RelativePath="..\Include\pystrcmp.h"
>
</File>
<File <File
RelativePath="..\Include\pystrtod.h" RelativePath="..\Include\pystrtod.h"
> >
@ -1714,6 +1718,10 @@
RelativePath="..\Python\pystate.c" RelativePath="..\Python\pystate.c"
> >
</File> </File>
<File
RelativePath="..\Python\pystrcmp.c"
>
</File>
<File <File
RelativePath="..\Python\pystrtod.c" RelativePath="..\Python\pystrtod.c"
> >

View File

@ -1787,11 +1787,23 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
break; break;
case BUILD_MAP: case BUILD_MAP:
x = PyDict_New(); x = _PyDict_NewPresized((Py_ssize_t)oparg);
PUSH(x); PUSH(x);
if (x != NULL) continue; if (x != NULL) continue;
break; 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: case LOAD_ATTR:
w = GETITEM(names, oparg); w = GETITEM(names, oparg);
v = TOP(); v = TOP();

View File

@ -714,6 +714,8 @@ opcode_stack_effect(int opcode, int oparg)
return -1; return -1;
case STORE_SUBSCR: case STORE_SUBSCR:
return -3; return -3;
case STORE_MAP:
return -2;
case DELETE_SUBSCR: case DELETE_SUBSCR:
return -2; return -2;
@ -3169,19 +3171,14 @@ compiler_visit_expr(struct compiler *c, expr_ty e)
case IfExp_kind: case IfExp_kind:
return compiler_ifexp(c, e); return compiler_ifexp(c, e);
case Dict_kind: case Dict_kind:
/* XXX get rid of arg? */
ADDOP_I(c, BUILD_MAP, 0);
n = asdl_seq_LEN(e->v.Dict.values); n = asdl_seq_LEN(e->v.Dict.values);
/* We must arrange things just right for STORE_SUBSCR. ADDOP_I(c, BUILD_MAP, (n>255 ? 255 : n));
It wants the stack to look like (value) (dict) (key) */
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
ADDOP(c, DUP_TOP);
VISIT(c, expr, VISIT(c, expr,
(expr_ty)asdl_seq_GET(e->v.Dict.values, i)); (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
ADDOP(c, ROT_TWO);
VISIT(c, expr, VISIT(c, expr,
(expr_ty)asdl_seq_GET(e->v.Dict.keys, i)); (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
ADDOP(c, STORE_SUBSCR); ADDOP(c, STORE_MAP);
} }
break; break;
case Set_kind: case Set_kind:

View File

@ -66,7 +66,7 @@ extern time_t PyOS_GetLastModificationTime(char *, FILE *);
Python 2.5c1: 62121 (fix wrong lnotab with for loops and Python 2.5c1: 62121 (fix wrong lnotab with for loops and
storing constants that should have been removed) storing constants that should have been removed)
Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp) 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 Python 3000: 3000
3010 (removed UNARY_CONVERT) 3010 (removed UNARY_CONVERT)
3020 (added BUILD_SET) 3020 (added BUILD_SET)
@ -77,9 +77,10 @@ extern time_t PyOS_GetLastModificationTime(char *, FILE *);
3070 (PEP 3109 raise changes) 3070 (PEP 3109 raise changes)
3080 (PEP 3137 make __file__ and __name__ unicode) 3080 (PEP 3137 make __file__ and __name__ unicode)
3090 (kill str8 interning) 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 /* Magic word as global; note that _PyImport_Init() can change the
value of this global to accommodate for alterations of how the value of this global to accommodate for alterations of how the

25
Python/pystrcmp.c Normal file
View File

@ -0,0 +1,25 @@
/* 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));
}

104
configure vendored
View File

@ -1,5 +1,5 @@
#! /bin/sh #! /bin/sh
# From configure.in Revision: 59484 . # From configure.in Revision: 59533 .
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.61 for python 3.0. # Generated by GNU Autoconf 2.61 for python 3.0.
# #
@ -20581,6 +20581,9 @@ echo "${ECHO_T}default LIBC=\"$LIBC\"" >&6; }
fi fi
# ************************************
# * Check for mathematical functions *
# ************************************
# check for hypot() in math library # check for hypot() in math library
LIBS_SAVE=$LIBS LIBS_SAVE=$LIBS
LIBS="$LIBS $LIBM" LIBS="$LIBS $LIBM"
@ -20686,6 +20689,105 @@ fi
done 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 LIBS=$LIBS_SAVE
# check for wchar.h # check for wchar.h

View File

@ -2944,10 +2944,16 @@ else AC_MSG_ERROR([proper usage is --with-libc=STRING])
fi], fi],
[AC_MSG_RESULT(default LIBC="$LIBC")]) [AC_MSG_RESULT(default LIBC="$LIBC")])
# ************************************
# * Check for mathematical functions *
# ************************************
# check for hypot() in math library # check for hypot() in math library
LIBS_SAVE=$LIBS LIBS_SAVE=$LIBS
LIBS="$LIBS $LIBM" LIBS="$LIBS $LIBM"
AC_REPLACE_FUNCS(hypot) AC_REPLACE_FUNCS(hypot)
AC_CHECK_FUNCS(copysign isfinite isnan isinf)
LIBS=$LIBS_SAVE LIBS=$LIBS_SAVE
# check for wchar.h # check for wchar.h

View File

@ -82,6 +82,9 @@
/* Define to 1 if you have the <conio.h> header file. */ /* Define to 1 if you have the <conio.h> header file. */
#undef HAVE_CONIO_H #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. */ /* Define to 1 if you have the `ctermid' function. */
#undef HAVE_CTERMID #undef HAVE_CTERMID
@ -285,6 +288,15 @@
/* Define to 1 if you have the <io.h> header file. */ /* Define to 1 if you have the <io.h> header file. */
#undef HAVE_IO_H #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. */ /* Define to 1 if you have the `kill' function. */
#undef HAVE_KILL #undef HAVE_KILL
@ -1034,3 +1046,4 @@
#endif /*Py_PYCONFIG_H*/ #endif /*Py_PYCONFIG_H*/