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:
parent
2c18161606
commit
99170a5dbf
|
@ -1047,6 +1047,22 @@ The following functions provide locale-independent string to number conversions.
|
|||
|
||||
See the Unix man page :manpage:`atof(2)` for details.
|
||||
|
||||
|
||||
.. cfunction:: char * PyOS_stricmp(char *s1, char *s2)
|
||||
|
||||
Case insensitive comparsion of strings. The functions works almost
|
||||
identical to :cfunc:`strcmp` except that it ignores the case.
|
||||
|
||||
.. versionadded:: 2.6
|
||||
|
||||
|
||||
.. cfunction:: char * PyOS_strnicmp(char *s1, char *s2, Py_ssize_t size)
|
||||
|
||||
Case insensitive comparsion of strings. The functions works almost
|
||||
identical to :cfunc:`strncmp` except that it ignores the case.
|
||||
|
||||
.. versionadded:: 2.6
|
||||
|
||||
|
||||
.. _reflection:
|
||||
|
||||
|
|
|
@ -421,27 +421,31 @@ Example::
|
|||
|
||||
__slots__ = ()
|
||||
|
||||
_fields = ('x', 'y')
|
||||
|
||||
def __new__(cls, x, y):
|
||||
return tuple.__new__(cls, (x, y))
|
||||
|
||||
_cast = classmethod(tuple.__new__)
|
||||
|
||||
def __repr__(self):
|
||||
return 'Point(x=%r, y=%r)' % self
|
||||
|
||||
def _asdict(self):
|
||||
def _asdict(t):
|
||||
'Return a new dict which maps field names to their values'
|
||||
return dict(zip(('x', 'y'), self))
|
||||
return {'x': t[0], 'y': t[1]}
|
||||
|
||||
def _replace(self, **kwds):
|
||||
'Return a new Point object replacing specified fields with new values'
|
||||
return Point(*map(kwds.get, ('x', 'y'), self))
|
||||
return Point._cast(map(kwds.get, ('x', 'y'), self))
|
||||
|
||||
@property
|
||||
def _fields(self):
|
||||
return ('x', 'y')
|
||||
|
||||
x = property(itemgetter(0))
|
||||
y = property(itemgetter(1))
|
||||
|
||||
>>> p = Point(11, y=22) # instantiate with positional or keyword arguments
|
||||
>>> p[0] + p[1] # indexable like the regular tuple (11, 22)
|
||||
>>> p[0] + p[1] # indexable like the plain tuple (11, 22)
|
||||
33
|
||||
>>> x, y = p # unpack like a regular tuple
|
||||
>>> x, y
|
||||
|
@ -456,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`.
|
||||
|
|
|
@ -435,7 +435,8 @@ available. They are listed here in alphabetical order.
|
|||
|
||||
Convert a string or a number to floating point. If the argument is a string, it
|
||||
must contain a possibly signed decimal or floating point number, possibly
|
||||
embedded in whitespace. Otherwise, the argument may be an integer
|
||||
embedded in whitespace. The argument may also be [+|-]nan or [+|-]inf.
|
||||
Otherwise, the argument may be a plain integer
|
||||
or a floating point number, and a floating point number with the same value
|
||||
(within Python's floating point precision) is returned. If no argument is
|
||||
given, returns ``0.0``.
|
||||
|
@ -447,9 +448,10 @@ available. They are listed here in alphabetical order.
|
|||
single: Infinity
|
||||
|
||||
When passing in a string, values for NaN and Infinity may be returned, depending
|
||||
on the underlying C library. The specific set of strings accepted which cause
|
||||
these values to be returned depends entirely on the C library and is known to
|
||||
vary.
|
||||
on the underlying C library. Float accepts the strings nan, inf and -inf for
|
||||
NaN and positive or negative infinity. The case and a leading + are ignored as
|
||||
well as a leading - is ignored for NaN. Float always represents NaN and infinity
|
||||
as nan, inf or -inf.
|
||||
|
||||
The float type is described in :ref:`typesnumeric`.
|
||||
|
||||
|
|
|
@ -285,7 +285,7 @@ numeric operations have a higher priority than comparison operations):
|
|||
+---------------------+---------------------------------+-------+--------------------+
|
||||
| ``int(x)`` | *x* converted to integer | \(3) | :func:`int` |
|
||||
+---------------------+---------------------------------+-------+--------------------+
|
||||
| ``float(x)`` | *x* converted to floating point | | :func:`float` |
|
||||
| ``float(x)`` | *x* converted to floating point | \(6) | :func:`float` |
|
||||
+---------------------+---------------------------------+-------+--------------------+
|
||||
| ``complex(re, im)`` | a complex number with real part | | :func:`complex` |
|
||||
| | *re*, imaginary part *im*. | | |
|
||||
|
@ -329,6 +329,13 @@ Notes:
|
|||
as in C; see functions :func:`floor` and :func:`ceil` in the :mod:`math` module
|
||||
for well-defined conversions.
|
||||
|
||||
(6)
|
||||
float also accepts the strings "nan" and "inf" with an optional prefix "+"
|
||||
or "-" for Not a Number (NaN) and positive or negative infinity.
|
||||
|
||||
.. versionadded:: 2.6
|
||||
|
||||
|
||||
.. % XXXJH exceptions: overflow (when? what operations?) zerodivision
|
||||
|
||||
|
||||
|
|
|
@ -114,6 +114,7 @@
|
|||
#include "eval.h"
|
||||
|
||||
#include "pystrtod.h"
|
||||
#include "pystrcmp.h"
|
||||
|
||||
/* _Py_Mangle is defined in compile.c */
|
||||
PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name);
|
||||
|
|
|
@ -123,6 +123,7 @@ PyAPI_FUNC(Py_ssize_t) PyDict_Size(PyObject *mp);
|
|||
PyAPI_FUNC(PyObject *) PyDict_Copy(PyObject *mp);
|
||||
PyAPI_FUNC(int) PyDict_Contains(PyObject *mp, PyObject *key);
|
||||
PyAPI_FUNC(int) _PyDict_Contains(PyObject *mp, PyObject *key, long hash);
|
||||
PyAPI_FUNC(PyObject *) _PyDict_NewPresized(Py_ssize_t minused);
|
||||
|
||||
/* PyDict_Update(mp, other) is equivalent to PyDict_Merge(mp, other, 1). */
|
||||
PyAPI_FUNC(int) PyDict_Update(PyObject *mp, PyObject *other);
|
||||
|
|
|
@ -36,6 +36,7 @@ extern "C" {
|
|||
#define INPLACE_FLOOR_DIVIDE 28
|
||||
#define INPLACE_TRUE_DIVIDE 29
|
||||
|
||||
#define STORE_MAP 54
|
||||
#define INPLACE_ADD 55
|
||||
#define INPLACE_SUBTRACT 56
|
||||
#define INPLACE_MULTIPLY 57
|
||||
|
|
|
@ -332,6 +332,17 @@ extern "C" {
|
|||
#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE)
|
||||
#endif
|
||||
|
||||
/* High precision defintion of pi and e (Euler)
|
||||
* The values are taken from libc6's math.h.
|
||||
*/
|
||||
#ifndef Py_MATH_PI
|
||||
#define Py_MATH_PI 3.1415926535897932384626433832795029L
|
||||
#endif
|
||||
|
||||
#ifndef Py_MATH_E
|
||||
#define Py_MATH_E 2.7182818284590452353602874713526625L
|
||||
#endif
|
||||
|
||||
/* Py_IS_NAN(X)
|
||||
* Return 1 if float or double arg is a NaN, else 0.
|
||||
* Caution:
|
||||
|
@ -341,8 +352,12 @@ extern "C" {
|
|||
* a platform where it doesn't work.
|
||||
*/
|
||||
#ifndef Py_IS_NAN
|
||||
#ifdef HAVE_ISNAN
|
||||
#define Py_IS_NAN(X) isnan(X)
|
||||
#else
|
||||
#define Py_IS_NAN(X) ((X) != (X))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Py_IS_INFINITY(X)
|
||||
* Return 1 if float or double arg is an infinity, else 0.
|
||||
|
@ -353,8 +368,12 @@ extern "C" {
|
|||
* Override in pyconfig.h if you have a better spelling on your platform.
|
||||
*/
|
||||
#ifndef Py_IS_INFINITY
|
||||
#ifdef HAVE_ISINF
|
||||
#define Py_IS_INFINITY(X) isinf(X)
|
||||
#else
|
||||
#define Py_IS_INFINITY(X) ((X) && (X)*0.5 == (X))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Py_IS_FINITE(X)
|
||||
* Return 1 if float or double arg is neither infinite nor NAN, else 0.
|
||||
|
@ -362,8 +381,12 @@ extern "C" {
|
|||
* macro for this particular test is useful
|
||||
*/
|
||||
#ifndef Py_IS_FINITE
|
||||
#ifdef HAVE_ISFINITE
|
||||
#define Py_IS_FINITE(X) isfinite
|
||||
#else
|
||||
#define Py_IS_FINITE(X) (!Py_IS_INFINITY(X) && !Py_IS_NAN(X))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* HUGE_VAL is supposed to expand to a positive double infinity. Python
|
||||
* uses Py_HUGE_VAL instead because some platforms are broken in this
|
||||
|
@ -376,6 +399,15 @@ extern "C" {
|
|||
#define Py_HUGE_VAL HUGE_VAL
|
||||
#endif
|
||||
|
||||
/* Py_NAN
|
||||
* A value that evaluates to a NaN. On IEEE 754 platforms INF*0 or
|
||||
* INF/INF works. Define Py_NO_NAN in pyconfig.h if your platform
|
||||
* doesn't support NaNs.
|
||||
*/
|
||||
#if !defined(Py_NAN) && !defined(Py_NO_NAN)
|
||||
#define Py_NAN (Py_HUGE_VAL * 0.)
|
||||
#endif
|
||||
|
||||
/* Py_OVERFLOWED(X)
|
||||
* Return 1 iff a libm function overflowed. Set errno to 0 before calling
|
||||
* a libm function, and invoke this macro after, passing the function
|
||||
|
|
|
@ -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 */
|
|
@ -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
|
||||
|
|
|
@ -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()
|
|
@ -11,6 +11,10 @@ import sys, os
|
|||
# the real Tcl library will do.
|
||||
|
||||
prefix = os.path.join(sys.prefix,"tcl")
|
||||
if not os.path.exists(prefix):
|
||||
# devdir/../tcltk/lib
|
||||
prefix = os.path.join(sys.prefix, os.path.pardir, "tcltk", "lib")
|
||||
prefix = os.path.abspath(prefix)
|
||||
# if this does not exist, no further search is needed
|
||||
if os.path.exists(prefix):
|
||||
if "TCL_LIBRARY" not in os.environ:
|
||||
|
|
|
@ -71,6 +71,7 @@ def_op('BINARY_TRUE_DIVIDE', 27)
|
|||
def_op('INPLACE_FLOOR_DIVIDE', 28)
|
||||
def_op('INPLACE_TRUE_DIVIDE', 29)
|
||||
|
||||
def_op('STORE_MAP', 54)
|
||||
def_op('INPLACE_ADD', 55)
|
||||
def_op('INPLACE_SUBTRACT', 56)
|
||||
def_op('INPLACE_MULTIPLY', 57)
|
||||
|
@ -123,7 +124,7 @@ name_op('LOAD_NAME', 101) # Index in name list
|
|||
def_op('BUILD_TUPLE', 102) # Number of tuple items
|
||||
def_op('BUILD_LIST', 103) # Number of list items
|
||||
def_op('BUILD_SET', 104) # Number of set items
|
||||
def_op('BUILD_MAP', 105) # Always zero for now
|
||||
def_op('BUILD_MAP', 105) # Number of dict entries (upto 255)
|
||||
name_op('LOAD_ATTR', 106) # Index in name list
|
||||
def_op('COMPARE_OP', 107) # Comparison operator
|
||||
hascompare.append(107)
|
||||
|
|
|
@ -49,6 +49,7 @@ class TestNamedTuple(unittest.TestCase):
|
|||
self.assertEqual(repr(p), 'Point(x=11, y=22)')
|
||||
self.assert_('__dict__' not in dir(p)) # verify instance has no dict
|
||||
self.assert_('__weakref__' not in dir(p))
|
||||
self.assertEqual(p, Point._cast([11, 22])) # test _cast classmethod
|
||||
self.assertEqual(p._fields, ('x', 'y')) # test _fields attribute
|
||||
self.assertEqual(p._replace(x=1), (1, 22)) # test _replace method
|
||||
self.assertEqual(p._asdict(), dict(x=11, y=22)) # test _asdict method
|
||||
|
@ -93,9 +94,40 @@ class TestNamedTuple(unittest.TestCase):
|
|||
def test_odd_sizes(self):
|
||||
Zero = namedtuple('Zero', '')
|
||||
self.assertEqual(Zero(), ())
|
||||
self.assertEqual(Zero._cast([]), ())
|
||||
self.assertEqual(repr(Zero()), 'Zero()')
|
||||
self.assertEqual(Zero()._asdict(), {})
|
||||
self.assertEqual(Zero()._fields, ())
|
||||
|
||||
Dot = namedtuple('Dot', 'd')
|
||||
self.assertEqual(Dot(1), (1,))
|
||||
self.assertEqual(Dot._cast([1]), (1,))
|
||||
self.assertEqual(Dot(1).d, 1)
|
||||
self.assertEqual(repr(Dot(1)), 'Dot(d=1)')
|
||||
self.assertEqual(Dot(1)._asdict(), {'d':1})
|
||||
self.assertEqual(Dot(1)._replace(d=999), (999,))
|
||||
self.assertEqual(Dot(1)._fields, ('d',))
|
||||
|
||||
# n = 10000
|
||||
n = 254 # SyntaxError: more than 255 arguments:
|
||||
import string, random
|
||||
names = [''.join([random.choice(string.ascii_letters) for j in range(10)]) for i in range(n)]
|
||||
Big = namedtuple('Big', names)
|
||||
b = Big(*range(n))
|
||||
self.assertEqual(b, tuple(range(n)))
|
||||
self.assertEqual(Big._cast(range(n)), tuple(range(n)))
|
||||
for pos, name in enumerate(names):
|
||||
self.assertEqual(getattr(b, name), pos)
|
||||
repr(b) # make sure repr() doesn't blow-up
|
||||
d = b._asdict()
|
||||
d_expected = dict(zip(names, range(n)))
|
||||
self.assertEqual(d, d_expected)
|
||||
b2 = b._replace(**dict([(names[1], 999),(names[-5], 42)]))
|
||||
b2_expected = list(range(n))
|
||||
b2_expected[1] = 999
|
||||
b2_expected[-5] = 42
|
||||
self.assertEqual(b2, tuple(b2_expected))
|
||||
self.assertEqual(b._fields, tuple(names))
|
||||
|
||||
class TestOneTrickPonyABCs(unittest.TestCase):
|
||||
|
||||
|
|
|
@ -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 @@ class DictTest(unittest.TestCase):
|
|||
self.assertEqual(dict(), {})
|
||||
self.assert_(dict() is not {})
|
||||
|
||||
def test_literal_constructor(self):
|
||||
# check literal constructor for different sized dicts (to exercise the BUILD_MAP oparg
|
||||
items = []
|
||||
for n in range(400):
|
||||
dictliteral = '{' + ', '.join('%r: %d' % item for item in items) + '}'
|
||||
self.assertEqual(eval(dictliteral), dict(items))
|
||||
items.append((''.join([random.choice(string.ascii_letters) for j in range(8)]), n))
|
||||
random.shuffle(items)
|
||||
|
||||
def test_bool(self):
|
||||
self.assert_(not {})
|
||||
self.assert_({1: 2})
|
||||
|
|
|
@ -3,6 +3,12 @@ import unittest, struct
|
|||
import os
|
||||
from test import test_support
|
||||
|
||||
def isinf(x):
|
||||
return x * 0.5 == x
|
||||
|
||||
def isnan(x):
|
||||
return x != x
|
||||
|
||||
class FormatFunctionsTestCase(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
|
@ -159,6 +165,70 @@ class ReprTestCase(unittest.TestCase):
|
|||
self.assertEqual(v, eval(repr(v)))
|
||||
floats_file.close()
|
||||
|
||||
# Beginning with Python 2.6 float has cross platform compatible
|
||||
# ways to create and representate inf and nan
|
||||
class InfNanTest(unittest.TestCase):
|
||||
def test_inf_from_str(self):
|
||||
self.assert_(isinf(float("inf")))
|
||||
self.assert_(isinf(float("+inf")))
|
||||
self.assert_(isinf(float("-inf")))
|
||||
|
||||
self.assertEqual(repr(float("inf")), "inf")
|
||||
self.assertEqual(repr(float("+inf")), "inf")
|
||||
self.assertEqual(repr(float("-inf")), "-inf")
|
||||
|
||||
self.assertEqual(repr(float("INF")), "inf")
|
||||
self.assertEqual(repr(float("+Inf")), "inf")
|
||||
self.assertEqual(repr(float("-iNF")), "-inf")
|
||||
|
||||
self.assertEqual(str(float("inf")), "inf")
|
||||
self.assertEqual(str(float("+inf")), "inf")
|
||||
self.assertEqual(str(float("-inf")), "-inf")
|
||||
|
||||
self.assertRaises(ValueError, float, "info")
|
||||
self.assertRaises(ValueError, float, "+info")
|
||||
self.assertRaises(ValueError, float, "-info")
|
||||
self.assertRaises(ValueError, float, "in")
|
||||
self.assertRaises(ValueError, float, "+in")
|
||||
self.assertRaises(ValueError, float, "-in")
|
||||
|
||||
def test_inf_as_str(self):
|
||||
self.assertEqual(repr(1e300 * 1e300), "inf")
|
||||
self.assertEqual(repr(-1e300 * 1e300), "-inf")
|
||||
|
||||
self.assertEqual(str(1e300 * 1e300), "inf")
|
||||
self.assertEqual(str(-1e300 * 1e300), "-inf")
|
||||
|
||||
def test_nan_from_str(self):
|
||||
self.assert_(isnan(float("nan")))
|
||||
self.assert_(isnan(float("+nan")))
|
||||
self.assert_(isnan(float("-nan")))
|
||||
|
||||
self.assertEqual(repr(float("nan")), "nan")
|
||||
self.assertEqual(repr(float("+nan")), "nan")
|
||||
self.assertEqual(repr(float("-nan")), "nan")
|
||||
|
||||
self.assertEqual(repr(float("NAN")), "nan")
|
||||
self.assertEqual(repr(float("+NAn")), "nan")
|
||||
self.assertEqual(repr(float("-NaN")), "nan")
|
||||
|
||||
self.assertEqual(str(float("nan")), "nan")
|
||||
self.assertEqual(str(float("+nan")), "nan")
|
||||
self.assertEqual(str(float("-nan")), "nan")
|
||||
|
||||
self.assertRaises(ValueError, float, "nana")
|
||||
self.assertRaises(ValueError, float, "+nana")
|
||||
self.assertRaises(ValueError, float, "-nana")
|
||||
self.assertRaises(ValueError, float, "na")
|
||||
self.assertRaises(ValueError, float, "+na")
|
||||
self.assertRaises(ValueError, float, "-na")
|
||||
|
||||
def test_nan_as_str(self):
|
||||
self.assertEqual(repr(1e300 * 1e300 * 0), "nan")
|
||||
self.assertEqual(repr(-1e300 * 1e300 * 0), "nan")
|
||||
|
||||
self.assertEqual(str(1e300 * 1e300 * 0), "nan")
|
||||
self.assertEqual(str(-1e300 * 1e300 * 0), "nan")
|
||||
|
||||
def test_main():
|
||||
test_support.run_unittest(
|
||||
|
@ -166,7 +236,8 @@ def test_main():
|
|||
UnknownFormatTestCase,
|
||||
IEEEFormatTestCase,
|
||||
FormatTestCase,
|
||||
#ReprTestCase
|
||||
ReprTestCase,
|
||||
InfNanTest,
|
||||
)
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
|
|
@ -275,6 +275,7 @@ PYTHON_OBJS= \
|
|||
Python/sysmodule.o \
|
||||
Python/traceback.o \
|
||||
Python/getopt.o \
|
||||
Python/pystrcmp.o \
|
||||
Python/pystrtod.o \
|
||||
Python/formatter_unicode.o \
|
||||
Python/$(DYNLOADFILE) \
|
||||
|
@ -585,6 +586,8 @@ PYTHON_HEADERS= \
|
|||
Include/pymem.h \
|
||||
Include/pyport.h \
|
||||
Include/pystate.h \
|
||||
Include/pystrtod.h \
|
||||
Include/pystrcmp.h \
|
||||
Include/pythonrun.h \
|
||||
Include/rangeobject.h \
|
||||
Include/setobject.h \
|
||||
|
|
|
@ -783,6 +783,12 @@ CharArray_set_value(CDataObject *self, PyObject *value)
|
|||
char *ptr;
|
||||
Py_ssize_t size;
|
||||
|
||||
if (value == NULL) {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"can't delete attribute");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (PyUnicode_Check(value)) {
|
||||
value = PyUnicode_AsEncodedString(value,
|
||||
conversion_mode_encoding,
|
||||
|
@ -838,6 +844,11 @@ WCharArray_set_value(CDataObject *self, PyObject *value)
|
|||
{
|
||||
Py_ssize_t result = 0;
|
||||
|
||||
if (value == NULL) {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"can't delete attribute");
|
||||
return -1;
|
||||
}
|
||||
if (PyString_Check(value)) {
|
||||
value = PyUnicode_FromEncodedObject(value,
|
||||
conversion_mode_encoding,
|
||||
|
@ -4022,6 +4033,11 @@ Simple_set_value(CDataObject *self, PyObject *value)
|
|||
PyObject *result;
|
||||
StgDictObject *dict = PyObject_stgdict((PyObject *)self);
|
||||
|
||||
if (value == NULL) {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"can't delete attribute");
|
||||
return -1;
|
||||
}
|
||||
assert(dict); /* Cannot be NULL for CDataObject instances */
|
||||
assert(dict->setfunc);
|
||||
result = dict->setfunc(self->b_ptr, value, dict->size);
|
||||
|
|
|
@ -195,6 +195,11 @@ CField_set(CFieldObject *self, PyObject *inst, PyObject *value)
|
|||
assert(CDataObject_Check(inst));
|
||||
dst = (CDataObject *)inst;
|
||||
ptr = dst->b_ptr + self->offset;
|
||||
if (value == NULL) {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"can't delete attribute");
|
||||
return -1;
|
||||
}
|
||||
return CData_set(inst, self->proto, self->setfunc, value,
|
||||
self->index, self->size, ptr);
|
||||
}
|
||||
|
|
|
@ -2181,12 +2181,12 @@ See recv() for documentation about the flags.");
|
|||
|
||||
|
||||
/*
|
||||
* This is the guts of the recv() and recv_into() methods, which reads into a
|
||||
* char buffer. If you have any inc/def ref to do to the objects that contain
|
||||
* the buffer, do it in the caller. This function returns the number of bytes
|
||||
* succesfully read. If there was an error, it returns -1. Note that it is
|
||||
* also possible that we return a number of bytes smaller than the request
|
||||
* bytes.
|
||||
* This is the guts of the recvfrom() and recvfrom_into() methods, which reads
|
||||
* into a char buffer. If you have any inc/def ref to do to the objects that
|
||||
* contain the buffer, do it in the caller. This function returns the number
|
||||
* of bytes succesfully read. If there was an error, it returns -1. Note
|
||||
* that it is also possible that we return a number of bytes smaller than the
|
||||
* request bytes.
|
||||
*
|
||||
* 'addr' is a return value for the address object. Note that you must decref
|
||||
* it yourself.
|
||||
|
|
|
@ -551,6 +551,23 @@ dictresize(PyDictObject *mp, Py_ssize_t minused)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Create a new dictionary pre-sized to hold an estimated number of elements.
|
||||
Underestimates are okay because the dictionary will resize as necessary.
|
||||
Overestimates just mean the dictionary will be more sparse than usual.
|
||||
*/
|
||||
|
||||
PyObject *
|
||||
_PyDict_NewPresized(Py_ssize_t minused)
|
||||
{
|
||||
PyObject *op = PyDict_New();
|
||||
|
||||
if (minused>5 && op != NULL && dictresize((PyDictObject *)op, minused) == -1) {
|
||||
Py_DECREF(op);
|
||||
return NULL;
|
||||
}
|
||||
return op;
|
||||
}
|
||||
|
||||
/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
|
||||
* that may occur (originally dicts supported only string keys, and exceptions
|
||||
* weren't possible). So, while the original intent was that a NULL return
|
||||
|
|
|
@ -114,7 +114,7 @@ PyFloat_FromDouble(double fval)
|
|||
PyObject *
|
||||
PyFloat_FromString(PyObject *v)
|
||||
{
|
||||
const char *s, *last, *end;
|
||||
const char *s, *last, *end, *sp;
|
||||
double x;
|
||||
char buffer[256]; /* for errors */
|
||||
char *s_buffer = NULL;
|
||||
|
@ -146,6 +146,7 @@ PyFloat_FromString(PyObject *v)
|
|||
PyErr_SetString(PyExc_ValueError, "empty string for float()");
|
||||
goto error;
|
||||
}
|
||||
sp = s;
|
||||
/* We don't care about overflow or underflow. If the platform supports
|
||||
* them, infinities and signed zeroes (on underflow) are fine.
|
||||
* However, strtod can return 0 for denormalized numbers, where atof
|
||||
|
@ -161,7 +162,26 @@ PyFloat_FromString(PyObject *v)
|
|||
byte at the end of the string, when the input is inf(inity). */
|
||||
if (end > last)
|
||||
end = last;
|
||||
/* Check for inf and nan. This is done late because it rarely happens. */
|
||||
if (end == s) {
|
||||
char *p = (char*)sp;
|
||||
int sign = 1;
|
||||
|
||||
if (*p == '-') {
|
||||
sign = -1;
|
||||
p++;
|
||||
}
|
||||
if (*p == '+') {
|
||||
p++;
|
||||
}
|
||||
if (PyOS_strnicmp(p, "inf", 4) == 0) {
|
||||
return PyFloat_FromDouble(sign * Py_HUGE_VAL);
|
||||
}
|
||||
#ifdef Py_NAN
|
||||
if(PyOS_strnicmp(p, "nan", 4) == 0) {
|
||||
return PyFloat_FromDouble(Py_NAN);
|
||||
}
|
||||
#endif
|
||||
PyOS_snprintf(buffer, sizeof(buffer),
|
||||
"invalid literal for float(): %.200s", s);
|
||||
PyErr_SetString(PyExc_ValueError, buffer);
|
||||
|
@ -250,7 +270,9 @@ format_double(char *buf, size_t buflen, double ob_fval, int precision)
|
|||
{
|
||||
register char *cp;
|
||||
char format[32];
|
||||
/* Subroutine for float_repr, float_str, and others.
|
||||
int i;
|
||||
|
||||
/* Subroutine for float_repr, float_str and float_print.
|
||||
We want float numbers to be recognizable as such,
|
||||
i.e., they should contain a decimal point or an exponent.
|
||||
However, %g may print the number as an integer;
|
||||
|
@ -271,7 +293,33 @@ format_double(char *buf, size_t buflen, double ob_fval, int precision)
|
|||
*cp++ = '.';
|
||||
*cp++ = '0';
|
||||
*cp++ = '\0';
|
||||
return;
|
||||
}
|
||||
/* Checking the next three chars should be more than enough to
|
||||
* detect inf or nan, even on Windows. We check for inf or nan
|
||||
* at last because they are rare cases.
|
||||
*/
|
||||
for (i=0; *cp != '\0' && i<3; cp++, i++) {
|
||||
if (isdigit(Py_CHARMASK(*cp)) || *cp == '.')
|
||||
continue;
|
||||
/* found something that is neither a digit nor point
|
||||
* it might be a NaN or INF
|
||||
*/
|
||||
#ifdef Py_NAN
|
||||
if (Py_IS_NAN(ob_fval)) {
|
||||
strcpy(buf, "nan");
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if (Py_IS_INFINITY(ob_fval)) {
|
||||
cp = buf;
|
||||
if (*cp == '-')
|
||||
cp++;
|
||||
strcpy(cp, "inf");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -386,6 +386,15 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */
|
|||
|
||||
/* Fairly standard from here! */
|
||||
|
||||
/* Define to 1 if you have the `copysign' function. */
|
||||
/* #define HAVE_COPYSIGN 1*/
|
||||
|
||||
/* Define to 1 if you have the `isinf' function. */
|
||||
#define HAVE_ISINF 1
|
||||
|
||||
/* Define to 1 if you have the `isnan' function. */
|
||||
#define HAVE_ISNAN 1
|
||||
|
||||
/* Define if on AIX 3.
|
||||
System headers sometimes define this.
|
||||
We just want to avoid a redefinition error message. */
|
||||
|
|
|
@ -700,6 +700,10 @@
|
|||
<File
|
||||
RelativePath="..\Python\pystate.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Python\pystrcmp.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Python\pystrtod.c">
|
||||
</File>
|
||||
|
|
|
@ -735,6 +735,10 @@
|
|||
RelativePath="..\..\Python\pystate.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\Python\pystrcmp.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\Python\pystrtod.c"
|
||||
>
|
||||
|
@ -1213,6 +1217,10 @@
|
|||
RelativePath="..\..\Include\pystate.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\Include\pystrcmp.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\Include\pystrtod.h"
|
||||
>
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -56,7 +56,7 @@
|
|||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="$(tcltkDir)\lib\tcl84.lib $(tcltkDir)\lib\tk84.lib $(tcltkDir)\lib\tix8.4\tix84.lib"
|
||||
AdditionalDependencies="$(tcltkLib)"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
|
@ -118,7 +118,7 @@
|
|||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="$(tcltk64Dir)\lib\tcl84.lib $(tcltk64Dir)\lib\tk84.lib $(tcltk64Dir)\lib\tix8.4\tix84.lib"
|
||||
AdditionalDependencies="$(tcltk64Lib)"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
|
@ -180,7 +180,7 @@
|
|||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="$(tcltkDir)\lib\tcl84.lib $(tcltkDir)\lib\tk84.lib $(tcltkDir)\lib\tix8.4\tix84.lib"
|
||||
AdditionalDependencies="$(tcltkLib)"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
|
@ -243,7 +243,7 @@
|
|||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="$(tcltk64Dir)\lib\tcl84.lib $(tcltk64Dir)\lib\tk84.lib $(tcltk64Dir)\lib\tix8.4\tix84.lib"
|
||||
AdditionalDependencies="$(tcltk64Lib)"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
|
@ -305,7 +305,7 @@
|
|||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="$(tcltkDir)\lib\tcl84.lib $(tcltkDir)\lib\tk84.lib $(tcltkDir)\lib\tix8.4\tix84.lib"
|
||||
AdditionalDependencies="$(tcltkLib)"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
|
@ -368,7 +368,7 @@
|
|||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="$(tcltk64Dir)\lib\tcl84.lib $(tcltk64Dir)\lib\tk84.lib $(tcltk64Dir)\lib\tix8.4\tix84.lib"
|
||||
AdditionalDependencies="$(tcltk64Lib)"
|
||||
TargetMachine="17"
|
||||
/>
|
||||
<Tool
|
||||
|
@ -431,7 +431,7 @@
|
|||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="$(tcltkDir)\lib\tcl84.lib $(tcltkDir)\lib\tk84.lib $(tcltkDir)\lib\tix8.4\tix84.lib"
|
||||
AdditionalDependencies="$(tcltkLib)"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
|
@ -494,7 +494,7 @@
|
|||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="$(tcltk64Dir)\lib\tcl84.lib $(tcltk64Dir)\lib\tk84.lib $(tcltk64Dir)\lib\tix8.4\tix84.lib"
|
||||
AdditionalDependencies="$(tcltk64Lib)"
|
||||
TargetMachine="17"
|
||||
/>
|
||||
<Tool
|
||||
|
|
|
@ -12,14 +12,24 @@ import shutil
|
|||
here = os.path.abspath(os.path.dirname(__file__))
|
||||
par = os.path.pardir
|
||||
|
||||
TCL = "tcl8.4.16"
|
||||
TK = "tk8.4.16"
|
||||
TIX = "tix-8.4.0"
|
||||
#TIX = "Tix8.4.2"
|
||||
ROOT = os.path.abspath(os.path.join(here, par, par))
|
||||
NMAKE = "nmake /nologo "
|
||||
if 1:
|
||||
TCL = "tcl8.4.16"
|
||||
TK = "tk8.4.16"
|
||||
TIX = "tix-8.4.0"
|
||||
else:
|
||||
TCL = "tcl8.5b3"
|
||||
TK = "tcl8.5b3"
|
||||
TIX = "Tix8.4.2"
|
||||
|
||||
def system(cmd):
|
||||
ROOT = os.path.abspath(os.path.join(here, par, par))
|
||||
# Windows 2000 compatibility: WINVER 0x0500
|
||||
# http://msdn2.microsoft.com/en-us/library/aa383745.aspx
|
||||
NMAKE = "nmake /nologo /f %s COMPILERFLAGS=-DWINVER=0x0500 %s %s"
|
||||
|
||||
def nmake(makefile, command="", **kw):
|
||||
defines = ' '.join(k+'='+v for k, v in kw.items())
|
||||
cmd = NMAKE % (makefile, defines, command)
|
||||
print("\n\n"+cmd+"\n")
|
||||
if os.system(cmd) != 0:
|
||||
raise RuntimeError(cmd)
|
||||
|
||||
|
@ -35,31 +45,29 @@ def build(platform, clean):
|
|||
|
||||
# TCL
|
||||
tcldir = os.path.join(ROOT, TCL)
|
||||
if True:
|
||||
if 1:
|
||||
os.chdir(os.path.join(tcldir, "win"))
|
||||
if clean:
|
||||
system(NMAKE + "/f makefile.vc clean")
|
||||
system(NMAKE + "/f makefile.vc")
|
||||
system(NMAKE + "/f makefile.vc INSTALLDIR=%s install" % dest)
|
||||
nmake("makefile.vc", "clean")
|
||||
nmake("makefile.vc")
|
||||
nmake("makefile.vc", "install", INSTALLDIR=dest)
|
||||
|
||||
# TK
|
||||
if True:
|
||||
if 1:
|
||||
os.chdir(os.path.join(ROOT, TK, "win"))
|
||||
if clean:
|
||||
system(NMAKE + "/f makefile.vc clean")
|
||||
system(NMAKE + "/f makefile.vc TCLDIR=%s" % tcldir)
|
||||
system(NMAKE + "/f makefile.vc TCLDIR=%s INSTALLDIR=%s install" %
|
||||
(tcldir, dest))
|
||||
nmake("makefile.vc", "clean", TCLDIR=tcldir)
|
||||
nmake("makefile.vc", TCLDIR=tcldir)
|
||||
nmake("makefile.vc", "install", TCLDIR=tcldir, INSTALLDIR=dest)
|
||||
|
||||
# TIX
|
||||
if True:
|
||||
if 1:
|
||||
# python9.mak is available at http://svn.python.org
|
||||
os.chdir(os.path.join(ROOT, TIX, "win"))
|
||||
if clean:
|
||||
system(NMAKE + "/f python9.mak clean")
|
||||
system(NMAKE + "/f python9.mak MACHINE=%s" % machine)
|
||||
system(NMAKE + "/f python9.mak install")
|
||||
|
||||
nmake("python9.mak", "clean")
|
||||
nmake("python9.mak", MACHINE=machine)
|
||||
nmake("python9.mak", "install")
|
||||
|
||||
def main():
|
||||
if len(sys.argv) < 2 or sys.argv[1] not in ("Win32", "x64"):
|
||||
|
|
|
@ -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%
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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
|
@ -878,6 +878,10 @@
|
|||
RelativePath="..\Include\pystate.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Include\pystrcmp.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Include\pystrtod.h"
|
||||
>
|
||||
|
@ -1714,6 +1718,10 @@
|
|||
RelativePath="..\Python\pystate.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Python\pystrcmp.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Python\pystrtod.c"
|
||||
>
|
||||
|
|
|
@ -1787,11 +1787,23 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
|
|||
break;
|
||||
|
||||
case BUILD_MAP:
|
||||
x = PyDict_New();
|
||||
x = _PyDict_NewPresized((Py_ssize_t)oparg);
|
||||
PUSH(x);
|
||||
if (x != NULL) continue;
|
||||
break;
|
||||
|
||||
case STORE_MAP:
|
||||
w = TOP(); /* key */
|
||||
u = SECOND(); /* value */
|
||||
v = THIRD(); /* dict */
|
||||
STACKADJ(-2);
|
||||
assert (PyDict_CheckExact(v));
|
||||
err = PyDict_SetItem(v, w, u); /* v[w] = u */
|
||||
Py_DECREF(u);
|
||||
Py_DECREF(w);
|
||||
if (err == 0) continue;
|
||||
break;
|
||||
|
||||
case LOAD_ATTR:
|
||||
w = GETITEM(names, oparg);
|
||||
v = TOP();
|
||||
|
|
|
@ -714,6 +714,8 @@ opcode_stack_effect(int opcode, int oparg)
|
|||
return -1;
|
||||
case STORE_SUBSCR:
|
||||
return -3;
|
||||
case STORE_MAP:
|
||||
return -2;
|
||||
case DELETE_SUBSCR:
|
||||
return -2;
|
||||
|
||||
|
@ -3169,19 +3171,14 @@ compiler_visit_expr(struct compiler *c, expr_ty e)
|
|||
case IfExp_kind:
|
||||
return compiler_ifexp(c, e);
|
||||
case Dict_kind:
|
||||
/* XXX get rid of arg? */
|
||||
ADDOP_I(c, BUILD_MAP, 0);
|
||||
n = asdl_seq_LEN(e->v.Dict.values);
|
||||
/* We must arrange things just right for STORE_SUBSCR.
|
||||
It wants the stack to look like (value) (dict) (key) */
|
||||
ADDOP_I(c, BUILD_MAP, (n>255 ? 255 : n));
|
||||
for (i = 0; i < n; i++) {
|
||||
ADDOP(c, DUP_TOP);
|
||||
VISIT(c, expr,
|
||||
(expr_ty)asdl_seq_GET(e->v.Dict.values, i));
|
||||
ADDOP(c, ROT_TWO);
|
||||
VISIT(c, expr,
|
||||
(expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
|
||||
ADDOP(c, STORE_SUBSCR);
|
||||
ADDOP(c, STORE_MAP);
|
||||
}
|
||||
break;
|
||||
case Set_kind:
|
||||
|
|
|
@ -66,7 +66,7 @@ extern time_t PyOS_GetLastModificationTime(char *, FILE *);
|
|||
Python 2.5c1: 62121 (fix wrong lnotab with for loops and
|
||||
storing constants that should have been removed)
|
||||
Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp)
|
||||
Python 2.6a0: 62141 (peephole optimizations)
|
||||
Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode)
|
||||
Python 3000: 3000
|
||||
3010 (removed UNARY_CONVERT)
|
||||
3020 (added BUILD_SET)
|
||||
|
@ -77,9 +77,10 @@ extern time_t PyOS_GetLastModificationTime(char *, FILE *);
|
|||
3070 (PEP 3109 raise changes)
|
||||
3080 (PEP 3137 make __file__ and __name__ unicode)
|
||||
3090 (kill str8 interning)
|
||||
3100 (merge from 2.6a0, see 62151)
|
||||
.
|
||||
*/
|
||||
#define MAGIC (3090 | ((long)'\r'<<16) | ((long)'\n'<<24))
|
||||
#define MAGIC (3100 | ((long)'\r'<<16) | ((long)'\n'<<24))
|
||||
|
||||
/* Magic word as global; note that _PyImport_Init() can change the
|
||||
value of this global to accommodate for alterations of how the
|
||||
|
|
|
@ -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));
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -2944,10 +2944,16 @@ else AC_MSG_ERROR([proper usage is --with-libc=STRING])
|
|||
fi],
|
||||
[AC_MSG_RESULT(default LIBC="$LIBC")])
|
||||
|
||||
# ************************************
|
||||
# * Check for mathematical functions *
|
||||
# ************************************
|
||||
# check for hypot() in math library
|
||||
LIBS_SAVE=$LIBS
|
||||
LIBS="$LIBS $LIBM"
|
||||
AC_REPLACE_FUNCS(hypot)
|
||||
|
||||
AC_CHECK_FUNCS(copysign isfinite isnan isinf)
|
||||
|
||||
LIBS=$LIBS_SAVE
|
||||
|
||||
# check for wchar.h
|
||||
|
|
|
@ -82,6 +82,9 @@
|
|||
/* Define to 1 if you have the <conio.h> header file. */
|
||||
#undef HAVE_CONIO_H
|
||||
|
||||
/* Define to 1 if you have the `copysign' function. */
|
||||
#undef HAVE_COPYSIGN
|
||||
|
||||
/* Define to 1 if you have the `ctermid' function. */
|
||||
#undef HAVE_CTERMID
|
||||
|
||||
|
@ -285,6 +288,15 @@
|
|||
/* Define to 1 if you have the <io.h> header file. */
|
||||
#undef HAVE_IO_H
|
||||
|
||||
/* Define to 1 if you have the `isfinite' function. */
|
||||
#undef HAVE_ISFINITE
|
||||
|
||||
/* Define to 1 if you have the `isinf' function. */
|
||||
#undef HAVE_ISINF
|
||||
|
||||
/* Define to 1 if you have the `isnan' function. */
|
||||
#undef HAVE_ISNAN
|
||||
|
||||
/* Define to 1 if you have the `kill' function. */
|
||||
#undef HAVE_KILL
|
||||
|
||||
|
@ -1034,3 +1046,4 @@
|
|||
|
||||
#endif /*Py_PYCONFIG_H*/
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue