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

@ -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:

View file

@ -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,34 +460,31 @@ 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.
.. 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]
>>> Point(*t) # the star-operator unpacks any iterable object
>>> Point._cast(t)
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()
Return a new dict which maps field names to their corresponding values:
@ -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`.

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
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`.

View file

@ -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

View file

@ -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);

View file

@ -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);

View file

@ -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

View file

@ -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

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']
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

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 @@
# 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:

View file

@ -71,6 +71,7 @@ def jabs_op(name, op):
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 @@ def jabs_op(name, op):
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)

View file

@ -49,6 +49,7 @@ def test_instance(self):
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 @@ def test_tupleness(self):
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):

View file

@ -1,7 +1,7 @@
import unittest
from test import test_support
import sys, UserDict
import sys, UserDict, random, string
class DictTest(unittest.TestCase):
@ -11,6 +11,15 @@ def test_constructor(self):
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})

View file

@ -3,6 +3,12 @@
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 @@ def test_repr(self):
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__':

View file

@ -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 \

View file

@ -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);

View file

@ -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);
}

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
* 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.

View file

@ -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

View file

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

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! */
/* 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. */

View file

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

View 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"
>

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
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

View file

@ -12,14 +12,24 @@
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"):

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"
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>

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"
>
</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"
>

View file

@ -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();

View file

@ -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:

View file

@ -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

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
# 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

View file

@ -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

View file

@ -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*/