aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Demo/imputil/knee.py5
-rwxr-xr-xDemo/pdist/cvslock.py1
-rw-r--r--Doc/Makefile2
-rw-r--r--Doc/Makefile.deps3
-rw-r--r--Doc/api/utilities.tex5
-rw-r--r--Doc/ext/extending.tex7
-rw-r--r--Doc/howto/functional.rst2
-rw-r--r--Doc/lib/lib.tex3
-rw-r--r--Doc/lib/libcodecs.tex2
-rw-r--r--Doc/lib/libfuncs.tex76
-rw-r--r--Doc/lib/libimp.tex5
-rw-r--r--Doc/lib/libitertools.tex8
-rw-r--r--Doc/lib/liblogging.tex7
-rw-r--r--Doc/lib/libmimewriter.tex80
-rw-r--r--Doc/lib/libmimify.tex94
-rw-r--r--Doc/lib/libpickle.tex6
-rw-r--r--Doc/lib/libposixfile.tex174
-rw-r--r--Doc/lib/libshlex.tex6
-rw-r--r--Doc/lib/libsubprocess.tex5
-rw-r--r--Doc/lib/libsys.tex36
-rw-r--r--Doc/lib/libtarfile.tex166
-rw-r--r--Doc/lib/libtypes.tex2
-rw-r--r--Doc/lib/libundoc.tex5
-rw-r--r--Doc/lib/libzipimport.tex5
-rw-r--r--Doc/mac/undoc.tex12
-rw-r--r--Doc/ref/ref3.tex11
-rw-r--r--Doc/tut/tut.tex4
-rw-r--r--Doc/whatsnew/whatsnew30.tex178
-rw-r--r--Grammar/Grammar2
-rw-r--r--Lib/MimeWriter.py181
-rw-r--r--Lib/SocketServer.py9
-rw-r--r--Lib/bsddb/test/test_thread.py6
-rw-r--r--Lib/ctypes/wintypes.py4
-rw-r--r--Lib/dis.py14
-rw-r--r--Lib/idlelib/StackViewer.py15
-rw-r--r--Lib/ihooks.py7
-rw-r--r--Lib/imputil.py20
-rw-r--r--Lib/logging/__init__.py2
-rw-r--r--Lib/logging/handlers.py3
-rwxr-xr-xLib/mimify.py464
-rw-r--r--Lib/optparse.py6
-rw-r--r--Lib/os.py5
-rw-r--r--Lib/plat-mac/buildtools.py3
-rw-r--r--Lib/plat-mac/cfmfile.py183
-rw-r--r--Lib/posixfile.py237
-rwxr-xr-xLib/pydoc.py11
-rw-r--r--Lib/sha.py11
-rw-r--r--Lib/shlex.py4
-rw-r--r--Lib/subprocess.py16
-rw-r--r--Lib/tarfile.py244
-rw-r--r--Lib/test/dis_module.py5
-rw-r--r--Lib/test/infinite_reload.py7
-rw-r--r--Lib/test/output/test_pkg2
-rwxr-xr-xLib/test/regrtest.py6
-rw-r--r--Lib/test/test_MimeWriter.py291
-rw-r--r--Lib/test/test___all__.py3
-rw-r--r--Lib/test/test_builtin.py8
-rw-r--r--Lib/test/test_dis.py18
-rw-r--r--Lib/test/test_doctest.py2
-rw-r--r--Lib/test/test_hmac.py10
-rw-r--r--Lib/test/test_import.py76
-rw-r--r--Lib/test/test_importhooks.py4
-rw-r--r--Lib/test/test_inspect.py2
-rw-r--r--Lib/test/test_optparse.py6
-rw-r--r--Lib/test/test_os.py14
-rw-r--r--Lib/test/test_pkg.py3
-rw-r--r--Lib/test/test_subprocess.py8
-rw-r--r--Lib/test/test_sundry.py5
-rw-r--r--Lib/test/test_syntax.py18
-rw-r--r--Lib/test/test_sys.py41
-rw-r--r--Lib/test/test_tarfile.py245
-rw-r--r--Lib/test/test_tokenize.py4
-rw-r--r--Lib/test/test_traceback.py47
-rw-r--r--Lib/test/test_urllib.py77
-rw-r--r--Lib/test/test_xmlrpc.py7
-rw-r--r--Lib/test/testtar.tarbin256000 -> 264704 bytes
-rw-r--r--Lib/textwrap.py8
-rw-r--r--Lib/unittest.py16
-rw-r--r--Lib/urllib.py5
-rw-r--r--Lib/uuid.py8
-rw-r--r--Lib/wsgiref/handlers.py17
-rw-r--r--Lib/xmlrpclib.py2
-rw-r--r--Misc/BeOS-setup.py14
-rw-r--r--Misc/NEWS12
-rwxr-xr-xMisc/build.sh1
-rw-r--r--Misc/cheatsheet61
-rw-r--r--Modules/Setup.dist5
-rw-r--r--Modules/_ctypes/callbacks.c4
-rw-r--r--Modules/md5.c381
-rw-r--r--Modules/md5.h91
-rw-r--r--Modules/md5module.c312
-rw-r--r--Modules/shamodule.c593
-rw-r--r--Modules/timing.h67
-rw-r--r--Modules/timingmodule.c58
-rw-r--r--Objects/abstract.c6
-rw-r--r--PC/WinMain.c4
-rw-r--r--PC/_winreg.c2
-rw-r--r--PC/dl_nt.c4
-rw-r--r--PC/os2emx/Makefile5
-rw-r--r--PC/os2emx/config.c6
-rw-r--r--PC/os2emx/python25.def17
-rw-r--r--PC/os2vacpp/makefile246
-rw-r--r--PC/os2vacpp/makefile.omk170
-rw-r--r--PC/pyconfig.h13
-rw-r--r--PC/winsound.c2
-rw-r--r--PCbuild/pythoncore.vcproj9
-rw-r--r--PCbuild8/pythoncore/pythoncore.vcproj4
-rw-r--r--Python/ast.c39
-rw-r--r--Python/bltinmodule.c12
-rw-r--r--Python/ceval.c9
-rw-r--r--Python/dynload_win.c2
-rw-r--r--Python/graminit.c122
-rw-r--r--Python/import.c5
-rw-r--r--Python/sysmodule.c35
-rw-r--r--README13
-rw-r--r--setup.py14
116 files changed, 1005 insertions, 4655 deletions
diff --git a/Demo/imputil/knee.py b/Demo/imputil/knee.py
index 64764da04da..26119e8e3e7 100644
--- a/Demo/imputil/knee.py
+++ b/Demo/imputil/knee.py
@@ -106,8 +106,7 @@ def import_module(partname, fqname, parent):
return m
-# Replacement for reload()
-def reload_hook(module):
+def reload(module):
name = module.__name__
if '.' not in name:
return import_module(name, name, None)
@@ -119,8 +118,6 @@ def reload_hook(module):
# Save the original hooks
original_import = __builtin__.__import__
-original_reload = __builtin__.reload
# Now install our hooks
__builtin__.__import__ = import_hook
-__builtin__.reload = reload_hook
diff --git a/Demo/pdist/cvslock.py b/Demo/pdist/cvslock.py
index 6484e716a29..c93c3f65526 100755
--- a/Demo/pdist/cvslock.py
+++ b/Demo/pdist/cvslock.py
@@ -262,7 +262,6 @@ def test():
rl.unlock()
finally:
print [1]
- sys.exc_traceback = None
print [2]
if rl:
rl.unlock()
diff --git a/Doc/Makefile b/Doc/Makefile
index 03a32d0ec2f..3da969099b9 100644
--- a/Doc/Makefile
+++ b/Doc/Makefile
@@ -122,7 +122,7 @@ EMACS= emacs
# The end of this should reflect the major/minor version numbers of
# the release:
-WHATSNEW=whatsnew26
+WHATSNEW=whatsnew30
# what's what
MANDVIFILES= paper-$(PAPER)/api.dvi paper-$(PAPER)/ext.dvi \
diff --git a/Doc/Makefile.deps b/Doc/Makefile.deps
index d0b06b3a4f1..e720220ff1d 100644
--- a/Doc/Makefile.deps
+++ b/Doc/Makefile.deps
@@ -171,7 +171,6 @@ LIBFILES= $(MANSTYLES) $(INDEXSTYLES) $(COMMONTEX) \
lib/libgdbm.tex \
lib/libtermios.tex \
lib/libfcntl.tex \
- lib/libposixfile.tex \
lib/libsyslog.tex \
lib/liblogging.tex \
lib/libpdb.tex \
@@ -192,7 +191,6 @@ LIBFILES= $(MANSTYLES) $(INDEXSTYLES) $(COMMONTEX) \
lib/libsgmllib.tex \
lib/librfc822.tex \
lib/libmimetools.tex \
- lib/libmimewriter.tex \
lib/libbinascii.tex \
lib/libmm.tex \
lib/libaudioop.tex \
@@ -235,7 +233,6 @@ LIBFILES= $(MANSTYLES) $(INDEXSTYLES) $(COMMONTEX) \
lib/libzipfile.tex \
lib/libpprint.tex \
lib/libcode.tex \
- lib/libmimify.tex \
lib/libre.tex \
lib/libuserdict.tex \
lib/libdis.tex \
diff --git a/Doc/api/utilities.tex b/Doc/api/utilities.tex
index 968ce4fead5..961f2004593 100644
--- a/Doc/api/utilities.tex
+++ b/Doc/api/utilities.tex
@@ -140,10 +140,7 @@ values from C values.
\end{cfuncdesc}
\begin{cfuncdesc}{PyObject*}{PyImport_ReloadModule}{PyObject *m}
- Reload a module. This is best described by referring to the
- built-in Python function \function{reload()}\bifuncindex{reload}, as
- the standard \function{reload()} function calls this function
- directly. Return a new reference to the reloaded module, or \NULL{}
+ Reload a module. Return a new reference to the reloaded module, or \NULL{}
with an exception set on failure (the module still exists in this
case).
\end{cfuncdesc}
diff --git a/Doc/ext/extending.tex b/Doc/ext/extending.tex
index 1f3e2d5b4fc..7796e9e1e42 100644
--- a/Doc/ext/extending.tex
+++ b/Doc/ext/extending.tex
@@ -399,12 +399,7 @@ compiled modules into multiple interpreters within a process (or
following a \cfunction{fork()} without an intervening
\cfunction{exec()}) can create problems for some extension modules.
Extension module authors should exercise caution when initializing
-internal data structures.
-Note also that the \function{reload()} function can be used with
-extension modules, and will call the module initialization function
-(\cfunction{initspam()} in the example), but will not load the module
-again if it was loaded from a dynamically loadable object file
-(\file{.so} on \UNIX, \file{.dll} on Windows).}
+internal data structures.}
A more substantial example module is included in the Python source
distribution as \file{Modules/xxmodule.c}. This file may be used as a
diff --git a/Doc/howto/functional.rst b/Doc/howto/functional.rst
index 98d1094784d..5a553392901 100644
--- a/Doc/howto/functional.rst
+++ b/Doc/howto/functional.rst
@@ -980,7 +980,7 @@ element.
that's a slice of the iterator. With a single ``stop`` argument,
it will return the first ``stop``
elements. If you supply a starting index, you'll get ``stop-start``
-elements, and if you supply a value for ``step`, elements will be
+elements, and if you supply a value for ``step``, elements will be
skipped accordingly. Unlike Python's string and list slicing, you
can't use negative values for ``start``, ``stop``, or ``step``.
diff --git a/Doc/lib/lib.tex b/Doc/lib/lib.tex
index cb8224612e4..792b00b05ed 100644
--- a/Doc/lib/lib.tex
+++ b/Doc/lib/lib.tex
@@ -146,8 +146,6 @@ and how to embed it in other applications.
\input{libmhlib}
\input{libmimetools}
\input{libmimetypes}
-\input{libmimewriter}
-\input{libmimify}
\input{libmultifile}
\input{librfc822}
@@ -265,7 +263,6 @@ and how to embed it in other applications.
\input{libpty}
\input{libfcntl}
\input{libpipes}
-\input{libposixfile}
\input{libresource}
\input{libnis}
\input{libsyslog}
diff --git a/Doc/lib/libcodecs.tex b/Doc/lib/libcodecs.tex
index 78fa24d0a87..a3399fba5b7 100644
--- a/Doc/lib/libcodecs.tex
+++ b/Doc/lib/libcodecs.tex
@@ -237,7 +237,7 @@ any other keyword argument) is passed through to the incremental encoder.
\begin{funcdesc}{iterdecode}{iterable, encoding\optional{, errors}}
Uses an incremental decoder to iteratively decode the input provided by
\var{iterable}. This function is a generator. \var{errors} (as well as
-any other keyword argument) is passed through to the incremental encoder.
+any other keyword argument) is passed through to the incremental decoder.
\versionadded{2.5}
\end{funcdesc}
diff --git a/Doc/lib/libfuncs.tex b/Doc/lib/libfuncs.tex
index 5e6e2a024d6..4f49e3380c7 100644
--- a/Doc/lib/libfuncs.tex
+++ b/Doc/lib/libfuncs.tex
@@ -890,82 +890,6 @@ class Parrot(object):
\end{verbatim}
\end{funcdesc}
-\begin{funcdesc}{reload}{module}
- Reload a previously imported \var{module}. The
- argument must be a module object, so it must have been successfully
- imported before. This is useful if you have edited the module
- source file using an external editor and want to try out the new
- version without leaving the Python interpreter. The return value is
- the module object (the same as the \var{module} argument).
-
- When \code{reload(module)} is executed:
-
-\begin{itemize}
-
- \item Python modules' code is recompiled and the module-level code
- reexecuted, defining a new set of objects which are bound to names in
- the module's dictionary. The \code{init} function of extension
- modules is not called a second time.
-
- \item As with all other objects in Python the old objects are only
- reclaimed after their reference counts drop to zero.
-
- \item The names in the module namespace are updated to point to
- any new or changed objects.
-
- \item Other references to the old objects (such as names external
- to the module) are not rebound to refer to the new objects and
- must be updated in each namespace where they occur if that is
- desired.
-
-\end{itemize}
-
- There are a number of other caveats:
-
- If a module is syntactically correct but its initialization fails,
- the first \keyword{import} statement for it does not bind its name
- locally, but does store a (partially initialized) module object in
- \code{sys.modules}. To reload the module you must first
- \keyword{import} it again (this will bind the name to the partially
- initialized module object) before you can \function{reload()} it.
-
- When a module is reloaded, its dictionary (containing the module's
- global variables) is retained. Redefinitions of names will override
- the old definitions, so this is generally not a problem. If the new
- version of a module does not define a name that was defined by the
- old version, the old definition remains. This feature can be used
- to the module's advantage if it maintains a global table or cache of
- objects --- with a \keyword{try} statement it can test for the
- table's presence and skip its initialization if desired:
-
-\begin{verbatim}
-try:
- cache
-except NameError:
- cache = {}
-\end{verbatim}
-
-
- It is legal though generally not very useful to reload built-in or
- dynamically loaded modules, except for \refmodule{sys},
- \refmodule[main]{__main__} and \refmodule[builtin]{__builtin__}. In
- many cases, however, extension modules are not designed to be
- initialized more than once, and may fail in arbitrary ways when
- reloaded.
-
- If a module imports objects from another module using \keyword{from}
- \ldots{} \keyword{import} \ldots{}, calling \function{reload()} for
- the other module does not redefine the objects imported from it ---
- one way around this is to re-execute the \keyword{from} statement,
- another is to use \keyword{import} and qualified names
- (\var{module}.\var{name}) instead.
-
- If a module instantiates instances of a class, reloading the module
- that defines the class does not affect the method definitions of the
- instances --- they continue to use the old class definition. The
- same is true for derived classes.
-\end{funcdesc}
-
\begin{funcdesc}{repr}{object}
Return a string containing a printable representation of an object.
This is the same value yielded by conversions (reverse quotes).
diff --git a/Doc/lib/libimp.tex b/Doc/lib/libimp.tex
index 53793096508..63966058000 100644
--- a/Doc/lib/libimp.tex
+++ b/Doc/lib/libimp.tex
@@ -69,8 +69,7 @@ this recipe recursively.
Load a module that was previously found by \function{find_module()} (or by
an otherwise conducted search yielding compatible results). This
function does more than importing the module: if the module was
-already imported, it is equivalent to a
-\function{reload()}\bifuncindex{reload}! The \var{name} argument
+already imported, it will reload the module! The \var{name} argument
indicates the full module name (including the package name, if this is
a submodule of a package). The \var{file} argument is an open file,
and \var{filename} is the corresponding file name; these can be
@@ -286,7 +285,7 @@ def __import__(name, globals=None, locals=None, fromlist=None):
\end{verbatim}
A more complete example that implements hierarchical module names and
-includes a \function{reload()}\bifuncindex{reload} function can be
+includes a \function{reload()} function can be
found in the module \module{knee}\refmodindex{knee}. The
\module{knee} module can be found in \file{Demo/imputil/} in the
Python source distribution.
diff --git a/Doc/lib/libitertools.tex b/Doc/lib/libitertools.tex
index 9bf8ab0c695..19bc826e772 100644
--- a/Doc/lib/libitertools.tex
+++ b/Doc/lib/libitertools.tex
@@ -138,6 +138,13 @@ by functions or loops that truncate the stream.
identity function and returns the element unchanged. Generally, the
iterable needs to already be sorted on the same key function.
+ The operation of \function{groupby()} is similar to the \code{uniq} filter
+ in \UNIX{}. It generates a break or new group every time the value
+ of the key function changes (which is why it is usually necessary
+ to have sorted the data using the same key function). That behavior
+ differs from SQL's GROUP BY which aggregates common elements regardless
+ of their input order.
+
The returned group is itself an iterator that shares the underlying
iterable with \function{groupby()}. Because the source is shared, when
the \function{groupby} object is advanced, the previous group is no
@@ -147,6 +154,7 @@ by functions or loops that truncate the stream.
\begin{verbatim}
groups = []
uniquekeys = []
+ data = sorted(data, key=keyfunc)
for k, g in groupby(data, keyfunc):
groups.append(list(g)) # Store group iterator as a list
uniquekeys.append(k)
diff --git a/Doc/lib/liblogging.tex b/Doc/lib/liblogging.tex
index 5783cbf44ec..c5c3e4e00c3 100644
--- a/Doc/lib/liblogging.tex
+++ b/Doc/lib/liblogging.tex
@@ -1208,8 +1208,11 @@ Returns a new instance of the \class{SysLogHandler} class intended to
communicate with a remote \UNIX{} machine whose address is given by
\var{address} in the form of a \code{(\var{host}, \var{port})}
tuple. If \var{address} is not specified, \code{('localhost', 514)} is
-used. The address is used to open a UDP socket. If \var{facility} is
-not specified, \constant{LOG_USER} is used.
+used. The address is used to open a UDP socket. An alternative to providing
+a \code{(\var{host}, \var{port})} tuple is providing an address as a string,
+for example "/dev/log". In this case, a Unix domain socket is used to send
+the message to the syslog. If \var{facility} is not specified,
+\constant{LOG_USER} is used.
\end{classdesc}
\begin{methoddesc}{close}{}
diff --git a/Doc/lib/libmimewriter.tex b/Doc/lib/libmimewriter.tex
deleted file mode 100644
index 74bd9bb465e..00000000000
--- a/Doc/lib/libmimewriter.tex
+++ /dev/null
@@ -1,80 +0,0 @@
-\section{\module{MimeWriter} ---
- Generic MIME file writer}
-
-\declaremodule{standard}{MimeWriter}
-
-\modulesynopsis{Generic MIME file writer.}
-\sectionauthor{Christopher G. Petrilli}{petrilli@amber.org}
-
-\deprecated{2.3}{The \refmodule{email} package should be used in
- preference to the \module{MimeWriter} module. This
- module is present only to maintain backward
- compatibility.}
-
-This module defines the class \class{MimeWriter}. The
-\class{MimeWriter} class implements a basic formatter for creating
-MIME multi-part files. It doesn't seek around the output file nor
-does it use large amounts of buffer space. You must write the parts
-out in the order that they should occur in the final
-file. \class{MimeWriter} does buffer the headers you add, allowing you
-to rearrange their order.
-
-\begin{classdesc}{MimeWriter}{fp}
-Return a new instance of the \class{MimeWriter} class. The only
-argument passed, \var{fp}, is a file object to be used for
-writing. Note that a \class{StringIO} object could also be used.
-\end{classdesc}
-
-
-\subsection{MimeWriter Objects \label{MimeWriter-objects}}
-
-
-\class{MimeWriter} instances have the following methods:
-
-\begin{methoddesc}[MimeWriter]{addheader}{key, value\optional{, prefix}}
-Add a header line to the MIME message. The \var{key} is the name of
-the header, where the \var{value} obviously provides the value of the
-header. The optional argument \var{prefix} determines where the header
-is inserted; \samp{0} means append at the end, \samp{1} is insert at
-the start. The default is to append.
-\end{methoddesc}
-
-\begin{methoddesc}[MimeWriter]{flushheaders}{}
-Causes all headers accumulated so far to be written out (and
-forgotten). This is useful if you don't need a body part at all,
-e.g.\ for a subpart of type \mimetype{message/rfc822} that's (mis)used
-to store some header-like information.
-\end{methoddesc}
-
-\begin{methoddesc}[MimeWriter]{startbody}{ctype\optional{, plist\optional{, prefix}}}
-Returns a file-like object which can be used to write to the
-body of the message. The content-type is set to the provided
-\var{ctype}, and the optional parameter \var{plist} provides
-additional parameters for the content-type declaration. \var{prefix}
-functions as in \method{addheader()} except that the default is to
-insert at the start.
-\end{methoddesc}
-
-\begin{methoddesc}[MimeWriter]{startmultipartbody}{subtype\optional{,
- boundary\optional{, plist\optional{, prefix}}}}
-Returns a file-like object which can be used to write to the
-body of the message. Additionally, this method initializes the
-multi-part code, where \var{subtype} provides the multipart subtype,
-\var{boundary} may provide a user-defined boundary specification, and
-\var{plist} provides optional parameters for the subtype.
-\var{prefix} functions as in \method{startbody()}. Subparts should be
-created using \method{nextpart()}.
-\end{methoddesc}
-
-\begin{methoddesc}[MimeWriter]{nextpart}{}
-Returns a new instance of \class{MimeWriter} which represents an
-individual part in a multipart message. This may be used to write the
-part as well as used for creating recursively complex multipart
-messages. The message must first be initialized with
-\method{startmultipartbody()} before using \method{nextpart()}.
-\end{methoddesc}
-
-\begin{methoddesc}[MimeWriter]{lastpart}{}
-This is used to designate the last part of a multipart message, and
-should \emph{always} be used when writing multipart messages.
-\end{methoddesc}
diff --git a/Doc/lib/libmimify.tex b/Doc/lib/libmimify.tex
deleted file mode 100644
index d99567ab3bd..00000000000
--- a/Doc/lib/libmimify.tex
+++ /dev/null
@@ -1,94 +0,0 @@
-\section{\module{mimify} ---
- MIME processing of mail messages}
-
-\declaremodule{standard}{mimify}
-\modulesynopsis{Mimification and unmimification of mail messages.}
-
-\deprecated{2.3}{The \refmodule{email} package should be used in
- preference to the \module{mimify} module. This
- module is present only to maintain backward
- compatibility.}
-
-The \module{mimify} module defines two functions to convert mail messages to
-and from MIME format. The mail message can be either a simple message
-or a so-called multipart message. Each part is treated separately.
-Mimifying (a part of) a message entails encoding the message as
-quoted-printable if it contains any characters that cannot be
-represented using 7-bit \ASCII. Unmimifying (a part of) a message
-entails undoing the quoted-printable encoding. Mimify and unmimify
-are especially useful when a message has to be edited before being
-sent. Typical use would be:
-
-\begin{verbatim}
-unmimify message
-edit message
-mimify message
-send message
-\end{verbatim}
-
-The modules defines the following user-callable functions and
-user-settable variables:
-
-\begin{funcdesc}{mimify}{infile, outfile}
-Copy the message in \var{infile} to \var{outfile}, converting parts to
-quoted-printable and adding MIME mail headers when necessary.
-\var{infile} and \var{outfile} can be file objects (actually, any
-object that has a \method{readline()} method (for \var{infile}) or a
-\method{write()} method (for \var{outfile})) or strings naming the files.
-If \var{infile} and \var{outfile} are both strings, they may have the
-same value.
-\end{funcdesc}
-
-\begin{funcdesc}{unmimify}{infile, outfile\optional{, decode_base64}}
-Copy the message in \var{infile} to \var{outfile}, decoding all
-quoted-printable parts. \var{infile} and \var{outfile} can be file
-objects (actually, any object that has a \method{readline()} method (for
-\var{infile}) or a \method{write()} method (for \var{outfile})) or strings
-naming the files. If \var{infile} and \var{outfile} are both strings,
-they may have the same value.
-If the \var{decode_base64} argument is provided and tests true, any
-parts that are coded in the base64 encoding are decoded as well.
-\end{funcdesc}
-
-\begin{funcdesc}{mime_decode_header}{line}
-Return a decoded version of the encoded header line in \var{line}.
-This only supports the ISO 8859-1 charset (Latin-1).
-\end{funcdesc}
-
-\begin{funcdesc}{mime_encode_header}{line}
-Return a MIME-encoded version of the header line in \var{line}.
-\end{funcdesc}
-
-\begin{datadesc}{MAXLEN}
-By default, a part will be encoded as quoted-printable when it
-contains any non-\ASCII{} characters (characters with the 8th bit
-set), or if there are any lines longer than \constant{MAXLEN} characters
-(default value 200).
-\end{datadesc}
-
-\begin{datadesc}{CHARSET}
-When not specified in the mail headers, a character set must be filled
-in. The string used is stored in \constant{CHARSET}, and the default
-value is ISO-8859-1 (also known as Latin1 (latin-one)).
-\end{datadesc}
-
-This module can also be used from the command line. Usage is as
-follows:
-\begin{verbatim}
-mimify.py -e [-l length] [infile [outfile]]
-mimify.py -d [-b] [infile [outfile]]
-\end{verbatim}
-to encode (mimify) and decode (unmimify) respectively. \var{infile}
-defaults to standard input, \var{outfile} defaults to standard output.
-The same file can be specified for input and output.
-
-If the \strong{-l} option is given when encoding, if there are any lines
-longer than the specified \var{length}, the containing part will be
-encoded.
-
-If the \strong{-b} option is given when decoding, any base64 parts will
-be decoded as well.
-
-\begin{seealso}
- \seemodule{quopri}{Encode and decode MIME quoted-printable files.}
-\end{seealso}
diff --git a/Doc/lib/libpickle.tex b/Doc/lib/libpickle.tex
index 3290641232f..0c4cd98227a 100644
--- a/Doc/lib/libpickle.tex
+++ b/Doc/lib/libpickle.tex
@@ -799,7 +799,7 @@ class TextReader:
del odict['fh'] # remove filehandle entry
return odict
- def __setstate__(self,dict):
+ def __setstate__(self, dict):
fh = open(dict['file']) # reopen file
count = dict['lineno'] # read from file...
while count: # until line count is restored
@@ -820,7 +820,7 @@ A sample usage might be something like this:
... obj.readline()
'7: class TextReader:'
>>> import pickle
->>> pickle.dump(obj,open('save.p','w'))
+>>> pickle.dump(obj,open('save.p', 'wb'))
\end{verbatim}
If you want to see that \refmodule{pickle} works across Python
@@ -829,7 +829,7 @@ follows can happen from either the same process or a new process.
\begin{verbatim}
>>> import pickle
->>> reader = pickle.load(open('save.p'))
+>>> reader = pickle.load(open('save.p', 'rb'))
>>> reader.readline()
'8: "Print and number lines in a text file."'
\end{verbatim}
diff --git a/Doc/lib/libposixfile.tex b/Doc/lib/libposixfile.tex
deleted file mode 100644
index 5c86f3e3879..00000000000
--- a/Doc/lib/libposixfile.tex
+++ /dev/null
@@ -1,174 +0,0 @@
-% Manual text and implementation by Jaap Vermeulen
-\section{\module{posixfile} ---
- File-like objects with locking support}
-
-\declaremodule{builtin}{posixfile}
- \platform{Unix}
-\modulesynopsis{A file-like object with support for locking.}
-\moduleauthor{Jaap Vermeulen}{}
-\sectionauthor{Jaap Vermeulen}{}
-
-
-\indexii{\POSIX}{file object}
-
-\deprecated{1.5}{The locking operation that this module provides is
-done better and more portably by the
-\function{\refmodule{fcntl}.lockf()} call.
-\withsubitem{(in module fcntl)}{\ttindex{lockf()}}}
-
-This module implements some additional functionality over the built-in
-file objects. In particular, it implements file locking, control over
-the file flags, and an easy interface to duplicate the file object.
-The module defines a new file object, the posixfile object. It
-has all the standard file object methods and adds the methods
-described below. This module only works for certain flavors of
-\UNIX, since it uses \function{fcntl.fcntl()} for file locking.%
-\withsubitem{(in module fcntl)}{\ttindex{fcntl()}}
-
-To instantiate a posixfile object, use the \function{open()} function
-in the \module{posixfile} module. The resulting object looks and
-feels roughly the same as a standard file object.
-
-The \module{posixfile} module defines the following constants:
-
-
-\begin{datadesc}{SEEK_SET}
-Offset is calculated from the start of the file.
-\end{datadesc}
-
-\begin{datadesc}{SEEK_CUR}
-Offset is calculated from the current position in the file.
-\end{datadesc}
-
-\begin{datadesc}{SEEK_END}
-Offset is calculated from the end of the file.
-\end{datadesc}
-
-The \module{posixfile} module defines the following functions:
-
-
-\begin{funcdesc}{open}{filename\optional{, mode\optional{, bufsize}}}
- Create a new posixfile object with the given filename and mode. The
- \var{filename}, \var{mode} and \var{bufsize} arguments are
- interpreted the same way as by the built-in \function{open()}
- function.
-\end{funcdesc}
-
-\begin{funcdesc}{fileopen}{fileobject}
- Create a new posixfile object with the given standard file object.
- The resulting object has the same filename and mode as the original
- file object.
-\end{funcdesc}
-
-The posixfile object defines the following additional methods:
-
-\begin{methoddesc}[posixfile]{lock}{fmt, \optional{len\optional{, start\optional{, whence}}}}
- Lock the specified section of the file that the file object is
- referring to. The format is explained
- below in a table. The \var{len} argument specifies the length of the
- section that should be locked. The default is \code{0}. \var{start}
- specifies the starting offset of the section, where the default is
- \code{0}. The \var{whence} argument specifies where the offset is
- relative to. It accepts one of the constants \constant{SEEK_SET},
- \constant{SEEK_CUR} or \constant{SEEK_END}. The default is
- \constant{SEEK_SET}. For more information about the arguments refer
- to the \manpage{fcntl}{2} manual page on your system.
-\end{methoddesc}
-
-\begin{methoddesc}[posixfile]{flags}{\optional{flags}}
- Set the specified flags for the file that the file object is referring
- to. The new flags are ORed with the old flags, unless specified
- otherwise. The format is explained below in a table. Without
- the \var{flags} argument
- a string indicating the current flags is returned (this is
- the same as the \samp{?} modifier). For more information about the
- flags refer to the \manpage{fcntl}{2} manual page on your system.
-\end{methoddesc}
-
-\begin{methoddesc}[posixfile]{dup}{}
- Duplicate the file object and the underlying file pointer and file
- descriptor. The resulting object behaves as if it were newly
- opened.
-\end{methoddesc}
-
-\begin{methoddesc}[posixfile]{dup2}{fd}
- Duplicate the file object and the underlying file pointer and file
- descriptor. The new object will have the given file descriptor.
- Otherwise the resulting object behaves as if it were newly opened.
-\end{methoddesc}
-
-\begin{methoddesc}[posixfile]{file}{}
- Return the standard file object that the posixfile object is based
- on. This is sometimes necessary for functions that insist on a
- standard file object.
-\end{methoddesc}
-
-All methods raise \exception{IOError} when the request fails.
-
-Format characters for the \method{lock()} method have the following
-meaning:
-
-\begin{tableii}{c|l}{samp}{Format}{Meaning}
- \lineii{u}{unlock the specified region}
- \lineii{r}{request a read lock for the specified section}
- \lineii{w}{request a write lock for the specified section}
-\end{tableii}
-
-In addition the following modifiers can be added to the format:
-
-\begin{tableiii}{c|l|c}{samp}{Modifier}{Meaning}{Notes}
- \lineiii{|}{wait until the lock has been granted}{}
- \lineiii{?}{return the first lock conflicting with the requested lock, or
- \code{None} if there is no conflict.}{(1)}
-\end{tableiii}
-
-\noindent
-Note:
-
-\begin{description}
-\item[(1)] The lock returned is in the format \code{(\var{mode}, \var{len},
-\var{start}, \var{whence}, \var{pid})} where \var{mode} is a character
-representing the type of lock ('r' or 'w'). This modifier prevents a
-request from being granted; it is for query purposes only.
-\end{description}
-
-Format characters for the \method{flags()} method have the following
-meanings:
-
-\begin{tableii}{c|l}{samp}{Format}{Meaning}
- \lineii{a}{append only flag}
- \lineii{c}{close on exec flag}
- \lineii{n}{no delay flag (also called non-blocking flag)}
- \lineii{s}{synchronization flag}
-\end{tableii}
-
-In addition the following modifiers can be added to the format:
-
-\begin{tableiii}{c|l|c}{samp}{Modifier}{Meaning}{Notes}
- \lineiii{!}{turn the specified flags 'off', instead of the default 'on'}{(1)}
- \lineiii{=}{replace the flags, instead of the default 'OR' operation}{(1)}
- \lineiii{?}{return a string in which the characters represent the flags that
- are set.}{(2)}
-\end{tableiii}
-
-\noindent
-Notes:
-
-\begin{description}
-\item[(1)] The \samp{!} and \samp{=} modifiers are mutually exclusive.
-
-\item[(2)] This string represents the flags after they may have been altered
-by the same call.
-\end{description}
-
-Examples:
-
-\begin{verbatim}
-import posixfile
-
-file = posixfile.open('/tmp/test', 'w')
-file.lock('w|')
-...
-file.lock('u')
-file.close()
-\end{verbatim}
diff --git a/Doc/lib/libshlex.tex b/Doc/lib/libshlex.tex
index 451615f886e..23babd3ccbe 100644
--- a/Doc/lib/libshlex.tex
+++ b/Doc/lib/libshlex.tex
@@ -19,13 +19,15 @@ files for Python applications) or for parsing quoted strings.
The \module{shlex} module defines the following functions:
-\begin{funcdesc}{split}{s\optional{, comments}}
+\begin{funcdesc}{split}{s\optional{, comments\optional{, posix}}}
Split the string \var{s} using shell-like syntax. If \var{comments} is
\constant{False} (the default), the parsing of comments in the given
string will be disabled (setting the \member{commenters} member of the
\class{shlex} instance to the empty string). This function operates
-in \POSIX{} mode.
+in \POSIX{} mode by default, but uses non-\POSIX{} mode if the
+\var{posix} argument is false.
\versionadded{2.3}
+\versionchanged[Added the \var{posix} parameter]{2.6}
\end{funcdesc}
The \module{shlex} module defines the following class:
diff --git a/Doc/lib/libsubprocess.tex b/Doc/lib/libsubprocess.tex
index 35ab4d02b15..dc386bfb4e7 100644
--- a/Doc/lib/libsubprocess.tex
+++ b/Doc/lib/libsubprocess.tex
@@ -87,7 +87,10 @@ called in the child process just before the child is executed.
If \var{close_fds} is true, all file descriptors except \constant{0},
\constant{1} and \constant{2} will be closed before the child process is
-executed. (\UNIX{} only)
+executed. (\UNIX{} only). Or, on Windows, if \var{close_fds} is true
+then no handles will be inherited by the child process. Note that on
+Windows, you cannot set \var{close_fds} to true and also redirect the
+standard handles by setting \var{stdin}, \var{stdout} or \var{stderr}.
If \var{shell} is \constant{True}, the specified command will be
executed through the shell.
diff --git a/Doc/lib/libsys.tex b/Doc/lib/libsys.tex
index 12846680e97..4ab32472be1 100644
--- a/Doc/lib/libsys.tex
+++ b/Doc/lib/libsys.tex
@@ -132,11 +132,6 @@ It is always available.
encapsulates the call stack at the point where the exception
originally occurred. \obindex{traceback}
- If \function{exc_clear()} is called, this function will return three
- \code{None} values until either another exception is raised in the
- current thread or the execution stack returns to a frame where
- another exception is being handled.
-
\warning{Assigning the \var{traceback} return value to a
local variable in a function that is handling an exception will
cause a circular reference. This will prevent anything referenced
@@ -153,32 +148,6 @@ It is always available.
efficient to avoid creating cycles.}
\end{funcdesc}
-\begin{funcdesc}{exc_clear}{}
- This function clears all information relating to the current or last
- exception that occurred in the current thread. After calling this
- function, \function{exc_info()} will return three \code{None} values until
- another exception is raised in the current thread or the execution stack
- returns to a frame where another exception is being handled.
-
- This function is only needed in only a few obscure situations. These
- include logging and error handling systems that report information on the
- last or current exception. This function can also be used to try to free
- resources and trigger object finalization, though no guarantee is made as
- to what objects will be freed, if any.
-\versionadded{2.3}
-\end{funcdesc}
-
-\begin{datadesc}{exc_type}
-\dataline{exc_value}
-\dataline{exc_traceback}
-\deprecated {1.5}
- {Use \function{exc_info()} instead.}
- Since they are global variables, they are not specific to the
- current thread, so their use is not safe in a multi-threaded
- program. When no exception is being handled, \code{exc_type} is set
- to \code{None} and the other two are undefined.
-\end{datadesc}
-
\begin{datadesc}{exec_prefix}
A string giving the site-specific directory prefix where the
platform-dependent Python files are installed; by default, this is
@@ -377,10 +346,7 @@ else:
\begin{datadesc}{modules}
This is a dictionary that maps module names to modules which have
already been loaded. This can be manipulated to force reloading of
- modules and other tricks. Note that removing a module from this
- dictionary is \emph{not} the same as calling
- \function{reload()}\bifuncindex{reload} on the corresponding module
- object.
+ modules and other tricks.
\end{datadesc}
\begin{datadesc}{path}
diff --git a/Doc/lib/libtarfile.tex b/Doc/lib/libtarfile.tex
index 73c35edabd3..54683a77079 100644
--- a/Doc/lib/libtarfile.tex
+++ b/Doc/lib/libtarfile.tex
@@ -133,24 +133,20 @@ Some facts and figures:
\versionadded{2.6}
\end{excdesc}
+Each of the following constants defines a tar archive format that the
+\module{tarfile} module is able to create. See section \ref{tar-formats} for
+details.
+
\begin{datadesc}{USTAR_FORMAT}
- \POSIX{}.1-1988 (ustar) format. It supports filenames up to a length of
- at best 256 characters and linknames up to 100 characters. The maximum
- file size is 8 gigabytes. This is an old and limited but widely
- supported format.
+ \POSIX{}.1-1988 (ustar) format.
\end{datadesc}
\begin{datadesc}{GNU_FORMAT}
- GNU tar format. It supports arbitrarily long filenames and linknames and
- files bigger than 8 gigabytes. It is the defacto standard on GNU/Linux
- systems.
+ GNU tar format.
\end{datadesc}
\begin{datadesc}{PAX_FORMAT}
- \POSIX{}.1-2001 (pax) format. It is the most flexible format with
- virtually no limits. It supports long filenames and linknames, large files
- and stores pathnames in a portable way. However, not all tar
- implementations today are able to handle pax archives properly.
+ \POSIX{}.1-2001 (pax) format.
\end{datadesc}
\begin{datadesc}{DEFAULT_FORMAT}
@@ -175,15 +171,15 @@ Some facts and figures:
The \class{TarFile} object provides an interface to a tar archive. A tar
archive is a sequence of blocks. An archive member (a stored file) is made up
-of a header block followed by data blocks. It is possible, to store a file in a
+of a header block followed by data blocks. It is possible to store a file in a
tar archive several times. Each archive member is represented by a
\class{TarInfo} object, see \citetitle{TarInfo Objects} (section
\ref{tarinfo-objects}) for details.
\begin{classdesc}{TarFile}{name=None, mode='r', fileobj=None,
format=DEFAULT_FORMAT, tarinfo=TarInfo, dereference=False,
- ignore_zeros=False, encoding=None, pax_headers=None, debug=0,
- errorlevel=0}
+ ignore_zeros=False, encoding=None, errors=None, pax_headers=None,
+ debug=0, errorlevel=0}
All following arguments are optional and can be accessed as instance
attributes as well.
@@ -231,18 +227,14 @@ tar archive several times. Each archive member is represented by a
If \code{2}, all \emph{non-fatal} errors are raised as \exception{TarError}
exceptions as well.
- The \var{encoding} argument defines the local character encoding. It
- defaults to the value from \function{sys.getfilesystemencoding()} or if
- that is \code{None} to \code{"ascii"}. \var{encoding} is used only in
- connection with the pax format which stores text data in \emph{UTF-8}. If
- it is not set correctly, character conversion will fail with a
- \exception{UnicodeError}.
+ The \var{encoding} and \var{errors} arguments control the way strings are
+ converted to unicode objects and vice versa. The default settings will work
+ for most users. See section \ref{tar-unicode} for in-depth information.
\versionadded{2.6}
- The \var{pax_headers} argument must be a dictionary whose elements are
- either unicode objects, numbers or strings that can be decoded to unicode
- using \var{encoding}. This information will be added to the archive as a
- pax global header.
+ The \var{pax_headers} argument is an optional dictionary of unicode strings
+ which will be added as a pax global header if \var{format} is
+ \constant{PAX_FORMAT}.
\versionadded{2.6}
\end{classdesc}
@@ -287,7 +279,7 @@ tar archive several times. Each archive member is represented by a
Extract all members from the archive to the current working directory
or directory \var{path}. If optional \var{members} is given, it must be
a subset of the list returned by \method{getmembers()}.
- Directory informations like owner, modification time and permissions are
+ Directory information like owner, modification time and permissions are
set after all members have been extracted. This is done to work around two
problems: A directory's modification time is reset each time a file is
created in it. And, if a directory's permissions do not allow writing,
@@ -365,6 +357,11 @@ tar archive several times. Each archive member is represented by a
\deprecated{2.6}{Use the \member{format} attribute instead.}
\end{memberdesc}
+\begin{memberdesc}{pax_headers}
+ A dictionary containing key-value pairs of pax global headers.
+ \versionadded{2.6}
+\end{memberdesc}
+
%-----------------
% TarInfo Objects
%-----------------
@@ -384,8 +381,8 @@ the file's data itself.
Create a \class{TarInfo} object.
\end{classdesc}
-\begin{methoddesc}{frombuf}{}
- Create and return a \class{TarInfo} object from a string buffer.
+\begin{methoddesc}{frombuf}{buf}
+ Create and return a \class{TarInfo} object from string buffer \var{buf}.
\versionadded[Raises \exception{HeaderError} if the buffer is
invalid.]{2.6}
\end{methoddesc}
@@ -396,10 +393,11 @@ the file's data itself.
\versionadded{2.6}
\end{methoddesc}
-\begin{methoddesc}{tobuf}{\optional{format}}
- Create a string buffer from a \class{TarInfo} object. See
- \class{TarFile}'s \member{format} argument for information.
- \versionchanged[The \var{format} parameter]{2.6}
+\begin{methoddesc}{tobuf}{\optional{format\optional{, encoding
+ \optional{, errors}}}}
+ Create a string buffer from a \class{TarInfo} object. For information
+ on the arguments see the constructor of the \class{TarFile} class.
+ \versionchanged[The arguments were added]{2.6}
\end{methoddesc}
A \code{TarInfo} object has the following public data attributes:
@@ -452,6 +450,12 @@ A \code{TarInfo} object has the following public data attributes:
Group name.
\end{memberdesc}
+\begin{memberdesc}{pax_headers}
+ A dictionary containing key-value pairs of an associated pax
+ extended header.
+ \versionadded{2.6}
+\end{memberdesc}
+
A \class{TarInfo} object also provides some convenient query methods:
\begin{methoddesc}{isfile}{}
@@ -554,3 +558,103 @@ for tarinfo in tar:
tar.extract(tarinfo)
tar.close()
\end{verbatim}
+
+%------------
+% Tar format
+%------------
+
+\subsection{Supported tar formats \label{tar-formats}}
+
+There are three tar formats that can be created with the \module{tarfile}
+module:
+
+\begin{itemize}
+
+\item
+The \POSIX{}.1-1988 ustar format (\constant{USTAR_FORMAT}). It supports
+filenames up to a length of at best 256 characters and linknames up to 100
+characters. The maximum file size is 8 gigabytes. This is an old and limited
+but widely supported format.
+
+\item
+The GNU tar format (\constant{GNU_FORMAT}). It supports long filenames and
+linknames, files bigger than 8 gigabytes and sparse files. It is the de facto
+standard on GNU/Linux systems. \module{tarfile} fully supports the GNU tar
+extensions for long names, sparse file support is read-only.
+
+\item
+The \POSIX{}.1-2001 pax format (\constant{PAX_FORMAT}). It is the most
+flexible format with virtually no limits. It supports long filenames and
+linknames, large files and stores pathnames in a portable way. However, not
+all tar implementations today are able to handle pax archives properly.
+
+The \emph{pax} format is an extension to the existing \emph{ustar} format. It
+uses extra headers for information that cannot be stored otherwise. There are
+two flavours of pax headers: Extended headers only affect the subsequent file
+header, global headers are valid for the complete archive and affect all
+following files. All the data in a pax header is encoded in \emph{UTF-8} for
+portability reasons.
+
+\end{itemize}
+
+There are some more variants of the tar format which can be read, but not
+created:
+
+\begin{itemize}
+
+\item
+The ancient V7 format. This is the first tar format from \UNIX{} Seventh
+Edition, storing only regular files and directories. Names must not be longer
+than 100 characters, there is no user/group name information. Some archives
+have miscalculated header checksums in case of fields with non-\ASCII{}
+characters.
+
+\item
+The SunOS tar extended format. This format is a variant of the \POSIX{}.1-2001
+pax format, but is not compatible.
+
+\end{itemize}
+
+%----------------
+% Unicode issues
+%----------------
+
+\subsection{Unicode issues \label{tar-unicode}}
+
+The tar format was originally conceived to make backups on tape drives with the
+main focus on preserving file system information. Nowadays tar archives are
+commonly used for file distribution and exchanging archives over networks. One
+problem of the original format (that all other formats are merely variants of)
+is that there is no concept of supporting different character encodings.
+For example, an ordinary tar archive created on a \emph{UTF-8} system cannot be
+read correctly on a \emph{Latin-1} system if it contains non-\ASCII{}
+characters. Names (i.e. filenames, linknames, user/group names) containing
+these characters will appear damaged. Unfortunately, there is no way to
+autodetect the encoding of an archive.
+
+The pax format was designed to solve this problem. It stores non-\ASCII{} names
+using the universal character encoding \emph{UTF-8}. When a pax archive is
+read, these \emph{UTF-8} names are converted to the encoding of the local
+file system.
+
+The details of unicode conversion are controlled by the \var{encoding} and
+\var{errors} keyword arguments of the \class{TarFile} class.
+
+The default value for \var{encoding} is the local character encoding. It is
+deduced from \function{sys.getfilesystemencoding()} and
+\function{sys.getdefaultencoding()}. In read mode, \var{encoding} is used
+exclusively to convert unicode names from a pax archive to strings in the local
+character encoding. In write mode, the use of \var{encoding} depends on the
+chosen archive format. In case of \constant{PAX_FORMAT}, input names that
+contain non-\ASCII{} characters need to be decoded before being stored as
+\emph{UTF-8} strings. The other formats do not make use of \var{encoding}
+unless unicode objects are used as input names. These are converted to
+8-bit character strings before they are added to the archive.
+
+The \var{errors} argument defines how characters are treated that cannot be
+converted to or from \var{encoding}. Possible values are listed in section
+\ref{codec-base-classes}. In read mode, there is an additional scheme
+\code{'utf-8'} which means that bad characters are replaced by their
+\emph{UTF-8} representation. This is the default scheme. In write mode the
+default value for \var{errors} is \code{'strict'} to ensure that name
+information is not altered unnoticed.
diff --git a/Doc/lib/libtypes.tex b/Doc/lib/libtypes.tex
index 455430570f3..2b143b96831 100644
--- a/Doc/lib/libtypes.tex
+++ b/Doc/lib/libtypes.tex
@@ -163,7 +163,7 @@ The type of \code{Ellipsis}.
\begin{datadesc}{TracebackType}
The type of traceback objects such as found in
-\code{sys.exc_traceback}.
+\code{sys.exc_info()[2]}.
\end{datadesc}
\begin{datadesc}{FrameType}
diff --git a/Doc/lib/libundoc.tex b/Doc/lib/libundoc.tex
index 041e3dd07a6..146ba7fcd9f 100644
--- a/Doc/lib/libundoc.tex
+++ b/Doc/lib/libundoc.tex
@@ -88,7 +88,6 @@ installing the shared object if using dynamically-loaded extensions.
% XXX need Windows instructions!
\begin{description}
-\item[\module{timing}]
---- Measure time intervals to high resolution (use \function{time.clock()}
- instead).
+\item
+--- This section should be empty for Python 3.0.
\end{description}
diff --git a/Doc/lib/libzipimport.tex b/Doc/lib/libzipimport.tex
index 098e788161f..8ebe3c5b646 100644
--- a/Doc/lib/libzipimport.tex
+++ b/Doc/lib/libzipimport.tex
@@ -29,11 +29,6 @@ by adding the corresponding \file{.pyc} or \file{.pyo} file, meaning that
if a ZIP archive doesn't contain \file{.pyc} files, importing may be rather
slow.
-Using the built-in \function{reload()} function will
-fail if called on a module loaded from a ZIP archive; it is unlikely that
-\function{reload()} would be needed, since this would imply that the ZIP
-has been altered during runtime.
-
The available attributes of this module are:
\begin{excdesc}{ZipImportError}
diff --git a/Doc/mac/undoc.tex b/Doc/mac/undoc.tex
index 96e490084eb..adbf5894301 100644
--- a/Doc/mac/undoc.tex
+++ b/Doc/mac/undoc.tex
@@ -23,18 +23,6 @@ touch with
\deprecated{2.4}{}
-\section{\module{cfmfile} --- Code Fragment Resource module}
-\declaremodule{standard}{cfmfile}
- \platform{Mac}
-\modulesynopsis{Code Fragment Resource module.}
-
-\module{cfmfile} is a module that understands Code Fragments and the
-accompanying ``cfrg'' resources. It can parse them and merge them, and is
-used by BuildApplication to combine all plugin modules to a single
-executable.
-
-\deprecated{2.4}{}
-
\section{\module{icopen} --- Internet Config replacement for \method{open()}}
\declaremodule{standard}{icopen}
\platform{Mac}
diff --git a/Doc/ref/ref3.tex b/Doc/ref/ref3.tex
index d8cf888fc0e..66aa2733160 100644
--- a/Doc/ref/ref3.tex
+++ b/Doc/ref/ref3.tex
@@ -977,10 +977,8 @@ level a traceback object is inserted in front of the current
traceback. When an exception handler is entered, the stack trace is
made available to the program.
(See section~\ref{try}, ``The \code{try} statement.'')
-It is accessible as \code{sys.exc_traceback}, and also as the third
-item of the tuple returned by \code{sys.exc_info()}. The latter is
-the preferred interface, since it works correctly when the program is
-using multiple threads.
+It is accessible as the third
+item of the tuple returned by \code{sys.exc_info()}.
When the program contains no suitable handler, the stack trace is written
(nicely formatted) to the standard error stream; if the interpreter is
interactive, it is also made available to the user as
@@ -994,7 +992,6 @@ interactive, it is also made available to the user as
\ttindex{exc_traceback}
\ttindex{last_traceback}}
\ttindex{sys.exc_info}
-\ttindex{sys.exc_traceback}
\ttindex{sys.last_traceback}
Special read-only attributes: \member{tb_next} is the next level in the
@@ -1198,13 +1195,13 @@ reference count of an object from going to zero include: circular
references between objects (e.g., a doubly-linked list or a tree data
structure with parent and child pointers); a reference to the object
on the stack frame of a function that caught an exception (the
-traceback stored in \code{sys.exc_traceback} keeps the stack frame
+traceback stored in \code{sys.exc_info()[2]} keeps the stack frame
alive); or a reference to the object on the stack frame that raised an
unhandled exception in interactive mode (the traceback stored in
\code{sys.last_traceback} keeps the stack frame alive). The first
situation can only be remedied by explicitly breaking the cycles; the
latter two situations can be resolved by storing \code{None} in
-\code{sys.exc_traceback} or \code{sys.last_traceback}. Circular
+\code{sys.last_traceback}. Circular
references which are garbage are detected when the option cycle
detector is enabled (it's on by default), but can only be cleaned up
if there are no Python-level \method{__del__()} methods involved.
diff --git a/Doc/tut/tut.tex b/Doc/tut/tut.tex
index 018f4ba4014..4ed1b838a5f 100644
--- a/Doc/tut/tut.tex
+++ b/Doc/tut/tut.tex
@@ -2653,7 +2653,7 @@ a module defines. It returns a sorted list of strings:
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__stderr__',
'__stdin__', '__stdout__', '_getframe', 'api_version', 'argv',
'builtin_module_names', 'byteorder', 'callstats', 'copyright',
- 'displayhook', 'exc_clear', 'exc_info', 'exc_type', 'excepthook',
+ 'displayhook', 'exc_info', 'excepthook',
'exec_prefix', 'executable', 'exit', 'getdefaultencoding', 'getdlopenflags',
'getrecursionlimit', 'getrefcount', 'hexversion', 'maxint', 'maxunicode',
'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache',
@@ -2703,7 +2703,7 @@ standard module \module{__builtin__}\refbimodindex{__builtin__}:
'id', 'input', 'int', 'isinstance', 'issubclass', 'iter',
'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'min',
'object', 'oct', 'open', 'ord', 'pow', 'property', 'quit', 'range',
- 'reload', 'repr', 'reversed', 'round', 'set',
+ 'repr', 'reversed', 'round', 'set',
'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super',
'tuple', 'type', 'unichr', 'unicode', 'vars', 'zip']
\end{verbatim}
diff --git a/Doc/whatsnew/whatsnew30.tex b/Doc/whatsnew/whatsnew30.tex
new file mode 100644
index 00000000000..f52ca37874a
--- /dev/null
+++ b/Doc/whatsnew/whatsnew30.tex
@@ -0,0 +1,178 @@
+\documentclass{howto}
+\usepackage{distutils}
+% $Id: whatsnew26.tex 55506 2007-05-22 07:43:29Z neal.norwitz $
+
+% Rules for maintenance:
+%
+% * Anyone can add text to this document. Do not spend very much time
+% on the wording of your changes, because your text will probably
+% get rewritten to some degree.
+%
+% * The maintainer will go through Misc/NEWS periodically and add
+% changes; it's therefore more important to add your changes to
+% Misc/NEWS than to this file.
+%
+% * This is not a complete list of every single change; completeness
+% is the purpose of Misc/NEWS. Some changes I consider too small
+% or esoteric to include. If such a change is added to the text,
+% I'll just remove it. (This is another reason you shouldn't spend
+% too much time on writing your addition.)
+%
+% * If you want to draw your new text to the attention of the
+% maintainer, add 'XXX' to the beginning of the paragraph or
+% section.
+%
+% * It's OK to just add a fragmentary note about a change. For
+% example: "XXX Describe the transmogrify() function added to the
+% socket module." The maintainer will research the change and
+% write the necessary text.
+%
+% * You can comment out your additions if you like, but it's not
+% necessary (especially when a final release is some months away).
+%
+% * Credit the author of a patch or bugfix. Just the name is
+% sufficient; the e-mail address isn't necessary.
+%
+% * It's helpful to add the bug/patch number as a comment:
+%
+% % Patch 12345
+% XXX Describe the transmogrify() function added to the socket
+% module.
+% (Contributed by P.Y. Developer.)
+%
+% This saves the maintainer the effort of going through the SVN log
+% when researching a change.
+
+\title{What's New in Python 3.0}
+\release{0.0}
+\author{A.M. Kuchling}
+\authoraddress{\email{amk@amk.ca}}
+
+\begin{document}
+\maketitle
+\tableofcontents
+
+This article explains the new features in Python 3.0. No release date
+for Python 3.0 has been set; it will probably be released in mid 2008.
+
+% Compare with previous release in 2 - 3 sentences here.
+
+This article doesn't attempt to provide a complete specification of
+the new features, but instead provides a convenient overview. For
+full details, you should refer to the documentation for Python 3.0.
+% add hyperlink when the documentation becomes available online.
+If you want to understand the complete implementation and design
+rationale, refer to the PEP for a particular new feature.
+
+
+%======================================================================
+
+% Large, PEP-level features and changes should be described here.
+
+% Should there be a new section here for 3k migration?
+% Or perhaps a more general section describing module changes/deprecation?
+% sets module deprecated
+
+%======================================================================
+\section{Other Language Changes}
+
+Here are all of the changes that Python 2.6 makes to the core Python
+language.
+
+\begin{itemize}
+
+\item Detailed changes are listed here.
+
+\end{itemize}
+
+
+%======================================================================
+\subsection{Optimizations}
+
+\begin{itemize}
+
+\item Detailed changes are listed here.
+
+\end{itemize}
+
+The net result of the 3.0 optimizations is that Python 3.0 runs the
+pystone benchmark around XX\% slower than Python 2.6.
+
+
+%======================================================================
+\section{New, Improved, and Deprecated Modules}
+
+As usual, Python's standard library received a number of enhancements and
+bug fixes. Here's a partial list of the most notable changes, sorted
+alphabetically by module name. Consult the
+\file{Misc/NEWS} file in the source tree for a more
+complete list of changes, or look through the CVS logs for all the
+details.
+
+\begin{itemize}
+
+\item Detailed changes are listed here.
+
+\end{itemize}
+
+
+%======================================================================
+% whole new modules get described in \subsections here
+
+
+% ======================================================================
+\section{Build and C API Changes}
+
+Changes to Python's build process and to the C API include:
+
+\begin{itemize}
+
+\item Detailed changes are listed here.
+
+\end{itemize}
+
+
+%======================================================================
+\subsection{Port-Specific Changes}
+
+Platform-specific changes go here.
+
+
+%======================================================================
+\section{Other Changes and Fixes \label{section-other}}
+
+As usual, there were a bunch of other improvements and bugfixes
+scattered throughout the source tree. A search through the change
+logs finds there were XXX patches applied and YYY bugs fixed between
+Python 2.6 and 3.0. Both figures are likely to be underestimates.
+
+Some of the more notable changes are:
+
+\begin{itemize}
+
+\item Details go here.
+
+\end{itemize}
+
+
+%======================================================================
+\section{Porting to Python 3.0}
+
+This section lists previously described changes that may require
+changes to your code:
+
+\begin{itemize}
+
+\item Everything is all in the details!
+
+\end{itemize}
+
+
+%======================================================================
+\section{Acknowledgements \label{acks}}
+
+The author would like to thank the following people for offering
+suggestions, corrections and assistance with various drafts of this
+article: .
+
+\end{document}
diff --git a/Grammar/Grammar b/Grammar/Grammar
index 78d5f72c929..5041eb15978 100644
--- a/Grammar/Grammar
+++ b/Grammar/Grammar
@@ -100,7 +100,7 @@ power: atom trailer* ['**' factor]
atom: ('(' [yield_expr|testlist_comp] ')' |
'[' [testlist_comp] ']' |
'{' [dictorsetmaker] '}' |
- NAME | NUMBER | STRING+ | '...')
+ NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False')
testlist_comp: test ( comp_for | (',' test)* [','] )
trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
subscriptlist: subscript (',' subscript)* [',']
diff --git a/Lib/MimeWriter.py b/Lib/MimeWriter.py
deleted file mode 100644
index 58c0a0bcf2a..00000000000
--- a/Lib/MimeWriter.py
+++ /dev/null
@@ -1,181 +0,0 @@
-"""Generic MIME writer.
-
-This module defines the class MimeWriter. The MimeWriter class implements
-a basic formatter for creating MIME multi-part files. It doesn't seek around
-the output file nor does it use large amounts of buffer space. You must write
-the parts out in the order that they should occur in the final file.
-MimeWriter does buffer the headers you add, allowing you to rearrange their
-order.
-
-"""
-
-
-import mimetools
-
-__all__ = ["MimeWriter"]
-
-class MimeWriter:
-
- """Generic MIME writer.
-
- Methods:
-
- __init__()
- addheader()
- flushheaders()
- startbody()
- startmultipartbody()
- nextpart()
- lastpart()
-
- A MIME writer is much more primitive than a MIME parser. It
- doesn't seek around on the output file, and it doesn't use large
- amounts of buffer space, so you have to write the parts in the
- order they should occur on the output file. It does buffer the
- headers you add, allowing you to rearrange their order.
-
- General usage is:
-
- f = <open the output file>
- w = MimeWriter(f)
- ...call w.addheader(key, value) 0 or more times...
-
- followed by either:
-
- f = w.startbody(content_type)
- ...call f.write(data) for body data...
-
- or:
-
- w.startmultipartbody(subtype)
- for each part:
- subwriter = w.nextpart()
- ...use the subwriter's methods to create the subpart...
- w.lastpart()
-
- The subwriter is another MimeWriter instance, and should be
- treated in the same way as the toplevel MimeWriter. This way,
- writing recursive body parts is easy.
-
- Warning: don't forget to call lastpart()!
-
- XXX There should be more state so calls made in the wrong order
- are detected.
-
- Some special cases:
-
- - startbody() just returns the file passed to the constructor;
- but don't use this knowledge, as it may be changed.
-
- - startmultipartbody() actually returns a file as well;
- this can be used to write the initial 'if you can read this your
- mailer is not MIME-aware' message.
-
- - If you call flushheaders(), the headers accumulated so far are
- written out (and forgotten); this is useful if you don't need a
- body part at all, e.g. for a subpart of type message/rfc822
- that's (mis)used to store some header-like information.
-
- - Passing a keyword argument 'prefix=<flag>' to addheader(),
- start*body() affects where the header is inserted; 0 means
- append at the end, 1 means insert at the start; default is
- append for addheader(), but insert for start*body(), which use
- it to determine where the Content-Type header goes.
-
- """
-
- def __init__(self, fp):
- self._fp = fp
- self._headers = []
-
- def addheader(self, key, value, prefix=0):
- """Add a header line to the MIME message.
-
- The key is the name of the header, where the value obviously provides
- the value of the header. The optional argument prefix determines
- where the header is inserted; 0 means append at the end, 1 means
- insert at the start. The default is to append.
-
- """
- lines = value.split("\n")
- while lines and not lines[-1]: del lines[-1]
- while lines and not lines[0]: del lines[0]
- for i in range(1, len(lines)):
- lines[i] = " " + lines[i].strip()
- value = "\n".join(lines) + "\n"
- line = key + ": " + value
- if prefix:
- self._headers.insert(0, line)
- else:
- self._headers.append(line)
-
- def flushheaders(self):
- """Writes out and forgets all headers accumulated so far.
-
- This is useful if you don't need a body part at all; for example,
- for a subpart of type message/rfc822 that's (mis)used to store some
- header-like information.
-
- """
- self._fp.writelines(self._headers)
- self._headers = []
-
- def startbody(self, ctype, plist=[], prefix=1):
- """Returns a file-like object for writing the body of the message.
-
- The content-type is set to the provided ctype, and the optional
- parameter, plist, provides additional parameters for the
- content-type declaration. The optional argument prefix determines
- where the header is inserted; 0 means append at the end, 1 means
- insert at the start. The default is to insert at the start.
-
- """
- for name, value in plist:
- ctype = ctype + ';\n %s=\"%s\"' % (name, value)
- self.addheader("Content-Type", ctype, prefix=prefix)
- self.flushheaders()
- self._fp.write("\n")
- return self._fp
-
- def startmultipartbody(self, subtype, boundary=None, plist=[], prefix=1):
- """Returns a file-like object for writing the body of the message.
-
- Additionally, this method initializes the multi-part code, where the
- subtype parameter provides the multipart subtype, the boundary
- parameter may provide a user-defined boundary specification, and the
- plist parameter provides optional parameters for the subtype. The
- optional argument, prefix, determines where the header is inserted;
- 0 means append at the end, 1 means insert at the start. The default
- is to insert at the start. Subparts should be created using the
- nextpart() method.
-
- """
- self._boundary = boundary or mimetools.choose_boundary()
- return self.startbody("multipart/" + subtype,
- [("boundary", self._boundary)] + plist,
- prefix=prefix)
-
- def nextpart(self):
- """Returns a new instance of MimeWriter which represents an
- individual part in a multipart message.
-
- This may be used to write the part as well as used for creating
- recursively complex multipart messages. The message must first be
- initialized with the startmultipartbody() method before using the
- nextpart() method.
-
- """
- self._fp.write("\n--" + self._boundary + "\n")
- return self.__class__(self._fp)
-
- def lastpart(self):
- """This is used to designate the last part of a multipart message.
-
- It should always be used when writing multipart messages.
-
- """
- self._fp.write("\n--" + self._boundary + "--\n")
-
-
-if __name__ == '__main__':
- import test.test_MimeWriter
diff --git a/Lib/SocketServer.py b/Lib/SocketServer.py
index 8e92b800979..c6e71ebbfdc 100644
--- a/Lib/SocketServer.py
+++ b/Lib/SocketServer.py
@@ -518,12 +518,9 @@ class BaseRequestHandler:
self.request = request
self.client_address = client_address
self.server = server
- try:
- self.setup()
- self.handle()
- self.finish()
- finally:
- sys.exc_traceback = None # Help garbage collection
+ self.setup()
+ self.handle()
+ self.finish()
def setup(self):
pass
diff --git a/Lib/bsddb/test/test_thread.py b/Lib/bsddb/test/test_thread.py
index fca4466f9a7..df112b7611e 100644
--- a/Lib/bsddb/test/test_thread.py
+++ b/Lib/bsddb/test/test_thread.py
@@ -10,12 +10,6 @@ import tempfile
from pprint import pprint
from random import random
-try:
- True, False
-except NameError:
- True = 1
- False = 0
-
DASH = '-'
try:
diff --git a/Lib/ctypes/wintypes.py b/Lib/ctypes/wintypes.py
index a0fc0bb3c07..e97b31dabc1 100644
--- a/Lib/ctypes/wintypes.py
+++ b/Lib/ctypes/wintypes.py
@@ -147,7 +147,7 @@ class WIN32_FIND_DATAA(Structure):
("dwReserved0", DWORD),
("dwReserved1", DWORD),
("cFileName", c_char * MAX_PATH),
- ("cAlternameFileName", c_char * 14)]
+ ("cAlternateFileName", c_char * 14)]
class WIN32_FIND_DATAW(Structure):
_fields_ = [("dwFileAttributes", DWORD),
@@ -159,7 +159,7 @@ class WIN32_FIND_DATAW(Structure):
("dwReserved0", DWORD),
("dwReserved1", DWORD),
("cFileName", c_wchar * MAX_PATH),
- ("cAlternameFileName", c_wchar * 14)]
+ ("cAlternateFileName", c_wchar * 14)]
__all__ = ['ATOM', 'BOOL', 'BOOLEAN', 'BYTE', 'COLORREF', 'DOUBLE',
'DWORD', 'FILETIME', 'HACCEL', 'HANDLE', 'HBITMAP', 'HBRUSH',
diff --git a/Lib/dis.py b/Lib/dis.py
index f274606075b..dac7cae2c81 100644
--- a/Lib/dis.py
+++ b/Lib/dis.py
@@ -23,13 +23,10 @@ def dis(x=None):
if hasattr(x, '__code__'):
x = x.__code__
if hasattr(x, '__dict__'):
- items = x.__dict__.items()
- items.sort()
+ items = sorted(x.__dict__.items())
for name, x1 in items:
- if type(x1) in (types.MethodType,
- types.FunctionType,
- types.CodeType,
- types.ClassType):
+ if isinstance(x1, (types.MethodType, types.FunctionType,
+ types.CodeType, types.ClassType, type)):
print("Disassembly of %s:" % name)
try:
dis(x1)
@@ -41,9 +38,8 @@ def dis(x=None):
elif isinstance(x, str):
disassemble_string(x)
else:
- raise TypeError, \
- "don't know how to disassemble %s objects" % \
- type(x).__name__
+ raise TypeError("don't know how to disassemble %s objects" %
+ type(x).__name__)
def distb(tb=None):
"""Disassemble a traceback (default: last traceback)."""
diff --git a/Lib/idlelib/StackViewer.py b/Lib/idlelib/StackViewer.py
index 6b7730bcdbb..79324ae3e95 100644
--- a/Lib/idlelib/StackViewer.py
+++ b/Lib/idlelib/StackViewer.py
@@ -120,18 +120,3 @@ class VariablesTreeItem(ObjectTreeItem):
item = make_objecttreeitem(key + " =", value, setfunction)
sublist.append(item)
return sublist
-
-
-def _test():
- try:
- import testcode
- reload(testcode)
- except:
- sys.last_type, sys.last_value, sys.last_traceback = sys.exc_info()
- from Tkinter import Tk
- root = Tk()
- StackBrowser(None, top=root)
- root.mainloop()
-
-if __name__ == "__main__":
- _test()
diff --git a/Lib/ihooks.py b/Lib/ihooks.py
index 733f2db9e34..14a20a6020f 100644
--- a/Lib/ihooks.py
+++ b/Lib/ihooks.py
@@ -45,9 +45,7 @@ functionality along those lines.
If a module importer class supports dotted names, its import_module()
must return a different value depending on whether it is called on
behalf of a "from ... import ..." statement or not. (This is caused
-by the way the __import__ hook is used by the Python interpreter.) It
-would also do wise to install a different version of reload().
-
+by the way the __import__ hook is used by the Python interpreter.)
"""
@@ -379,17 +377,14 @@ class BasicModuleImporter(_Verbose):
def install(self):
self.save_import_module = __builtin__.__import__
- self.save_reload = __builtin__.reload
if not hasattr(__builtin__, 'unload'):
__builtin__.unload = None
self.save_unload = __builtin__.unload
__builtin__.__import__ = self.import_module
- __builtin__.reload = self.reload
__builtin__.unload = self.unload
def uninstall(self):
__builtin__.__import__ = self.save_import_module
- __builtin__.reload = self.save_reload
__builtin__.unload = self.save_unload
if not __builtin__.unload:
del __builtin__.unload
diff --git a/Lib/imputil.py b/Lib/imputil.py
index dbf092228cc..6d99ec17b3f 100644
--- a/Lib/imputil.py
+++ b/Lib/imputil.py
@@ -40,9 +40,6 @@ class ImportManager:
self.namespace = namespace
namespace['__import__'] = self._import_hook
- ### fix this
- #namespace['reload'] = self._reload_hook
-
def uninstall(self):
"Restore the previous import mechanism."
self.namespace['__import__'] = self.previous_importer
@@ -194,22 +191,6 @@ class ImportManager:
return module
return None
- def _reload_hook(self, module):
- "Python calls this hook to reload a module."
-
- # reloading of a module may or may not be possible (depending on the
- # importer), but at least we can validate that it's ours to reload
- importer = module.__dict__.get('__importer__')
- if not importer:
- ### oops. now what...
- pass
-
- # okay. it is using the imputil system, and we must delegate it, but
- # we don't know what to do (yet)
- ### we should blast the module dict and do another get_code(). need to
- ### flesh this out and add proper docco...
- raise SystemError, "reload not yet implemented"
-
class Importer:
"Base class for replacing standard import functions."
@@ -682,7 +663,6 @@ def _test_revamp():
# flag to force absolute imports? (speeds _determine_import_context and
# checking for a relative module)
# insert names of archives into sys.path (see quote below)
-# note: reload does NOT blast module dict
# shift import mechanisms and policies around; provide for hooks, overrides
# (see quote below)
# add get_source stuff
diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py
index 4eb03929307..0a6288644e0 100644
--- a/Lib/logging/__init__.py
+++ b/Lib/logging/__init__.py
@@ -66,7 +66,7 @@ def currentframe():
try:
raise Exception
except:
- return sys.exc_traceback.tb_frame.f_back
+ return sys.exc_info()[2].tb_frame.f_back
if hasattr(sys, '_getframe'): currentframe = lambda: sys._getframe(3)
# done filching
diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py
index 00dd05b9ef5..084a9323ea8 100644
--- a/Lib/logging/handlers.py
+++ b/Lib/logging/handlers.py
@@ -629,7 +629,8 @@ class SysLogHandler(logging.Handler):
"""
Initialize a handler.
- If address is specified as a string, UNIX socket is used.
+ If address is specified as a string, a UNIX socket is used. To log to a
+ local syslogd, "SysLogHandler(address="/dev/log")" can be used.
If facility is not specified, LOG_USER is used.
"""
logging.Handler.__init__(self)
diff --git a/Lib/mimify.py b/Lib/mimify.py
deleted file mode 100755
index 6609e80b98a..00000000000
--- a/Lib/mimify.py
+++ /dev/null
@@ -1,464 +0,0 @@
-#! /usr/bin/env python
-
-"""Mimification and unmimification of mail messages.
-
-Decode quoted-printable parts of a mail message or encode using
-quoted-printable.
-
-Usage:
- mimify(input, output)
- unmimify(input, output, decode_base64 = 0)
-to encode and decode respectively. Input and output may be the name
-of a file or an open file object. Only a readline() method is used
-on the input file, only a write() method is used on the output file.
-When using file names, the input and output file names may be the
-same.
-
-Interactive usage:
- mimify.py -e [infile [outfile]]
- mimify.py -d [infile [outfile]]
-to encode and decode respectively. Infile defaults to standard
-input and outfile to standard output.
-"""
-
-# Configure
-MAXLEN = 200 # if lines longer than this, encode as quoted-printable
-CHARSET = 'ISO-8859-1' # default charset for non-US-ASCII mail
-QUOTE = '> ' # string replies are quoted with
-# End configure
-
-import re
-
-__all__ = ["mimify","unmimify","mime_encode_header","mime_decode_header"]
-
-qp = re.compile('^content-transfer-encoding:\\s*quoted-printable', re.I)
-base64_re = re.compile('^content-transfer-encoding:\\s*base64', re.I)
-mp = re.compile('^content-type:.*multipart/.*boundary="?([^;"\n]*)', re.I|re.S)
-chrset = re.compile('^(content-type:.*charset=")(us-ascii|iso-8859-[0-9]+)(".*)', re.I|re.S)
-he = re.compile('^-*\n')
-mime_code = re.compile('=([0-9a-f][0-9a-f])', re.I)
-mime_head = re.compile('=\\?iso-8859-1\\?q\\?([^? \t\n]+)\\?=', re.I)
-repl = re.compile('^subject:\\s+re: ', re.I)
-
-class File:
- """A simple fake file object that knows about limited read-ahead and
- boundaries. The only supported method is readline()."""
-
- def __init__(self, file, boundary):
- self.file = file
- self.boundary = boundary
- self.peek = None
-
- def readline(self):
- if self.peek is not None:
- return ''
- line = self.file.readline()
- if not line:
- return line
- if self.boundary:
- if line == self.boundary + '\n':
- self.peek = line
- return ''
- if line == self.boundary + '--\n':
- self.peek = line
- return ''
- return line
-
-class HeaderFile:
- def __init__(self, file):
- self.file = file
- self.peek = None
-
- def readline(self):
- if self.peek is not None:
- line = self.peek
- self.peek = None
- else:
- line = self.file.readline()
- if not line:
- return line
- if he.match(line):
- return line
- while 1:
- self.peek = self.file.readline()
- if len(self.peek) == 0 or \
- (self.peek[0] != ' ' and self.peek[0] != '\t'):
- return line
- line = line + self.peek
- self.peek = None
-
-def mime_decode(line):
- """Decode a single line of quoted-printable text to 8bit."""
- newline = ''
- pos = 0
- while 1:
- res = mime_code.search(line, pos)
- if res is None:
- break
- newline = newline + line[pos:res.start(0)] + \
- chr(int(res.group(1), 16))
- pos = res.end(0)
- return newline + line[pos:]
-
-def mime_decode_header(line):
- """Decode a header line to 8bit."""
- newline = ''
- pos = 0
- while 1:
- res = mime_head.search(line, pos)
- if res is None:
- break
- match = res.group(1)
- # convert underscores to spaces (before =XX conversion!)
- match = ' '.join(match.split('_'))
- newline = newline + line[pos:res.start(0)] + mime_decode(match)
- pos = res.end(0)
- return newline + line[pos:]
-
-def unmimify_part(ifile, ofile, decode_base64 = 0):
- """Convert a quoted-printable part of a MIME mail message to 8bit."""
- multipart = None
- quoted_printable = 0
- is_base64 = 0
- is_repl = 0
- if ifile.boundary and ifile.boundary[:2] == QUOTE:
- prefix = QUOTE
- else:
- prefix = ''
-
- # read header
- hfile = HeaderFile(ifile)
- while 1:
- line = hfile.readline()
- if not line:
- return
- if prefix and line[:len(prefix)] == prefix:
- line = line[len(prefix):]
- pref = prefix
- else:
- pref = ''
- line = mime_decode_header(line)
- if qp.match(line):
- quoted_printable = 1
- continue # skip this header
- if decode_base64 and base64_re.match(line):
- is_base64 = 1
- continue
- ofile.write(pref + line)
- if not prefix and repl.match(line):
- # we're dealing with a reply message
- is_repl = 1
- mp_res = mp.match(line)
- if mp_res:
- multipart = '--' + mp_res.group(1)
- if he.match(line):
- break
- if is_repl and (quoted_printable or multipart):
- is_repl = 0
-
- # read body
- while 1:
- line = ifile.readline()
- if not line:
- return
- line = re.sub(mime_head, '\\1', line)
- if prefix and line[:len(prefix)] == prefix:
- line = line[len(prefix):]
- pref = prefix
- else:
- pref = ''
-## if is_repl and len(line) >= 4 and line[:4] == QUOTE+'--' and line[-3:] != '--\n':
-## multipart = line[:-1]
- while multipart:
- if line == multipart + '--\n':
- ofile.write(pref + line)
- multipart = None
- line = None
- break
- if line == multipart + '\n':
- ofile.write(pref + line)
- nifile = File(ifile, multipart)
- unmimify_part(nifile, ofile, decode_base64)
- line = nifile.peek
- if not line:
- # premature end of file
- break
- continue
- # not a boundary between parts
- break
- if line and quoted_printable:
- while line[-2:] == '=\n':
- line = line[:-2]
- newline = ifile.readline()
- if newline[:len(QUOTE)] == QUOTE:
- newline = newline[len(QUOTE):]
- line = line + newline
- line = mime_decode(line)
- if line and is_base64 and not pref:
- import base64
- line = base64.decodestring(line)
- if line:
- ofile.write(pref + line)
-
-def unmimify(infile, outfile, decode_base64 = 0):
- """Convert quoted-printable parts of a MIME mail message to 8bit."""
- if type(infile) == type(''):
- ifile = open(infile)
- if type(outfile) == type('') and infile == outfile:
- import os
- d, f = os.path.split(infile)
- os.rename(infile, os.path.join(d, ',' + f))
- else:
- ifile = infile
- if type(outfile) == type(''):
- ofile = open(outfile, 'w')
- else:
- ofile = outfile
- nifile = File(ifile, None)
- unmimify_part(nifile, ofile, decode_base64)
- ofile.flush()
-
-mime_char = re.compile('[=\177-\377]') # quote these chars in body
-mime_header_char = re.compile('[=?\177-\377]') # quote these in header
-
-def mime_encode(line, header):
- """Code a single line as quoted-printable.
- If header is set, quote some extra characters."""
- if header:
- reg = mime_header_char
- else:
- reg = mime_char
- newline = ''
- pos = 0
- if len(line) >= 5 and line[:5] == 'From ':
- # quote 'From ' at the start of a line for stupid mailers
- newline = ('=%02x' % ord('F')).upper()
- pos = 1
- while 1:
- res = reg.search(line, pos)
- if res is None:
- break
- newline = newline + line[pos:res.start(0)] + \
- ('=%02x' % ord(res.group(0))).upper()
- pos = res.end(0)
- line = newline + line[pos:]
-
- newline = ''
- while len(line) >= 75:
- i = 73
- while line[i] == '=' or line[i-1] == '=':
- i = i - 1
- i = i + 1
- newline = newline + line[:i] + '=\n'
- line = line[i:]
- return newline + line
-
-mime_header = re.compile('([ \t(]|^)([-a-zA-Z0-9_+]*[\177-\377][-a-zA-Z0-9_+\177-\377]*)(?=[ \t)]|\n)')
-
-def mime_encode_header(line):
- """Code a single header line as quoted-printable."""
- newline = ''
- pos = 0
- while 1:
- res = mime_header.search(line, pos)
- if res is None:
- break
- newline = '%s%s%s=?%s?Q?%s?=' % \
- (newline, line[pos:res.start(0)], res.group(1),
- CHARSET, mime_encode(res.group(2), 1))
- pos = res.end(0)
- return newline + line[pos:]
-
-mv = re.compile('^mime-version:', re.I)
-cte = re.compile('^content-transfer-encoding:', re.I)
-iso_char = re.compile('[\177-\377]')
-
-def mimify_part(ifile, ofile, is_mime):
- """Convert an 8bit part of a MIME mail message to quoted-printable."""
- has_cte = is_qp = is_base64 = 0
- multipart = None
- must_quote_body = must_quote_header = has_iso_chars = 0
-
- header = []
- header_end = ''
- message = []
- message_end = ''
- # read header
- hfile = HeaderFile(ifile)
- while 1:
- line = hfile.readline()
- if not line:
- break
- if not must_quote_header and iso_char.search(line):
- must_quote_header = 1
- if mv.match(line):
- is_mime = 1
- if cte.match(line):
- has_cte = 1
- if qp.match(line):
- is_qp = 1
- elif base64_re.match(line):
- is_base64 = 1
- mp_res = mp.match(line)
- if mp_res:
- multipart = '--' + mp_res.group(1)
- if he.match(line):
- header_end = line
- break
- header.append(line)
-
- # read body
- while 1:
- line = ifile.readline()
- if not line:
- break
- if multipart:
- if line == multipart + '--\n':
- message_end = line
- break
- if line == multipart + '\n':
- message_end = line
- break
- if is_base64:
- message.append(line)
- continue
- if is_qp:
- while line[-2:] == '=\n':
- line = line[:-2]
- newline = ifile.readline()
- if newline[:len(QUOTE)] == QUOTE:
- newline = newline[len(QUOTE):]
- line = line + newline
- line = mime_decode(line)
- message.append(line)
- if not has_iso_chars:
- if iso_char.search(line):
- has_iso_chars = must_quote_body = 1
- if not must_quote_body:
- if len(line) > MAXLEN:
- must_quote_body = 1
-
- # convert and output header and body
- for line in header:
- if must_quote_header:
- line = mime_encode_header(line)
- chrset_res = chrset.match(line)
- if chrset_res:
- if has_iso_chars:
- # change us-ascii into iso-8859-1
- if chrset_res.group(2).lower() == 'us-ascii':
- line = '%s%s%s' % (chrset_res.group(1),
- CHARSET,
- chrset_res.group(3))
- else:
- # change iso-8859-* into us-ascii
- line = '%sus-ascii%s' % chrset_res.group(1, 3)
- if has_cte and cte.match(line):
- line = 'Content-Transfer-Encoding: '
- if is_base64:
- line = line + 'base64\n'
- elif must_quote_body:
- line = line + 'quoted-printable\n'
- else:
- line = line + '7bit\n'
- ofile.write(line)
- if (must_quote_header or must_quote_body) and not is_mime:
- ofile.write('Mime-Version: 1.0\n')
- ofile.write('Content-Type: text/plain; ')
- if has_iso_chars:
- ofile.write('charset="%s"\n' % CHARSET)
- else:
- ofile.write('charset="us-ascii"\n')
- if must_quote_body and not has_cte:
- ofile.write('Content-Transfer-Encoding: quoted-printable\n')
- ofile.write(header_end)
-
- for line in message:
- if must_quote_body:
- line = mime_encode(line, 0)
- ofile.write(line)
- ofile.write(message_end)
-
- line = message_end
- while multipart:
- if line == multipart + '--\n':
- # read bit after the end of the last part
- while 1:
- line = ifile.readline()
- if not line:
- return
- if must_quote_body:
- line = mime_encode(line, 0)
- ofile.write(line)
- if line == multipart + '\n':
- nifile = File(ifile, multipart)
- mimify_part(nifile, ofile, 1)
- line = nifile.peek
- if not line:
- # premature end of file
- break
- ofile.write(line)
- continue
- # unexpectedly no multipart separator--copy rest of file
- while 1:
- line = ifile.readline()
- if not line:
- return
- if must_quote_body:
- line = mime_encode(line, 0)
- ofile.write(line)
-
-def mimify(infile, outfile):
- """Convert 8bit parts of a MIME mail message to quoted-printable."""
- if type(infile) == type(''):
- ifile = open(infile)
- if type(outfile) == type('') and infile == outfile:
- import os
- d, f = os.path.split(infile)
- os.rename(infile, os.path.join(d, ',' + f))
- else:
- ifile = infile
- if type(outfile) == type(''):
- ofile = open(outfile, 'w')
- else:
- ofile = outfile
- nifile = File(ifile, None)
- mimify_part(nifile, ofile, 0)
- ofile.flush()
-
-import sys
-if __name__ == '__main__' or (len(sys.argv) > 0 and sys.argv[0] == 'mimify'):
- import getopt
- usage = 'Usage: mimify [-l len] -[ed] [infile [outfile]]'
-
- decode_base64 = 0
- opts, args = getopt.getopt(sys.argv[1:], 'l:edb')
- if len(args) not in (0, 1, 2):
- print(usage)
- sys.exit(1)
- if (('-e', '') in opts) == (('-d', '') in opts) or \
- ((('-b', '') in opts) and (('-d', '') not in opts)):
- print(usage)
- sys.exit(1)
- for o, a in opts:
- if o == '-e':
- encode = mimify
- elif o == '-d':
- encode = unmimify
- elif o == '-l':
- try:
- MAXLEN = int(a)
- except (ValueError, OverflowError):
- print(usage)
- sys.exit(1)
- elif o == '-b':
- decode_base64 = 1
- if len(args) == 0:
- encode_args = (sys.stdin, sys.stdout)
- elif len(args) == 1:
- encode_args = (args[0], sys.stdout)
- else:
- encode_args = (args[0], args[1])
- if decode_base64:
- encode_args = encode_args + (decode_base64,)
- encode(*encode_args)
diff --git a/Lib/optparse.py b/Lib/optparse.py
index 1fc07b53ee4..516fd5d9981 100644
--- a/Lib/optparse.py
+++ b/Lib/optparse.py
@@ -816,12 +816,6 @@ class Option:
SUPPRESS_HELP = "SUPPRESS"+"HELP"
SUPPRESS_USAGE = "SUPPRESS"+"USAGE"
-# For compatibility with Python 2.2
-try:
- True, False
-except NameError:
- (True, False) = (1, 0)
-
def isbasestring(x):
return isinstance(x, basestring)
diff --git a/Lib/os.py b/Lib/os.py
index 0ced8827c9e..d2a305ef7bd 100644
--- a/Lib/os.py
+++ b/Lib/os.py
@@ -388,13 +388,14 @@ def _execvpe(file, args, env=None):
else:
envpath = defpath
PATH = envpath.split(pathsep)
- saved_exc = None
+ last_exc = saved_exc = None
saved_tb = None
for dir in PATH:
fullname = path.join(dir, file)
try:
func(fullname, *argrest)
except error as e:
+ last_exc = e
tb = sys.exc_info()[2]
if (e.errno != ENOENT and e.errno != ENOTDIR
and saved_exc is None):
@@ -402,7 +403,7 @@ def _execvpe(file, args, env=None):
saved_tb = tb
if saved_exc:
raise error, saved_exc, saved_tb
- raise error, e, tb
+ raise error, last_exc, tb
# Change environ to automatically call putenv() if it exists
try:
diff --git a/Lib/plat-mac/buildtools.py b/Lib/plat-mac/buildtools.py
index 62c456c3879..5678a9ff830 100644
--- a/Lib/plat-mac/buildtools.py
+++ b/Lib/plat-mac/buildtools.py
@@ -13,6 +13,9 @@ import macresource
import EasyDialogs
import shutil
+import warnings
+warnings.warn("the buildtools module is deprecated", DeprecationWarning, 2)
+
BuildError = "BuildError"
diff --git a/Lib/plat-mac/cfmfile.py b/Lib/plat-mac/cfmfile.py
deleted file mode 100644
index df157fde8cc..00000000000
--- a/Lib/plat-mac/cfmfile.py
+++ /dev/null
@@ -1,183 +0,0 @@
-"""codefragments.py -- wrapper to modify code fragments."""
-
-# (c) 1998, Just van Rossum, Letterror
-
-__version__ = "0.8b3"
-__author__ = "jvr"
-
-import Carbon.File
-import struct
-from Carbon import Res
-import os
-import sys
-
-DEBUG = 0
-
-error = "cfm.error"
-
-BUFSIZE = 0x80000
-
-def mergecfmfiles(srclist, dst, architecture = 'fat'):
- """Merge all files in srclist into a new file dst.
-
- If architecture is given, only code fragments of that type will be used:
- "pwpc" for PPC, "m68k" for cfm68k. This does not work for "classic"
- 68k code, since it does not use code fragments to begin with.
- If architecture is None, all fragments will be used, enabling FAT binaries.
- """
-
- srclist = list(srclist)
- for i in range(len(srclist)):
- srclist[i] = Carbon.File.pathname(srclist[i])
- dst = Carbon.File.pathname(dst)
-
- dstfile = open(dst, "wb")
- rf = Res.FSpOpenResFile(dst, 3)
- try:
- dstcfrg = CfrgResource()
- for src in srclist:
- srccfrg = CfrgResource(src)
- for frag in srccfrg.fragments:
- if frag.architecture == 'pwpc' and architecture == 'm68k':
- continue
- if frag.architecture == 'm68k' and architecture == 'pwpc':
- continue
- dstcfrg.append(frag)
-
- frag.copydata(dstfile)
-
- cfrgres = Res.Resource(dstcfrg.build())
- Res.UseResFile(rf)
- cfrgres.AddResource('cfrg', 0, "")
- finally:
- dstfile.close()
- rf = Res.CloseResFile(rf)
-
-
-class CfrgResource:
-
- def __init__(self, path = None):
- self.version = 1
- self.fragments = []
- self.path = path
- if path is not None and os.path.exists(path):
- currentresref = Res.CurResFile()
- resref = Res.FSpOpenResFile(path, 1)
- Res.UseResFile(resref)
- try:
- try:
- data = Res.Get1Resource('cfrg', 0).data
- except Res.Error:
- raise Res.Error, "no 'cfrg' resource found", sys.exc_traceback
- finally:
- Res.CloseResFile(resref)
- Res.UseResFile(currentresref)
- self.parse(data)
- if self.version != 1:
- raise error, "unknown 'cfrg' resource format"
-
- def parse(self, data):
- (res1, res2, self.version,
- res3, res4, res5, res6,
- self.memberCount) = struct.unpack("8l", data[:32])
- data = data[32:]
- while data:
- frag = FragmentDescriptor(self.path, data)
- data = data[frag.memberSize:]
- self.fragments.append(frag)
-
- def build(self):
- self.memberCount = len(self.fragments)
- data = struct.pack("8l", 0, 0, self.version, 0, 0, 0, 0, self.memberCount)
- for frag in self.fragments:
- data = data + frag.build()
- return data
-
- def append(self, frag):
- self.fragments.append(frag)
-
-
-class FragmentDescriptor:
-
- def __init__(self, path, data = None):
- self.path = path
- if data is not None:
- self.parse(data)
-
- def parse(self, data):
- self.architecture = data[:4]
- ( self.updatelevel,
- self.currentVersion,
- self.oldDefVersion,
- self.stacksize,
- self.applibdir,
- self.fragtype,
- self.where,
- self.offset,
- self.length,
- self.res1, self.res2,
- self.memberSize,) = struct.unpack("4lhBB4lh", data[4:42])
- pname = data[42:self.memberSize]
- self.name = pname[1:1+ord(pname[0])]
-
- def build(self):
- data = self.architecture
- data = data + struct.pack("4lhBB4l",
- self.updatelevel,
- self.currentVersion,
- self.oldDefVersion,
- self.stacksize,
- self.applibdir,
- self.fragtype,
- self.where,
- self.offset,
- self.length,
- self.res1, self.res2)
- self.memberSize = len(data) + 2 + 1 + len(self.name)
- # pad to 4 byte boundaries
- if self.memberSize % 4:
- self.memberSize = self.memberSize + 4 - (self.memberSize % 4)
- data = data + struct.pack("hb", self.memberSize, len(self.name))
- data = data + self.name
- data = data + '\000' * (self.memberSize - len(data))
- return data
-
- def getfragment(self):
- if self.where != 1:
- raise error, "can't read fragment, unsupported location"
- f = open(self.path, "rb")
- f.seek(self.offset)
- if self.length:
- frag = f.read(self.length)
- else:
- frag = f.read()
- f.close()
- return frag
-
- def copydata(self, outfile):
- if self.where != 1:
- raise error, "can't read fragment, unsupported location"
- infile = open(self.path, "rb")
- if self.length == 0:
- infile.seek(0, 2)
- self.length = infile.tell()
-
- # Position input file and record new offset from output file
- infile.seek(self.offset)
-
- # pad to 16 byte boundaries
- offset = outfile.tell()
- if offset % 16:
- offset = offset + 16 - (offset % 16)
- outfile.seek(offset)
- self.offset = offset
-
- l = self.length
- while l:
- if l > BUFSIZE:
- outfile.write(infile.read(BUFSIZE))
- l = l - BUFSIZE
- else:
- outfile.write(infile.read(l))
- l = 0
- infile.close()
diff --git a/Lib/posixfile.py b/Lib/posixfile.py
deleted file mode 100644
index 2fa600fdf33..00000000000
--- a/Lib/posixfile.py
+++ /dev/null
@@ -1,237 +0,0 @@
-"""Extended file operations available in POSIX.
-
-f = posixfile.open(filename, [mode, [bufsize]])
- will create a new posixfile object
-
-f = posixfile.fileopen(fileobject)
- will create a posixfile object from a builtin file object
-
-f.file()
- will return the original builtin file object
-
-f.dup()
- will return a new file object based on a new filedescriptor
-
-f.dup2(fd)
- will return a new file object based on the given filedescriptor
-
-f.flags(mode)
- will turn on the associated flag (merge)
- mode can contain the following characters:
-
- (character representing a flag)
- a append only flag
- c close on exec flag
- n no delay flag
- s synchronization flag
- (modifiers)
- ! turn flags 'off' instead of default 'on'
- = copy flags 'as is' instead of default 'merge'
- ? return a string in which the characters represent the flags
- that are set
-
- note: - the '!' and '=' modifiers are mutually exclusive.
- - the '?' modifier will return the status of the flags after they
- have been changed by other characters in the mode string
-
-f.lock(mode [, len [, start [, whence]]])
- will (un)lock a region
- mode can contain the following characters:
-
- (character representing type of lock)
- u unlock
- r read lock
- w write lock
- (modifiers)
- | wait until the lock can be granted
- ? return the first lock conflicting with the requested lock
- or 'None' if there is no conflict. The lock returned is in the
- format (mode, len, start, whence, pid) where mode is a
- character representing the type of lock ('r' or 'w')
-
- note: - the '?' modifier prevents a region from being locked; it is
- query only
-"""
-import warnings
-warnings.warn("The posixfile module is deprecated; "
- "fcntl.lockf() provides better locking", DeprecationWarning, 2)
-
-class _posixfile_:
- """File wrapper class that provides extra POSIX file routines."""
-
- states = ['open', 'closed']
-
- #
- # Internal routines
- #
- def __repr__(self):
- file = self._file_
- return "<%s posixfile '%s', mode '%s' at %s>" % \
- (self.states[file.closed], file.name, file.mode, \
- hex(id(self))[2:])
-
- #
- # Initialization routines
- #
- def open(self, name, mode='r', bufsize=-1):
- import __builtin__
- return self.fileopen(__builtin__.open(name, mode, bufsize))
-
- def fileopen(self, file):
- import types
- if repr(type(file)) != "<type 'file'>":
- raise TypeError, 'posixfile.fileopen() arg must be file object'
- self._file_ = file
- # Copy basic file methods
- for maybemethod in dir(file):
- if not maybemethod.startswith('_'):
- attr = getattr(file, maybemethod)
- if isinstance(attr, types.BuiltinMethodType):
- setattr(self, maybemethod, attr)
- return self
-
- #
- # New methods
- #
- def file(self):
- return self._file_
-
- def dup(self):
- import posix
-
- if not hasattr(posix, 'fdopen'):
- raise AttributeError, 'dup() method unavailable'
-
- return posix.fdopen(posix.dup(self._file_.fileno()), self._file_.mode)
-
- def dup2(self, fd):
- import posix
-
- if not hasattr(posix, 'fdopen'):
- raise AttributeError, 'dup() method unavailable'
-
- posix.dup2(self._file_.fileno(), fd)
- return posix.fdopen(fd, self._file_.mode)
-
- def flags(self, *which):
- import fcntl, os
-
- if which:
- if len(which) > 1:
- raise TypeError, 'Too many arguments'
- which = which[0]
- else: which = '?'
-
- l_flags = 0
- if 'n' in which: l_flags = l_flags | os.O_NDELAY
- if 'a' in which: l_flags = l_flags | os.O_APPEND
- if 's' in which: l_flags = l_flags | os.O_SYNC
-
- file = self._file_
-
- if '=' not in which:
- cur_fl = fcntl.fcntl(file.fileno(), fcntl.F_GETFL, 0)
- if '!' in which: l_flags = cur_fl & ~ l_flags
- else: l_flags = cur_fl | l_flags
-
- l_flags = fcntl.fcntl(file.fileno(), fcntl.F_SETFL, l_flags)
-
- if 'c' in which:
- arg = ('!' not in which) # 0 is don't, 1 is do close on exec
- l_flags = fcntl.fcntl(file.fileno(), fcntl.F_SETFD, arg)
-
- if '?' in which:
- which = '' # Return current flags
- l_flags = fcntl.fcntl(file.fileno(), fcntl.F_GETFL, 0)
- if os.O_APPEND & l_flags: which = which + 'a'
- if fcntl.fcntl(file.fileno(), fcntl.F_GETFD, 0) & 1:
- which = which + 'c'
- if os.O_NDELAY & l_flags: which = which + 'n'
- if os.O_SYNC & l_flags: which = which + 's'
- return which
-
- def lock(self, how, *args):
- import struct, fcntl
-
- if 'w' in how: l_type = fcntl.F_WRLCK
- elif 'r' in how: l_type = fcntl.F_RDLCK
- elif 'u' in how: l_type = fcntl.F_UNLCK
- else: raise TypeError, 'no type of lock specified'
-
- if '|' in how: cmd = fcntl.F_SETLKW
- elif '?' in how: cmd = fcntl.F_GETLK
- else: cmd = fcntl.F_SETLK
-
- l_whence = 0
- l_start = 0
- l_len = 0
-
- if len(args) == 1:
- l_len = args[0]
- elif len(args) == 2:
- l_len, l_start = args
- elif len(args) == 3:
- l_len, l_start, l_whence = args
- elif len(args) > 3:
- raise TypeError, 'too many arguments'
-
- # Hack by davem@magnet.com to get locking to go on freebsd;
- # additions for AIX by Vladimir.Marangozov@imag.fr
- import sys, os
- if sys.platform in ('netbsd1',
- 'openbsd2',
- 'freebsd2', 'freebsd3', 'freebsd4', 'freebsd5',
- 'freebsd6', 'freebsd7',
- 'bsdos2', 'bsdos3', 'bsdos4'):
- flock = struct.pack('lxxxxlxxxxlhh', \
- l_start, l_len, os.getpid(), l_type, l_whence)
- elif sys.platform in ('aix3', 'aix4'):
- flock = struct.pack('hhlllii', \
- l_type, l_whence, l_start, l_len, 0, 0, 0)
- else:
- flock = struct.pack('hhllhh', \
- l_type, l_whence, l_start, l_len, 0, 0)
-
- flock = fcntl.fcntl(self._file_.fileno(), cmd, flock)
-
- if '?' in how:
- if sys.platform in ('netbsd1',
- 'openbsd2',
- 'freebsd2', 'freebsd3', 'freebsd4', 'freebsd5',
- 'bsdos2', 'bsdos3', 'bsdos4'):
- l_start, l_len, l_pid, l_type, l_whence = \
- struct.unpack('lxxxxlxxxxlhh', flock)
- elif sys.platform in ('aix3', 'aix4'):
- l_type, l_whence, l_start, l_len, l_sysid, l_pid, l_vfs = \
- struct.unpack('hhlllii', flock)
- elif sys.platform == "linux2":
- l_type, l_whence, l_start, l_len, l_pid, l_sysid = \
- struct.unpack('hhllhh', flock)
- else:
- l_type, l_whence, l_start, l_len, l_sysid, l_pid = \
- struct.unpack('hhllhh', flock)
-
- if l_type != fcntl.F_UNLCK:
- if l_type == fcntl.F_RDLCK:
- return 'r', l_len, l_start, l_whence, l_pid
- else:
- return 'w', l_len, l_start, l_whence, l_pid
-
-def open(name, mode='r', bufsize=-1):
- """Public routine to open a file as a posixfile object."""
- return _posixfile_().open(name, mode, bufsize)
-
-def fileopen(file):
- """Public routine to get a posixfile object from a Python file object."""
- return _posixfile_().fileopen(file)
-
-#
-# Constants
-#
-SEEK_SET = 0
-SEEK_CUR = 1
-SEEK_END = 2
-
-#
-# End of posixfile.py
-#
diff --git a/Lib/pydoc.py b/Lib/pydoc.py
index 97474569ba4..e4074dca9ac 100755
--- a/Lib/pydoc.py
+++ b/Lib/pydoc.py
@@ -271,12 +271,11 @@ def safeimport(path, forceload=0, cache={}):
# that inherits from another module that has changed).
if forceload and path in sys.modules:
if path not in sys.builtin_module_names:
- # Avoid simply calling reload() because it leaves names in
- # the currently loaded module lying around if they're not
- # defined in the new source file. Instead, remove the
- # module from sys.modules and re-import. Also remove any
- # submodules because they won't appear in the newly loaded
- # module's namespace if they're already in sys.modules.
+ # Remove the module from sys.modules and re-import to try
+ # and avoid problems with partially loaded modules.
+ # Also remove any submodules because they won't appear
+ # in the newly loaded module's namespace if they're already
+ # in sys.modules.
subs = [m for m in sys.modules if m.startswith(path + '.')]
for key in [path] + subs:
# Prevent garbage collection.
diff --git a/Lib/sha.py b/Lib/sha.py
deleted file mode 100644
index 9d914a9b532..00000000000
--- a/Lib/sha.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# $Id$
-#
-# Copyright (C) 2005 Gregory P. Smith (greg@electricrain.com)
-# Licensed to PSF under a Contributor Agreement.
-
-from hashlib import sha1 as sha
-new = sha
-
-blocksize = 1 # legacy value (wrong in any useful sense)
-digest_size = 20
-digestsize = 20
diff --git a/Lib/shlex.py b/Lib/shlex.py
index 964046dbd55..f034ab06294 100644
--- a/Lib/shlex.py
+++ b/Lib/shlex.py
@@ -268,8 +268,8 @@ class shlex:
raise StopIteration
return token
-def split(s, comments=False):
- lex = shlex(s, posix=True)
+def split(s, comments=False, posix=True):
+ lex = shlex(s, posix=posix)
lex.whitespace_split = True
if not comments:
lex.commenters = ''
diff --git a/Lib/subprocess.py b/Lib/subprocess.py
index d46aa552a8a..051f2d46fb7 100644
--- a/Lib/subprocess.py
+++ b/Lib/subprocess.py
@@ -340,13 +340,6 @@ try:
except:
MAXFD = 256
-# True/False does not exist on 2.2.0
-try:
- False
-except NameError:
- False = 0
- True = 1
-
_active = []
def _cleanup():
@@ -479,9 +472,10 @@ class Popen(object):
if preexec_fn is not None:
raise ValueError("preexec_fn is not supported on Windows "
"platforms")
- if close_fds:
+ if close_fds and (stdin is not None or stdout is not None or
+ stderr is not None):
raise ValueError("close_fds is not supported on Windows "
- "platforms")
+ "platforms if you redirect stdin/stdout/stderr")
else:
# POSIX
if startupinfo is not None:
@@ -740,9 +734,7 @@ class Popen(object):
hp, ht, pid, tid = CreateProcess(executable, args,
# no special security
None, None,
- # must inherit handles to pass std
- # handles
- 1,
+ int(not close_fds),
creationflags,
env,
cwd,
diff --git a/Lib/tarfile.py b/Lib/tarfile.py
index ad1473f6dfe..ef6f1c79e94 100644
--- a/Lib/tarfile.py
+++ b/Lib/tarfile.py
@@ -127,6 +127,17 @@ GNU_TYPES = (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK,
PAX_FIELDS = ("path", "linkpath", "size", "mtime",
"uid", "gid", "uname", "gname")
+# Fields in a pax header that are numbers, all other fields
+# are treated as strings.
+PAX_NUMBER_FIELDS = {
+ "atime": float,
+ "ctime": float,
+ "mtime": float,
+ "uid": int,
+ "gid": int,
+ "size": int
+}
+
#---------------------------------------------------------
# Bits used in the mode field, values in octal.
#---------------------------------------------------------
@@ -156,7 +167,7 @@ TOEXEC = 0001 # execute/search by other
#---------------------------------------------------------
ENCODING = sys.getfilesystemencoding()
if ENCODING is None:
- ENCODING = "ascii"
+ ENCODING = sys.getdefaultencoding()
#---------------------------------------------------------
# Some useful functions
@@ -220,6 +231,26 @@ def itn(n, digits=8, format=DEFAULT_FORMAT):
s = chr(0200) + s
return s
+def uts(s, encoding, errors):
+ """Convert a unicode object to a string.
+ """
+ if errors == "utf-8":
+ # An extra error handler similar to the -o invalid=UTF-8 option
+ # in POSIX.1-2001. Replace untranslatable characters with their
+ # UTF-8 representation.
+ try:
+ return s.encode(encoding, "strict")
+ except UnicodeEncodeError:
+ x = []
+ for c in s:
+ try:
+ x.append(c.encode(encoding, "strict"))
+ except UnicodeEncodeError:
+ x.append(c.encode("utf8"))
+ return "".join(x)
+ else:
+ return s.encode(encoding, errors)
+
def calc_chksums(buf):
"""Calculate the checksum for a member's header by summing up all
characters except for the chksum field which is treated as if
@@ -924,7 +955,7 @@ class TarInfo(object):
def __repr__(self):
return "<%s %r at %#x>" % (self.__class__.__name__,self.name,id(self))
- def get_info(self):
+ def get_info(self, encoding, errors):
"""Return the TarInfo's attributes as a dictionary.
"""
info = {
@@ -946,24 +977,29 @@ class TarInfo(object):
if info["type"] == DIRTYPE and not info["name"].endswith("/"):
info["name"] += "/"
+ for key in ("name", "linkname", "uname", "gname"):
+ if type(info[key]) is unicode:
+ info[key] = info[key].encode(encoding, errors)
+
return info
- def tobuf(self, format=DEFAULT_FORMAT, encoding=ENCODING):
+ def tobuf(self, format=DEFAULT_FORMAT, encoding=ENCODING, errors="strict"):
"""Return a tar header as a string of 512 byte blocks.
"""
+ info = self.get_info(encoding, errors)
+
if format == USTAR_FORMAT:
- return self.create_ustar_header()
+ return self.create_ustar_header(info)
elif format == GNU_FORMAT:
- return self.create_gnu_header()
+ return self.create_gnu_header(info)
elif format == PAX_FORMAT:
- return self.create_pax_header(encoding)
+ return self.create_pax_header(info, encoding, errors)
else:
raise ValueError("invalid format")
- def create_ustar_header(self):
+ def create_ustar_header(self, info):
"""Return the object as a ustar header block.
"""
- info = self.get_info()
info["magic"] = POSIX_MAGIC
if len(info["linkname"]) > LENGTH_LINK:
@@ -974,10 +1010,9 @@ class TarInfo(object):
return self._create_header(info, USTAR_FORMAT)
- def create_gnu_header(self):
+ def create_gnu_header(self, info):
"""Return the object as a GNU header block sequence.
"""
- info = self.get_info()
info["magic"] = GNU_MAGIC
buf = ""
@@ -989,12 +1024,11 @@ class TarInfo(object):
return buf + self._create_header(info, GNU_FORMAT)
- def create_pax_header(self, encoding):
+ def create_pax_header(self, info, encoding, errors):
"""Return the object as a ustar header block. If it cannot be
represented this way, prepend a pax extended header sequence
with supplement information.
"""
- info = self.get_info()
info["magic"] = POSIX_MAGIC
pax_headers = self.pax_headers.copy()
@@ -1004,7 +1038,11 @@ class TarInfo(object):
("name", "path", LENGTH_NAME), ("linkname", "linkpath", LENGTH_LINK),
("uname", "uname", 32), ("gname", "gname", 32)):
- val = info[name].decode(encoding)
+ if hname in pax_headers:
+ # The pax header has priority.
+ continue
+
+ val = info[name].decode(encoding, errors)
# Try to encode the string as ASCII.
try:
@@ -1013,27 +1051,23 @@ class TarInfo(object):
pax_headers[hname] = val
continue
- if len(val) > length:
- if name == "name":
- # Try to squeeze a longname in the prefix and name fields as in
- # ustar format.
- try:
- info["prefix"], info["name"] = self._posix_split_name(info["name"])
- except ValueError:
- pax_headers[hname] = val
- else:
- continue
- else:
- pax_headers[hname] = val
+ if len(info[name]) > length:
+ pax_headers[hname] = val
# Test number fields for values that exceed the field limit or values
# that like to be stored as float.
for name, digits in (("uid", 8), ("gid", 8), ("size", 12), ("mtime", 12)):
+ if name in pax_headers:
+ # The pax header has priority. Avoid overflow.
+ info[name] = 0
+ continue
+
val = info[name]
if not 0 <= val < 8 ** (digits - 1) or isinstance(val, float):
pax_headers[name] = str(val)
info[name] = 0
+ # Create a pax extended header if necessary.
if pax_headers:
buf = self._create_pax_generic_header(pax_headers)
else:
@@ -1042,26 +1076,10 @@ class TarInfo(object):
return buf + self._create_header(info, USTAR_FORMAT)
@classmethod
- def create_pax_global_header(cls, pax_headers, encoding):
+ def create_pax_global_header(cls, pax_headers):
"""Return the object as a pax global header block sequence.
"""
- new_headers = {}
- for key, val in pax_headers.items():
- key = cls._to_unicode(key, encoding)
- val = cls._to_unicode(val, encoding)
- new_headers[key] = val
- return cls._create_pax_generic_header(new_headers, type=XGLTYPE)
-
- @staticmethod
- def _to_unicode(value, encoding):
- if isinstance(value, str):
- return value
- elif isinstance(value, (int, float)):
- return str(value)
- elif isinstance(value, str):
- return str(value, encoding)
- else:
- raise ValueError("unable to convert to unicode: %r" % value)
+ return cls._create_pax_generic_header(pax_headers, type=XGLTYPE)
def _posix_split_name(self, name):
"""Split a name longer than 100 chars into a prefix
@@ -1093,9 +1111,9 @@ class TarInfo(object):
" ", # checksum field
info.get("type", REGTYPE),
stn(info.get("linkname", ""), 100),
- stn(info.get("magic", ""), 8),
- stn(info.get("uname", ""), 32),
- stn(info.get("gname", ""), 32),
+ stn(info.get("magic", POSIX_MAGIC), 8),
+ stn(info.get("uname", "root"), 32),
+ stn(info.get("gname", "root"), 32),
itn(info.get("devmajor", 0), 8, format),
itn(info.get("devminor", 0), 8, format),
stn(info.get("prefix", ""), 155)
@@ -1256,12 +1274,9 @@ class TarInfo(object):
offset += self._block(self.size)
tarfile.offset = offset
- # Patch the TarInfo object with saved extended
+ # Patch the TarInfo object with saved global
# header information.
- for keyword, value in tarfile.pax_headers.items():
- if keyword in PAX_FIELDS:
- setattr(self, keyword, value)
- self.pax_headers[keyword] = value
+ self._apply_pax_info(tarfile.pax_headers, tarfile.encoding, tarfile.errors)
return self
@@ -1272,18 +1287,17 @@ class TarInfo(object):
buf = tarfile.fileobj.read(self._block(self.size))
# Fetch the next header and process it.
- b = tarfile.fileobj.read(BLOCKSIZE)
- t = self.frombuf(b)
- t.offset = self.offset
- next = t._proc_member(tarfile)
+ next = self.fromtarfile(tarfile)
+ if next is None:
+ raise HeaderError("missing subsequent header")
# Patch the TarInfo object from the next header with
# the longname information.
next.offset = self.offset
if self.type == GNUTYPE_LONGNAME:
- next.name = buf.rstrip(NUL)
+ next.name = nts(buf)
elif self.type == GNUTYPE_LONGLINK:
- next.linkname = buf.rstrip(NUL)
+ next.linkname = nts(buf)
return next
@@ -1358,21 +1372,10 @@ class TarInfo(object):
else:
pax_headers = tarfile.pax_headers.copy()
- # Fields in POSIX.1-2001 that are numbers, all other fields
- # are treated as UTF-8 strings.
- type_mapping = {
- "atime": float,
- "ctime": float,
- "mtime": float,
- "uid": int,
- "gid": int,
- "size": int
- }
-
# Parse pax header information. A record looks like that:
# "%d %s=%s\n" % (length, keyword, value). length is the size
# of the complete record including the length field itself and
- # the newline.
+ # the newline. keyword and value are both UTF-8 encoded strings.
regex = re.compile(r"(\d+) ([^=]+)=", re.U)
pos = 0
while True:
@@ -1385,35 +1388,55 @@ class TarInfo(object):
value = buf[match.end(2) + 1:match.start(1) + length - 1]
keyword = keyword.decode("utf8")
- keyword = keyword.encode(tarfile.encoding)
-
value = value.decode("utf8")
- if keyword in type_mapping:
- try:
- value = type_mapping[keyword](value)
- except ValueError:
- value = 0
- else:
- value = value.encode(tarfile.encoding)
pax_headers[keyword] = value
pos += length
- # Fetch the next header that will be patched with the
- # supplement information from the pax header (extended
- # only).
- t = self.fromtarfile(tarfile)
+ # Fetch the next header.
+ next = self.fromtarfile(tarfile)
- if self.type != XGLTYPE and t is not None:
- # Patch the TarInfo object from the next header with
- # the pax header's information.
- for keyword, value in pax_headers.items():
- if keyword in PAX_FIELDS:
- setattr(t, keyword, value)
- pax_headers[keyword] = value
- t.pax_headers = pax_headers.copy()
+ if self.type in (XHDTYPE, SOLARIS_XHDTYPE):
+ if next is None:
+ raise HeaderError("missing subsequent header")
- return t
+ # Patch the TarInfo object with the extended header info.
+ next._apply_pax_info(pax_headers, tarfile.encoding, tarfile.errors)
+ next.offset = self.offset
+
+ if "size" in pax_headers:
+ # If the extended header replaces the size field,
+ # we need to recalculate the offset where the next
+ # header starts.
+ offset = next.offset_data
+ if next.isreg() or next.type not in SUPPORTED_TYPES:
+ offset += next._block(next.size)
+ tarfile.offset = offset
+
+ return next
+
+ def _apply_pax_info(self, pax_headers, encoding, errors):
+ """Replace fields with supplemental information from a previous
+ pax extended or global header.
+ """
+ for keyword, value in pax_headers.items():
+ if keyword not in PAX_FIELDS:
+ continue
+
+ if keyword == "path":
+ value = value.rstrip("/")
+
+ if keyword in PAX_NUMBER_FIELDS:
+ try:
+ value = PAX_NUMBER_FIELDS[keyword](value)
+ except ValueError:
+ value = 0
+ else:
+ value = uts(value, encoding, errors)
+
+ setattr(self, keyword, value)
+
+ self.pax_headers = pax_headers.copy()
def _block(self, count):
"""Round up a byte count by BLOCKSIZE and return it,
@@ -1464,8 +1487,9 @@ class TarFile(object):
format = DEFAULT_FORMAT # The format to use when creating an archive.
- encoding = ENCODING # Transfer UTF-8 strings from POSIX.1-2001
- # headers to this encoding.
+ encoding = ENCODING # Encoding for 8-bit character strings.
+
+ errors = None # Error handler for unicode conversion.
tarinfo = TarInfo # The default TarInfo class to use.
@@ -1473,7 +1497,7 @@ class TarFile(object):
def __init__(self, name=None, mode="r", fileobj=None, format=None,
tarinfo=None, dereference=None, ignore_zeros=None, encoding=None,
- pax_headers=None, debug=None, errorlevel=None):
+ errors=None, pax_headers=None, debug=None, errorlevel=None):
"""Open an (uncompressed) tar archive `name'. `mode' is either 'r' to
read from an existing archive, 'a' to append data to an existing
file or 'w' to create a new file overwriting an existing one. `mode'
@@ -1492,7 +1516,7 @@ class TarFile(object):
# Create nonexistent files in append mode.
self.mode = "w"
self._mode = "wb"
- fileobj = _open(name, self._mode)
+ fileobj = bltn_open(name, self._mode)
self._extfileobj = False
else:
if name is None and hasattr(fileobj, "name"):
@@ -1514,6 +1538,19 @@ class TarFile(object):
self.ignore_zeros = ignore_zeros
if encoding is not None:
self.encoding = encoding
+
+ if errors is not None:
+ self.errors = errors
+ elif mode == "r":
+ self.errors = "utf-8"
+ else:
+ self.errors = "strict"
+
+ if pax_headers is not None and self.format == PAX_FORMAT:
+ self.pax_headers = pax_headers
+ else:
+ self.pax_headers = {}
+
if debug is not None:
self.debug = debug
if errorlevel is not None:
@@ -1526,7 +1563,6 @@ class TarFile(object):
self.offset = 0 # current position in the archive file
self.inodes = {} # dictionary caching the inodes of
# archive members already added
- self.pax_headers = {} # save contents of global pax headers
if self.mode == "r":
self.firstmember = None
@@ -1545,9 +1581,8 @@ class TarFile(object):
if self.mode in "aw":
self._loaded = True
- if pax_headers:
- buf = self.tarinfo.create_pax_global_header(
- pax_headers.copy(), self.encoding)
+ if self.pax_headers:
+ buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy())
self.fileobj.write(buf)
self.offset += len(buf)
@@ -1669,7 +1704,7 @@ class TarFile(object):
raise CompressionError("gzip module is not available")
if fileobj is None:
- fileobj = _open(name, mode + "b")
+ fileobj = bltn_open(name, mode + "b")
try:
t = cls.taropen(name, mode,
@@ -1819,8 +1854,6 @@ class TarFile(object):
self.inodes[inode] = arcname
elif stat.S_ISDIR(stmd):
type = DIRTYPE
- if arcname[-1:] != "/":
- arcname += "/"
elif stat.S_ISFIFO(stmd):
type = FIFOTYPE
elif stat.S_ISLNK(stmd):
@@ -1930,7 +1963,7 @@ class TarFile(object):
# Append the tar header and data to the archive.
if tarinfo.isreg():
- f = _open(name, "rb")
+ f = bltn_open(name, "rb")
self.addfile(tarinfo, f)
f.close()
@@ -1954,7 +1987,7 @@ class TarFile(object):
tarinfo = copy.copy(tarinfo)
- buf = tarinfo.tobuf(self.format, self.encoding)
+ buf = tarinfo.tobuf(self.format, self.encoding, self.errors)
self.fileobj.write(buf)
self.offset += len(buf)
@@ -2141,7 +2174,7 @@ class TarFile(object):
"""Make a file called targetpath.
"""
source = self.extractfile(tarinfo)
- target = _open(targetpath, "wb")
+ target = bltn_open(targetpath, "wb")
copyfileobj(source, target)
source.close()
target.close()
@@ -2483,4 +2516,5 @@ def is_tarfile(name):
except TarError:
return False
+bltn_open = open
open = TarFile.open
diff --git a/Lib/test/dis_module.py b/Lib/test/dis_module.py
new file mode 100644
index 00000000000..afbf600fdee
--- /dev/null
+++ b/Lib/test/dis_module.py
@@ -0,0 +1,5 @@
+
+# A simple module for testing the dis module.
+
+def f(): pass
+def g(): pass
diff --git a/Lib/test/infinite_reload.py b/Lib/test/infinite_reload.py
deleted file mode 100644
index bfbec91b0a1..00000000000
--- a/Lib/test/infinite_reload.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# For testing http://python.org/sf/742342, which reports that Python
-# segfaults (infinite recursion in C) in the presence of infinite
-# reload()ing. This module is imported by test_import.py:test_infinite_reload
-# to make sure this doesn't happen any more.
-
-import infinite_reload
-reload(infinite_reload)
diff --git a/Lib/test/output/test_pkg b/Lib/test/output/test_pkg
index 8a5ab8de190..d1a891b1047 100644
--- a/Lib/test/output/test_pkg
+++ b/Lib/test/output/test_pkg
@@ -15,8 +15,6 @@ running test t3
t3 loading
t3.sub.subsub loading
t3 t3.sub t3.sub.subsub
-t3 loading
-t3.sub.subsub loading
running test t4
t4 loading
t4.sub.subsub loading
diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py
index 90a030d6ad2..de0b9f0fffb 100755
--- a/Lib/test/regrtest.py
+++ b/Lib/test/regrtest.py
@@ -669,7 +669,8 @@ def dash_R(the_module, test, indirect_test, huntrleaks):
indirect_test()
else:
def run_the_test():
- reload(the_module)
+ del sys.modules[the_module.__name__]
+ exec('import ' + the_module.__name__)
deltas = []
nwarmup, ntracked, fname = huntrleaks
@@ -841,7 +842,6 @@ _expectations = {
test_signal
test_sunaudiodev
test_threadsignals
- test_timing
test_wait3
test_wait4
""",
@@ -894,7 +894,6 @@ _expectations = {
test_sunaudiodev
test_sundry
test_tarfile
- test_timing
""",
'unixware7':
"""
@@ -992,7 +991,6 @@ _expectations = {
test_threaded_import
test_threadedtempfile
test_threading
- test_timing
""",
'darwin':
"""
diff --git a/Lib/test/test_MimeWriter.py b/Lib/test/test_MimeWriter.py
deleted file mode 100644
index feca1631f2b..00000000000
--- a/Lib/test/test_MimeWriter.py
+++ /dev/null
@@ -1,291 +0,0 @@
-"""Test program for MimeWriter module.
-
-The test program was too big to comfortably fit in the MimeWriter
-class, so it's here in its own file.
-
-This should generate Barry's example, modulo some quotes and newlines.
-
-"""
-
-import unittest, sys, StringIO
-from test.test_support import run_unittest
-
-from MimeWriter import MimeWriter
-
-SELLER = '''\
-INTERFACE Seller-1;
-
-TYPE Seller = OBJECT
- DOCUMENTATION "A simple Seller interface to test ILU"
- METHODS
- price():INTEGER,
- END;
-'''
-
-BUYER = '''\
-class Buyer:
- def __setup__(self, maxprice):
- self._maxprice = maxprice
-
- def __main__(self, kos):
- """Entry point upon arrival at a new KOS."""
- broker = kos.broker()
- # B4 == Barry's Big Bass Business :-)
- seller = broker.lookup('Seller_1.Seller', 'B4')
- if seller:
- price = seller.price()
- print 'Seller wants $', price, '... '
- if price > self._maxprice:
- print 'too much!'
- else:
- print "I'll take it!"
- else:
- print 'no seller found here'
-''' # Don't ask why this comment is here
-
-STATE = '''\
-# instantiate a buyer instance and put it in a magic place for the KOS
-# to find.
-__kp__ = Buyer()
-__kp__.__setup__(500)
-'''
-
-SIMPLE_METADATA = [
- ("Interpreter", "python"),
- ("Interpreter-Version", "1.3"),
- ("Owner-Name", "Barry Warsaw"),
- ("Owner-Rendezvous", "bwarsaw@cnri.reston.va.us"),
- ("Home-KSS", "kss.cnri.reston.va.us"),
- ("Identifier", "hdl://cnri.kss/my_first_knowbot"),
- ("Launch-Date", "Mon Feb 12 16:39:03 EST 1996"),
- ]
-
-COMPLEX_METADATA = [
- ("Metadata-Type", "complex"),
- ("Metadata-Key", "connection"),
- ("Access", "read-only"),
- ("Connection-Description", "Barry's Big Bass Business"),
- ("Connection-Id", "B4"),
- ("Connection-Direction", "client"),
- ]
-
-EXTERNAL_METADATA = [
- ("Metadata-Type", "complex"),
- ("Metadata-Key", "generic-interface"),
- ("Access", "read-only"),
- ("Connection-Description", "Generic Interface for All Knowbots"),
- ("Connection-Id", "generic-kp"),
- ("Connection-Direction", "client"),
- ]
-
-
-OUTPUT = '''\
-From: bwarsaw@cnri.reston.va.us
-Date: Mon Feb 12 17:21:48 EST 1996
-To: kss-submit@cnri.reston.va.us
-MIME-Version: 1.0
-Content-Type: multipart/knowbot;
- boundary="801spam999";
- version="0.1"
-
-This is a multi-part message in MIME format.
-
---801spam999
-Content-Type: multipart/knowbot-metadata;
- boundary="802spam999"
-
-
---802spam999
-Content-Type: message/rfc822
-KP-Metadata-Type: simple
-KP-Access: read-only
-
-KPMD-Interpreter: python
-KPMD-Interpreter-Version: 1.3
-KPMD-Owner-Name: Barry Warsaw
-KPMD-Owner-Rendezvous: bwarsaw@cnri.reston.va.us
-KPMD-Home-KSS: kss.cnri.reston.va.us
-KPMD-Identifier: hdl://cnri.kss/my_first_knowbot
-KPMD-Launch-Date: Mon Feb 12 16:39:03 EST 1996
-
---802spam999
-Content-Type: text/isl
-KP-Metadata-Type: complex
-KP-Metadata-Key: connection
-KP-Access: read-only
-KP-Connection-Description: Barry's Big Bass Business
-KP-Connection-Id: B4
-KP-Connection-Direction: client
-
-INTERFACE Seller-1;
-
-TYPE Seller = OBJECT
- DOCUMENTATION "A simple Seller interface to test ILU"
- METHODS
- price():INTEGER,
- END;
-
---802spam999
-Content-Type: message/external-body;
- access-type="URL";
- URL="hdl://cnri.kss/generic-knowbot"
-
-Content-Type: text/isl
-KP-Metadata-Type: complex
-KP-Metadata-Key: generic-interface
-KP-Access: read-only
-KP-Connection-Description: Generic Interface for All Knowbots
-KP-Connection-Id: generic-kp
-KP-Connection-Direction: client
-
-
---802spam999--
-
---801spam999
-Content-Type: multipart/knowbot-code;
- boundary="803spam999"
-
-
---803spam999
-Content-Type: text/plain
-KP-Module-Name: BuyerKP
-
-class Buyer:
- def __setup__(self, maxprice):
- self._maxprice = maxprice
-
- def __main__(self, kos):
- """Entry point upon arrival at a new KOS."""
- broker = kos.broker()
- # B4 == Barry's Big Bass Business :-)
- seller = broker.lookup('Seller_1.Seller', 'B4')
- if seller:
- price = seller.price()
- print 'Seller wants $', price, '... '
- if price > self._maxprice:
- print 'too much!'
- else:
- print "I'll take it!"
- else:
- print 'no seller found here'
-
---803spam999--
-
---801spam999
-Content-Type: multipart/knowbot-state;
- boundary="804spam999"
-KP-Main-Module: main
-
-
---804spam999
-Content-Type: text/plain
-KP-Module-Name: main
-
-# instantiate a buyer instance and put it in a magic place for the KOS
-# to find.
-__kp__ = Buyer()
-__kp__.__setup__(500)
-
---804spam999--
-
---801spam999--
-'''
-
-class MimewriterTest(unittest.TestCase):
-
- def test(self):
- buf = StringIO.StringIO()
-
- # Toplevel headers
-
- toplevel = MimeWriter(buf)
- toplevel.addheader("From", "bwarsaw@cnri.reston.va.us")
- toplevel.addheader("Date", "Mon Feb 12 17:21:48 EST 1996")
- toplevel.addheader("To", "kss-submit@cnri.reston.va.us")
- toplevel.addheader("MIME-Version", "1.0")
-
- # Toplevel body parts
-
- f = toplevel.startmultipartbody("knowbot", "801spam999",
- [("version", "0.1")], prefix=0)
- f.write("This is a multi-part message in MIME format.\n")
-
- # First toplevel body part: metadata
-
- md = toplevel.nextpart()
- md.startmultipartbody("knowbot-metadata", "802spam999")
-
- # Metadata part 1
-
- md1 = md.nextpart()
- md1.addheader("KP-Metadata-Type", "simple")
- md1.addheader("KP-Access", "read-only")
- m = MimeWriter(md1.startbody("message/rfc822"))
- for key, value in SIMPLE_METADATA:
- m.addheader("KPMD-" + key, value)
- m.flushheaders()
- del md1
-
- # Metadata part 2
-
- md2 = md.nextpart()
- for key, value in COMPLEX_METADATA:
- md2.addheader("KP-" + key, value)
- f = md2.startbody("text/isl")
- f.write(SELLER)
- del md2
-
- # Metadata part 3
-
- md3 = md.nextpart()
- f = md3.startbody("message/external-body",
- [("access-type", "URL"),
- ("URL", "hdl://cnri.kss/generic-knowbot")])
- m = MimeWriter(f)
- for key, value in EXTERNAL_METADATA:
- md3.addheader("KP-" + key, value)
- md3.startbody("text/isl")
- # Phantom body doesn't need to be written
-
- md.lastpart()
-
- # Second toplevel body part: code
-
- code = toplevel.nextpart()
- code.startmultipartbody("knowbot-code", "803spam999")
-
- # Code: buyer program source
-
- buyer = code.nextpart()
- buyer.addheader("KP-Module-Name", "BuyerKP")
- f = buyer.startbody("text/plain")
- f.write(BUYER)
-
- code.lastpart()
-
- # Third toplevel body part: state
-
- state = toplevel.nextpart()
- state.addheader("KP-Main-Module", "main")
- state.startmultipartbody("knowbot-state", "804spam999")
-
- # State: a bunch of assignments
-
- st = state.nextpart()
- st.addheader("KP-Module-Name", "main")
- f = st.startbody("text/plain")
- f.write(STATE)
-
- state.lastpart()
-
- # End toplevel body parts
-
- toplevel.lastpart()
-
- self.assertEqual(buf.getvalue(), OUTPUT)
-
-def test_main():
- run_unittest(MimewriterTest)
-
-if __name__ == '__main__':
- test_main()
diff --git a/Lib/test/test___all__.py b/Lib/test/test___all__.py
index cc3780de069..f5dd431f5a6 100644
--- a/Lib/test/test___all__.py
+++ b/Lib/test/test___all__.py
@@ -1,7 +1,6 @@
import unittest
from test.test_support import verbose, run_unittest
import sys
-import warnings
class AllTest(unittest.TestCase):
@@ -34,7 +33,6 @@ class AllTest(unittest.TestCase):
self.check_all("CGIHTTPServer")
self.check_all("ConfigParser")
self.check_all("Cookie")
- self.check_all("MimeWriter")
self.check_all("Queue")
self.check_all("SimpleHTTPServer")
self.check_all("SocketServer")
@@ -92,7 +90,6 @@ class AllTest(unittest.TestCase):
self.check_all("mhlib")
self.check_all("mimetools")
self.check_all("mimetypes")
- self.check_all("mimify")
self.check_all("multifile")
self.check_all("netrc")
self.check_all("nntplib")
diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py
index 4e1375a1bf4..1c1998d1e70 100644
--- a/Lib/test/test_builtin.py
+++ b/Lib/test/test_builtin.py
@@ -1485,14 +1485,6 @@ class BuiltinTest(unittest.TestCase):
fp.close()
unlink(TESTFN)
- def test_reload(self):
- import marshal
- reload(marshal)
- import string
- reload(string)
- ## import sys
- ## self.assertRaises(ImportError, reload, sys)
-
def test_repr(self):
self.assertEqual(repr(''), '\'\'')
self.assertEqual(repr(0), '0')
diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py
index dfb307ddaf9..f1bd3e7667d 100644
--- a/Lib/test/test_dis.py
+++ b/Lib/test/test_dis.py
@@ -89,6 +89,18 @@ _BIG_LINENO_FORMAT = """\
7 RETURN_VALUE
"""
+dis_module_expected_results = """\
+Disassembly of f:
+ 4 0 LOAD_CONST 0 (None)
+ 3 RETURN_VALUE
+
+Disassembly of g:
+ 5 0 LOAD_CONST 0 (None)
+ 3 RETURN_VALUE
+
+"""
+
+
class DisTests(unittest.TestCase):
def do_disassembly_test(self, func, expected):
s = StringIO.StringIO()
@@ -127,6 +139,7 @@ class DisTests(unittest.TestCase):
self.do_disassembly_test(bug708901, dis_bug708901)
def test_bug_1333982(self):
+ # XXX: re-enable this test!
# This one is checking bytecodes generated for an `assert` statement,
# so fails if the tests are run with -O. Skip this test then.
pass # Test has been disabled due to change in the way
@@ -153,9 +166,12 @@ class DisTests(unittest.TestCase):
expected = _BIG_LINENO_FORMAT % (i + 2)
self.do_disassembly_test(func(i), expected)
+ def test_big_linenos(self):
+ from test import dis_module
+ self.do_disassembly_test(dis_module, dis_module_expected_results)
+
def test_main():
run_unittest(DisTests)
-
if __name__ == "__main__":
test_main()
diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py
index 3adb98c31ff..5730a59dd67 100644
--- a/Lib/test/test_doctest.py
+++ b/Lib/test/test_doctest.py
@@ -2409,7 +2409,7 @@ import trace, sys, re, StringIO
def test_coverage(coverdir):
tracer = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix,],
trace=0, count=1)
- tracer.run('reload(doctest); test_main()')
+ tracer.run('test_main()')
r = tracer.results()
print('Writing coverage results...')
r.write_results(show_missing=True, summary=True,
diff --git a/Lib/test/test_hmac.py b/Lib/test/test_hmac.py
index 9d094d28940..d28490d7dab 100644
--- a/Lib/test/test_hmac.py
+++ b/Lib/test/test_hmac.py
@@ -1,5 +1,5 @@
import hmac
-import sha
+from hashlib import sha1
import unittest
from test import test_support
@@ -43,7 +43,7 @@ class TestVectorsTestCase(unittest.TestCase):
def test_sha_vectors(self):
def shatest(key, data, digest):
- h = hmac.HMAC(key, data, digestmod=sha)
+ h = hmac.HMAC(key, data, digestmod=sha1)
self.assertEqual(h.hexdigest().upper(), digest.upper())
shatest(chr(0x0b) * 20,
@@ -95,11 +95,11 @@ class ConstructorTestCase(unittest.TestCase):
def test_withmodule(self):
# Constructor call with text and digest module.
- import sha
+ from hashlib import sha1
try:
- h = hmac.HMAC("key", "", sha)
+ h = hmac.HMAC("key", "", sha1)
except:
- self.fail("Constructor call with sha module raised exception.")
+ self.fail("Constructor call with hashlib.sha1 raised exception.")
class SanityTestCase(unittest.TestCase):
diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py
index 87907c82bdd..193de404d01 100644
--- a/Lib/test/test_import.py
+++ b/Lib/test/test_import.py
@@ -6,6 +6,7 @@ import random
import sys
import py_compile
import warnings
+from test.test_support import unlink
def remove_files(name):
@@ -63,22 +64,9 @@ class ImportTest(unittest.TestCase):
self.assertEquals(mod.b, b,
"module loaded (%s) but contents invalid" % mod)
finally:
- os.unlink(source)
-
- try:
- try:
- reload(mod)
- except ImportError as err:
- self.fail("import from .pyc/.pyo failed: %s" % err)
- finally:
- try:
- os.unlink(pyc)
- except OSError:
- pass
- try:
- os.unlink(pyo)
- except OSError:
- pass
+ unlink(source)
+ unlink(pyc)
+ unlink(pyo)
del sys.modules[TESTFN]
sys.path.insert(0, os.curdir)
@@ -136,6 +124,8 @@ class ImportTest(unittest.TestCase):
# New in 2.4, we shouldn't be able to import that no matter how often
# we try.
sys.path.insert(0, os.curdir)
+ if TESTFN in sys.modules:
+ del sys.modules[TESTFN]
try:
for i in 1, 2, 3:
try:
@@ -149,60 +139,6 @@ class ImportTest(unittest.TestCase):
sys.path.pop(0)
remove_files(TESTFN)
- def test_failing_reload(self):
- # A failing reload should leave the module object in sys.modules.
- source = TESTFN + os.extsep + "py"
- f = open(source, "w")
- print("a = 1", file=f)
- print("b = 2", file=f)
- f.close()
-
- sys.path.insert(0, os.curdir)
- try:
- mod = __import__(TESTFN)
- self.assert_(TESTFN in sys.modules, "expected module in sys.modules")
- self.assertEquals(mod.a, 1, "module has wrong attribute values")
- self.assertEquals(mod.b, 2, "module has wrong attribute values")
-
- # On WinXP, just replacing the .py file wasn't enough to
- # convince reload() to reparse it. Maybe the timestamp didn't
- # move enough. We force it to get reparsed by removing the
- # compiled file too.
- remove_files(TESTFN)
-
- # Now damage the module.
- f = open(source, "w")
- print("a = 10", file=f)
- print("b = 20//0", file=f)
- f.close()
-
- self.assertRaises(ZeroDivisionError, reload, mod)
-
- # But we still expect the module to be in sys.modules.
- mod = sys.modules.get(TESTFN)
- self.failIf(mod is None, "expected module to still be in sys.modules")
-
- # We should have replaced a w/ 10, but the old b value should
- # stick.
- self.assertEquals(mod.a, 10, "module has wrong attribute values")
- self.assertEquals(mod.b, 2, "module has wrong attribute values")
-
- finally:
- sys.path.pop(0)
- remove_files(TESTFN)
- if TESTFN in sys.modules:
- del sys.modules[TESTFN]
-
- def test_infinite_reload(self):
- # Bug #742342 reports that Python segfaults (infinite recursion in C)
- # when faced with self-recursive reload()ing.
-
- sys.path.insert(0, os.path.dirname(__file__))
- try:
- import infinite_reload
- finally:
- sys.path.pop(0)
-
def test_import_name_binding(self):
# import x.y.z binds x in the current namespace
import test as x
diff --git a/Lib/test/test_importhooks.py b/Lib/test/test_importhooks.py
index 02268abbd1b..18f3fc40b9a 100644
--- a/Lib/test/test_importhooks.py
+++ b/Lib/test/test_importhooks.py
@@ -190,10 +190,6 @@ class ImportHooksTestCase(ImportHooksBaseTestCase):
import reloadmodule
self.failIf(hasattr(reloadmodule,'reloaded'))
- TestImporter.modules['reloadmodule'] = (False, reload_co)
- reload(reloadmodule)
- self.failUnless(hasattr(reloadmodule,'reloaded'))
-
import hooktestpackage.newrel
self.assertEqual(hooktestpackage.newrel.get_name(),
"hooktestpackage.newrel")
diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py
index 6fe14375aaa..bdd7c34eb0c 100644
--- a/Lib/test/test_inspect.py
+++ b/Lib/test/test_inspect.py
@@ -26,7 +26,7 @@ import __builtin__
try:
1/0
except:
- tb = sys.exc_traceback
+ tb = sys.exc_info()[2]
git = mod.StupidGit()
diff --git a/Lib/test/test_optparse.py b/Lib/test/test_optparse.py
index 811ec3486a9..751f7a220fa 100644
--- a/Lib/test/test_optparse.py
+++ b/Lib/test/test_optparse.py
@@ -27,12 +27,6 @@ from optparse import make_option, Option, IndentedHelpFormatter, \
from optparse import _match_abbrev
from optparse import _parse_num
-# Do the right thing with boolean values for all known Python versions.
-try:
- True, False
-except NameError:
- (True, False) = (1, 0)
-
retype = type(re.compile(''))
class InterceptedError(Exception):
diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
index ed044f60cd4..9673172ce6a 100644
--- a/Lib/test/test_os.py
+++ b/Lib/test/test_os.py
@@ -381,7 +381,7 @@ class WalkTests(unittest.TestCase):
os.remove(dirname)
os.rmdir(test_support.TESTFN)
-class MakedirTests (unittest.TestCase):
+class MakedirTests(unittest.TestCase):
def setUp(self):
os.mkdir(test_support.TESTFN)
@@ -400,9 +400,6 @@ class MakedirTests (unittest.TestCase):
'dir5', 'dir6')
os.makedirs(path)
-
-
-
def tearDown(self):
path = os.path.join(test_support.TESTFN, 'dir1', 'dir2', 'dir3',
'dir4', 'dir5', 'dir6')
@@ -414,7 +411,7 @@ class MakedirTests (unittest.TestCase):
os.removedirs(path)
-class DevNullTests (unittest.TestCase):
+class DevNullTests(unittest.TestCase):
def test_devnull(self):
f = open(os.devnull, 'w')
f.write('hello')
@@ -423,7 +420,7 @@ class DevNullTests (unittest.TestCase):
self.assertEqual(f.read(), '')
f.close()
-class URandomTests (unittest.TestCase):
+class URandomTests(unittest.TestCase):
def test_urandom(self):
try:
self.assertEqual(len(os.urandom(1)), 1)
@@ -433,6 +430,10 @@ class URandomTests (unittest.TestCase):
except NotImplementedError:
pass
+class ExecTests(unittest.TestCase):
+ def test_execvpe_with_bad_program(self):
+ self.assertRaises(OSError, os.execvpe, 'no such app-', [], None)
+
class Win32ErrorTests(unittest.TestCase):
def test_rename(self):
self.assertRaises(WindowsError, os.rename, test_support.TESTFN, test_support.TESTFN+".bak")
@@ -469,6 +470,7 @@ def test_main():
MakedirTests,
DevNullTests,
URandomTests,
+ ExecTests,
Win32ErrorTests
)
diff --git a/Lib/test/test_pkg.py b/Lib/test/test_pkg.py
index ad9cc1a4383..1a3f2a96b91 100644
--- a/Lib/test/test_pkg.py
+++ b/Lib/test/test_pkg.py
@@ -120,9 +120,6 @@ print(dir())
"""
import t3.sub.subsub
print(t3.__name__, t3.sub.__name__, t3.sub.subsub.__name__)
-reload(t3)
-reload(t3.sub)
-reload(t3.sub.subsub)
"""),
("t4", [
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
index 0592787c446..ec004bf5c53 100644
--- a/Lib/test/test_subprocess.py
+++ b/Lib/test/test_subprocess.py
@@ -604,8 +604,16 @@ class ProcessTestCase(unittest.TestCase):
self.assertRaises(ValueError, subprocess.call,
[sys.executable,
"-c", "import sys; sys.exit(47)"],
+ stdout=subprocess.PIPE,
close_fds=True)
+ def test_close_fds(self):
+ # close file descriptors
+ rc = subprocess.call([sys.executable, "-c",
+ "import sys; sys.exit(47)"],
+ close_fds=True)
+ self.assertEqual(rc, 47)
+
def test_shell_sequence(self):
# Run command through the shell (sequence)
newenv = os.environ.copy()
diff --git a/Lib/test/test_sundry.py b/Lib/test/test_sundry.py
index eb4149f916f..3c0346da561 100644
--- a/Lib/test/test_sundry.py
+++ b/Lib/test/test_sundry.py
@@ -4,9 +4,6 @@ from test.test_support import guard_warnings_filter
import warnings
with guard_warnings_filter():
- warnings.filterwarnings('ignore', r".*posixfile",
- DeprecationWarning)
-
from test.test_support import verbose
import BaseHTTPServer
@@ -33,7 +30,6 @@ with guard_warnings_filter():
import linecache
import macurl2path
import mailcap
- import mimify
import mutex
import nntplib
import nturl2path
@@ -42,7 +38,6 @@ with guard_warnings_filter():
import pdb
import pipes
#import poplib
- import posixfile
import pstats
import py_compile
import pydoc
diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py
index 2b48ea64fe9..ab60a563f95 100644
--- a/Lib/test/test_syntax.py
+++ b/Lib/test/test_syntax.py
@@ -27,15 +27,13 @@ In ast.c, syntax errors are raised by calling ast_error().
Errors from set_context():
-TODO(jhylton): "assignment to None" is inconsistent with other messages
-
>>> obj.None = 1
Traceback (most recent call last):
-SyntaxError: assignment to None (<doctest test.test_syntax[1]>, line 1)
+SyntaxError: invalid syntax
>>> None = 1
Traceback (most recent call last):
-SyntaxError: assignment to None (<doctest test.test_syntax[2]>, line 1)
+SyntaxError: assignment to keyword (<doctest test.test_syntax[2]>, line 1)
It's a syntax error to assign to the empty tuple. Why isn't it an
error to assign to the empty list? It will always raise some error at
@@ -95,7 +93,7 @@ From compiler_complex_args():
>>> def f(None=1):
... pass
Traceback (most recent call last):
-SyntaxError: assignment to None (<doctest test.test_syntax[14]>, line 1)
+SyntaxError: invalid syntax
From ast_for_arguments():
@@ -108,17 +106,17 @@ SyntaxError: non-default argument follows default argument (<doctest test.test_s
>>> def f(x, None):
... pass
Traceback (most recent call last):
-SyntaxError: assignment to None (<doctest test.test_syntax[16]>, line 1)
+SyntaxError: invalid syntax
>>> def f(*None):
... pass
Traceback (most recent call last):
-SyntaxError: assignment to None (<doctest test.test_syntax[17]>, line 1)
+SyntaxError: invalid syntax
>>> def f(**None):
... pass
Traceback (most recent call last):
-SyntaxError: assignment to None (<doctest test.test_syntax[18]>, line 1)
+SyntaxError: invalid syntax
From ast_for_funcdef():
@@ -126,7 +124,7 @@ From ast_for_funcdef():
>>> def None(x):
... pass
Traceback (most recent call last):
-SyntaxError: assignment to None (<doctest test.test_syntax[19]>, line 1)
+SyntaxError: invalid syntax
From ast_for_call():
@@ -231,7 +229,7 @@ Traceback (most recent call last):
SyntaxError: augmented assignment to generator expression not possible (<doctest test.test_syntax[31]>, line 1)
>>> None += 1
Traceback (most recent call last):
-SyntaxError: assignment to None (<doctest test.test_syntax[32]>, line 1)
+SyntaxError: assignment to keyword (<doctest test.test_syntax[32]>, line 1)
>>> f() += 1
Traceback (most recent call last):
SyntaxError: illegal expression for augmented assignment (<doctest test.test_syntax[33]>, line 1)
diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py
index 8862661e05d..b038ff4e138 100644
--- a/Lib/test/test_sys.py
+++ b/Lib/test/test_sys.py
@@ -63,47 +63,6 @@ class SysModuleTest(unittest.TestCase):
# FIXME: testing the code for a lost or replaced excepthook in
# Python/pythonrun.c::PyErr_PrintEx() is tricky.
- def test_exc_clear(self):
- self.assertRaises(TypeError, sys.exc_clear, 42)
-
- # Verify that exc_info is present and matches exc, then clear it, and
- # check that it worked.
- def clear_check(exc):
- typ, value, traceback = sys.exc_info()
- self.assert_(typ is not None)
- self.assert_(value is exc)
- self.assert_(traceback is not None)
-
- sys.exc_clear()
-
- typ, value, traceback = sys.exc_info()
- self.assert_(typ is None)
- self.assert_(value is None)
- self.assert_(traceback is None)
-
- def clear():
- try:
- raise ValueError, 42
- except ValueError as exc:
- clear_check(exc)
-
- # Raise an exception and check that it can be cleared
- clear()
-
- # Verify that a frame currently handling an exception is
- # unaffected by calling exc_clear in a nested frame.
- try:
- raise ValueError, 13
- except ValueError as exc:
- typ1, value1, traceback1 = sys.exc_info()
- clear()
- typ2, value2, traceback2 = sys.exc_info()
-
- self.assert_(typ1 is typ2)
- self.assert_(value1 is exc)
- self.assert_(value1 is value2)
- self.assert_(traceback1 is traceback2)
-
def test_exit(self):
self.assertRaises(TypeError, sys.exit, 42, 42)
diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py
index 312050bef99..636a45ed407 100644
--- a/Lib/test/test_tarfile.py
+++ b/Lib/test/test_tarfile.py
@@ -1,4 +1,4 @@
-# encoding: iso8859-1
+# -*- coding: iso-8859-15 -*-
import sys
import os
@@ -372,9 +372,9 @@ class LongnameTest(ReadTest):
def test_read_longname(self):
# Test reading of longname (bug #1471427).
- name = self.subdir + "/" + "123/" * 125 + "longname"
+ longname = self.subdir + "/" + "123/" * 125 + "longname"
try:
- tarinfo = self.tar.getmember(name)
+ tarinfo = self.tar.getmember(longname)
except KeyError:
self.fail("longname not found")
self.assert_(tarinfo.type != tarfile.DIRTYPE, "read longname as dirtype")
@@ -393,13 +393,24 @@ class LongnameTest(ReadTest):
tarinfo = self.tar.getmember(longname)
offset = tarinfo.offset
self.tar.fileobj.seek(offset)
- fobj = StringIO.StringIO(self.tar.fileobj.read(1536))
+ fobj = StringIO.StringIO(self.tar.fileobj.read(3 * 512))
self.assertRaises(tarfile.ReadError, tarfile.open, name="foo.tar", fileobj=fobj)
+ def test_header_offset(self):
+ # Test if the start offset of the TarInfo object includes
+ # the preceding extended header.
+ longname = self.subdir + "/" + "123/" * 125 + "longname"
+ offset = self.tar.getmember(longname).offset
+ fobj = open(tarname)
+ fobj.seek(offset)
+ tarinfo = tarfile.TarInfo.frombuf(fobj.read(512))
+ self.assertEqual(tarinfo.type, self.longnametype)
+
class GNUReadTest(LongnameTest):
subdir = "gnu"
+ longnametype = tarfile.GNUTYPE_LONGNAME
def test_sparse_file(self):
tarinfo1 = self.tar.getmember("ustar/sparse")
@@ -410,26 +421,40 @@ class GNUReadTest(LongnameTest):
"sparse file extraction failed")
-class PaxReadTest(ReadTest):
+class PaxReadTest(LongnameTest):
subdir = "pax"
+ longnametype = tarfile.XHDTYPE
- def test_pax_globheaders(self):
+ def test_pax_global_headers(self):
tar = tarfile.open(tarname, encoding="iso8859-1")
+
tarinfo = tar.getmember("pax/regtype1")
self.assertEqual(tarinfo.uname, "foo")
self.assertEqual(tarinfo.gname, "bar")
- self.assertEqual(tarinfo.pax_headers.get("VENDOR.umlauts"), "ÄÖÜäöüß")
+ self.assertEqual(tarinfo.pax_headers.get("VENDOR.umlauts"), u"ÄÖÜäöüß")
tarinfo = tar.getmember("pax/regtype2")
self.assertEqual(tarinfo.uname, "")
self.assertEqual(tarinfo.gname, "bar")
- self.assertEqual(tarinfo.pax_headers.get("VENDOR.umlauts"), "ÄÖÜäöüß")
+ self.assertEqual(tarinfo.pax_headers.get("VENDOR.umlauts"), u"ÄÖÜäöüß")
tarinfo = tar.getmember("pax/regtype3")
self.assertEqual(tarinfo.uname, "tarfile")
self.assertEqual(tarinfo.gname, "tarfile")
- self.assertEqual(tarinfo.pax_headers.get("VENDOR.umlauts"), "ÄÖÜäöüß")
+ self.assertEqual(tarinfo.pax_headers.get("VENDOR.umlauts"), u"ÄÖÜäöüß")
+
+ def test_pax_number_fields(self):
+ # All following number fields are read from the pax header.
+ tar = tarfile.open(tarname, encoding="iso8859-1")
+ tarinfo = tar.getmember("pax/regtype4")
+ self.assertEqual(tarinfo.size, 7011)
+ self.assertEqual(tarinfo.uid, 123)
+ self.assertEqual(tarinfo.gid, 123)
+ self.assertEqual(tarinfo.mtime, 1041808783.0)
+ self.assertEqual(type(tarinfo.mtime), float)
+ self.assertEqual(float(tarinfo.pax_headers["atime"]), 1041808783.0)
+ self.assertEqual(float(tarinfo.pax_headers["ctime"]), 1041808783.0)
class WriteTest(unittest.TestCase):
@@ -700,68 +725,160 @@ class PaxWriteTest(GNUWriteTest):
n = tar.getmembers()[0].name
self.assert_(name == n, "PAX longname creation failed")
- def test_iso8859_15_filename(self):
- self._test_unicode_filename("iso8859-15")
+ def test_pax_global_header(self):
+ pax_headers = {
+ u"foo": u"bar",
+ u"uid": u"0",
+ u"mtime": u"1.23",
+ u"test": u"äöü",
+ u"äöü": u"test"}
+
+ tar = tarfile.open(tmpname, "w", format=tarfile.PAX_FORMAT, \
+ pax_headers=pax_headers)
+ tar.addfile(tarfile.TarInfo("test"))
+ tar.close()
+
+ # Test if the global header was written correctly.
+ tar = tarfile.open(tmpname, encoding="iso8859-1")
+ self.assertEqual(tar.pax_headers, pax_headers)
+ self.assertEqual(tar.getmembers()[0].pax_headers, pax_headers)
+
+ # Test if all the fields are unicode.
+ for key, val in tar.pax_headers.items():
+ self.assert_(type(key) is unicode)
+ self.assert_(type(val) is unicode)
+ if key in tarfile.PAX_NUMBER_FIELDS:
+ try:
+ tarfile.PAX_NUMBER_FIELDS[key](val)
+ except (TypeError, ValueError):
+ self.fail("unable to convert pax header field")
+
+ def test_pax_extended_header(self):
+ # The fields from the pax header have priority over the
+ # TarInfo.
+ pax_headers = {u"path": u"foo", u"uid": u"123"}
+
+ tar = tarfile.open(tmpname, "w", format=tarfile.PAX_FORMAT, encoding="iso8859-1")
+ t = tarfile.TarInfo()
+ t.name = u"äöü" # non-ASCII
+ t.uid = 8**8 # too large
+ t.pax_headers = pax_headers
+ tar.addfile(t)
+ tar.close()
+
+ tar = tarfile.open(tmpname, encoding="iso8859-1")
+ t = tar.getmembers()[0]
+ self.assertEqual(t.pax_headers, pax_headers)
+ self.assertEqual(t.name, "foo")
+ self.assertEqual(t.uid, 123)
+
+
+class UstarUnicodeTest(unittest.TestCase):
+ # All *UnicodeTests FIXME
+
+ format = tarfile.USTAR_FORMAT
+
+ def test_iso8859_1_filename(self):
+ self._test_unicode_filename("iso8859-1")
+
+ def test_utf7_filename(self):
+ self._test_unicode_filename("utf7")
def test_utf8_filename(self):
self._test_unicode_filename("utf8")
- def test_utf16_filename(self):
- self._test_unicode_filename("utf16")
-
def _test_unicode_filename(self, encoding):
- tar = tarfile.open(tmpname, "w", format=tarfile.PAX_FORMAT)
- name = "\u20ac".encode(encoding) # Euro sign
- tar.encoding = encoding
+ tar = tarfile.open(tmpname, "w", format=self.format, encoding=encoding, errors="strict")
+ name = "äöü"
tar.addfile(tarfile.TarInfo(name))
tar.close()
tar = tarfile.open(tmpname, encoding=encoding)
- self.assertEqual(tar.getmembers()[0].name, name)
+ self.assert_(type(tar.getnames()[0]) is not unicode)
+ self.assertEqual(tar.getmembers()[0].name, name.encode(encoding))
tar.close()
def test_unicode_filename_error(self):
- # The euro sign filename cannot be translated to iso8859-1 encoding.
- tar = tarfile.open(tmpname, "w", format=tarfile.PAX_FORMAT, encoding="utf8")
- name = "\u20ac".encode("utf8") # Euro sign
- tar.addfile(tarfile.TarInfo(name))
+ tar = tarfile.open(tmpname, "w", format=self.format, encoding="ascii", errors="strict")
+ tarinfo = tarfile.TarInfo()
+
+ tarinfo.name = "äöü"
+ if self.format == tarfile.PAX_FORMAT:
+ self.assertRaises(UnicodeError, tar.addfile, tarinfo)
+ else:
+ tar.addfile(tarinfo)
+
+ tarinfo.name = u"äöü"
+ self.assertRaises(UnicodeError, tar.addfile, tarinfo)
+
+ tarinfo.name = "foo"
+ tarinfo.uname = u"äöü"
+ self.assertRaises(UnicodeError, tar.addfile, tarinfo)
+
+ def test_unicode_argument(self):
+ tar = tarfile.open(tarname, "r", encoding="iso8859-1", errors="strict")
+ for t in tar:
+ self.assert_(type(t.name) is str)
+ self.assert_(type(t.linkname) is str)
+ self.assert_(type(t.uname) is str)
+ self.assert_(type(t.gname) is str)
tar.close()
- self.assertRaises(UnicodeError, tarfile.open, tmpname, encoding="iso8859-1")
+ def test_uname_unicode(self):
+ for name in (u"äöü", "äöü"):
+ t = tarfile.TarInfo("foo")
+ t.uname = name
+ t.gname = name
- def test_pax_headers(self):
- self._test_pax_headers({"foo": "bar", "uid": 0, "mtime": 1.23})
+ fobj = StringIO.StringIO()
+ tar = tarfile.open("foo.tar", mode="w", fileobj=fobj, format=self.format, encoding="iso8859-1")
+ tar.addfile(t)
+ tar.close()
+ fobj.seek(0)
- self._test_pax_headers({"euro": "\u20ac".encode("utf8")})
+ tar = tarfile.open("foo.tar", fileobj=fobj, encoding="iso8859-1")
+ t = tar.getmember("foo")
+ self.assertEqual(t.uname, "äöü")
+ self.assertEqual(t.gname, "äöü")
- self._test_pax_headers({"euro": "\u20ac"},
- {"euro": "\u20ac".encode("utf8")})
+class GNUUnicodeTest(UstarUnicodeTest):
- self._test_pax_headers({"\u20ac": "euro"},
- {"\u20ac".encode("utf8"): "euro"})
+ format = tarfile.GNU_FORMAT
- def _test_pax_headers(self, pax_headers, cmp_headers=None):
- if cmp_headers is None:
- cmp_headers = pax_headers
- tar = tarfile.open(tmpname, "w", format=tarfile.PAX_FORMAT, \
- pax_headers=pax_headers, encoding="utf8")
- tar.addfile(tarfile.TarInfo("test"))
- tar.close()
+class PaxUnicodeTest(UstarUnicodeTest):
- tar = tarfile.open(tmpname, encoding="utf8")
- self.assertEqual(tar.pax_headers, cmp_headers)
+ format = tarfile.PAX_FORMAT
- def test_truncated_header(self):
- tar = tarfile.open(tmpname, "w", format=tarfile.PAX_FORMAT)
- tarinfo = tarfile.TarInfo("123/" * 126 + "longname")
- tar.addfile(tarinfo)
+ def _create_unicode_name(self, name):
+ tar = tarfile.open(tmpname, "w", format=self.format)
+ t = tarfile.TarInfo()
+ t.pax_headers["path"] = name
+ tar.addfile(t)
tar.close()
- # Simulate a premature EOF.
- open(tmpname, "rb+").truncate(1536)
- tar = tarfile.open(tmpname)
- self.assertEqual(tar.getmembers(), [])
+ def test_error_handlers(self):
+ # Test if the unicode error handlers work correctly for characters
+ # that cannot be expressed in a given encoding.
+ self._create_unicode_name(u"äöü")
+
+ for handler, name in (("utf-8", u"äöü".encode("utf8")),
+ ("replace", "???"), ("ignore", "")):
+ tar = tarfile.open(tmpname, format=self.format, encoding="ascii",
+ errors=handler)
+ self.assertEqual(tar.getnames()[0], name)
+
+ self.assertRaises(UnicodeError, tarfile.open, tmpname,
+ encoding="ascii", errors="strict")
+
+ def test_error_handler_utf8(self):
+ # Create a pathname that has one component representable using
+ # iso8859-1 and the other only in iso8859-15.
+ self._create_unicode_name(u"äöü/¤")
+
+ tar = tarfile.open(tmpname, format=self.format, encoding="iso8859-1",
+ errors="utf-8")
+ self.assertEqual(tar.getnames()[0], "äöü/" + u"¤".encode("utf8"))
class AppendTest(unittest.TestCase):
@@ -836,63 +953,58 @@ class LimitsTest(unittest.TestCase):
def test_ustar_limits(self):
# 100 char name
tarinfo = tarfile.TarInfo("0123456789" * 10)
- tarinfo.create_ustar_header()
+ tarinfo.tobuf(tarfile.USTAR_FORMAT)
# 101 char name that cannot be stored
tarinfo = tarfile.TarInfo("0123456789" * 10 + "0")
- self.assertRaises(ValueError, tarinfo.create_ustar_header)
+ self.assertRaises(ValueError, tarinfo.tobuf, tarfile.USTAR_FORMAT)
# 256 char name with a slash at pos 156
tarinfo = tarfile.TarInfo("123/" * 62 + "longname")
- tarinfo.create_ustar_header()
+ tarinfo.tobuf(tarfile.USTAR_FORMAT)
# 256 char name that cannot be stored
tarinfo = tarfile.TarInfo("1234567/" * 31 + "longname")
- self.assertRaises(ValueError, tarinfo.create_ustar_header)
+ self.assertRaises(ValueError, tarinfo.tobuf, tarfile.USTAR_FORMAT)
# 512 char name
tarinfo = tarfile.TarInfo("123/" * 126 + "longname")
- self.assertRaises(ValueError, tarinfo.create_ustar_header)
+ self.assertRaises(ValueError, tarinfo.tobuf, tarfile.USTAR_FORMAT)
# 512 char linkname
tarinfo = tarfile.TarInfo("longlink")
tarinfo.linkname = "123/" * 126 + "longname"
- self.assertRaises(ValueError, tarinfo.create_ustar_header)
+ self.assertRaises(ValueError, tarinfo.tobuf, tarfile.USTAR_FORMAT)
# uid > 8 digits
tarinfo = tarfile.TarInfo("name")
tarinfo.uid = 010000000
- self.assertRaises(ValueError, tarinfo.create_ustar_header)
+ self.assertRaises(ValueError, tarinfo.tobuf, tarfile.USTAR_FORMAT)
def test_gnu_limits(self):
tarinfo = tarfile.TarInfo("123/" * 126 + "longname")
- tarinfo.create_gnu_header()
+ tarinfo.tobuf(tarfile.GNU_FORMAT)
tarinfo = tarfile.TarInfo("longlink")
tarinfo.linkname = "123/" * 126 + "longname"
- tarinfo.create_gnu_header()
+ tarinfo.tobuf(tarfile.GNU_FORMAT)
# uid >= 256 ** 7
tarinfo = tarfile.TarInfo("name")
tarinfo.uid = 04000000000000000000
- self.assertRaises(ValueError, tarinfo.create_gnu_header)
+ self.assertRaises(ValueError, tarinfo.tobuf, tarfile.GNU_FORMAT)
def test_pax_limits(self):
- # A 256 char name that can be stored without an extended header.
- tarinfo = tarfile.TarInfo("123/" * 62 + "longname")
- self.assert_(len(tarinfo.create_pax_header("utf8")) == 512,
- "create_pax_header attached superfluous extended header")
-
tarinfo = tarfile.TarInfo("123/" * 126 + "longname")
- tarinfo.create_pax_header("utf8")
+ tarinfo.tobuf(tarfile.PAX_FORMAT)
tarinfo = tarfile.TarInfo("longlink")
tarinfo.linkname = "123/" * 126 + "longname"
- tarinfo.create_pax_header("utf8")
+ tarinfo.tobuf(tarfile.PAX_FORMAT)
tarinfo = tarfile.TarInfo("name")
tarinfo.uid = 04000000000000000000
- tarinfo.create_pax_header("utf8")
+ tarinfo.tobuf(tarfile.PAX_FORMAT)
class GzipMiscReadTest(MiscReadTest):
@@ -940,6 +1052,9 @@ def test_main():
StreamWriteTest,
GNUWriteTest,
PaxWriteTest,
+ UstarUnicodeTest,
+ GNUUnicodeTest,
+ PaxUnicodeTest,
AppendTest,
LimitsTest,
]
diff --git a/Lib/test/test_tokenize.py b/Lib/test/test_tokenize.py
index 0880f0f5033..7e1708e6cf7 100644
--- a/Lib/test/test_tokenize.py
+++ b/Lib/test/test_tokenize.py
@@ -19,7 +19,7 @@ whether the line contains the completion of a statement.
>>> dump_tokens("if False:\\n"
... " # NL\\n"
-... " True = False # NEWLINE\\n")
+... " a = False # NEWLINE\\n")
NAME 'if' (1, 0) (1, 2)
NAME 'False' (1, 3) (1, 8)
OP ':' (1, 8) (1, 9)
@@ -27,7 +27,7 @@ NEWLINE '\\n' (1, 9) (1, 10)
COMMENT '# NL' (2, 4) (2, 8)
NL '\\n' (2, 8) (2, 9)
INDENT ' ' (3, 0) (3, 4)
-NAME 'True' (3, 4) (3, 8)
+NAME 'a' (3, 4) (3, 5)
OP '=' (3, 9) (3, 10)
NAME 'False' (3, 11) (3, 16)
COMMENT '# NEWLINE' (3, 17) (3, 26)
diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py
index 1b9e2f8b6b2..98d3beb4ead 100644
--- a/Lib/test/test_traceback.py
+++ b/Lib/test/test_traceback.py
@@ -52,58 +52,13 @@ class TracebackCases(unittest.TestCase):
self.assert_("^" in err[2])
self.assert_(err[1].find(")") == err[2].find("^"))
- def test_bug737473(self):
- import sys, os, tempfile, time
-
- savedpath = sys.path[:]
- testdir = tempfile.mkdtemp()
- try:
- sys.path.insert(0, testdir)
- testfile = os.path.join(testdir, 'test_bug737473.py')
- print("""
-def test():
- raise ValueError""", file=open(testfile, 'w'))
-
- if 'test_bug737473' in sys.modules:
- del sys.modules['test_bug737473']
- import test_bug737473
-
- try:
- test_bug737473.test()
- except ValueError:
- # this loads source code to linecache
- traceback.extract_tb(sys.exc_traceback)
-
- # If this test runs too quickly, test_bug737473.py's mtime
- # attribute will remain unchanged even if the file is rewritten.
- # Consequently, the file would not reload. So, added a sleep()
- # delay to assure that a new, distinct timestamp is written.
- # Since WinME with FAT32 has multisecond resolution, more than
- # three seconds are needed for this test to pass reliably :-(
- time.sleep(4)
-
- print("""
-def test():
- raise NotImplementedError""", file=open(testfile, 'w'))
- reload(test_bug737473)
- try:
- test_bug737473.test()
- except NotImplementedError:
- src = traceback.extract_tb(sys.exc_traceback)[-1][-1]
- self.failUnlessEqual(src, 'raise NotImplementedError')
- finally:
- sys.path[:] = savedpath
- for f in os.listdir(testdir):
- os.unlink(os.path.join(testdir, f))
- os.rmdir(testdir)
-
def test_members(self):
# Covers Python/structmember.c::listmembers()
try:
1/0
except:
import sys
- sys.exc_traceback.__members__
+ sys.exc_info()[2].__members__
def test_base_exception(self):
# Test that exceptions derived from BaseException are formatted right
diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py
index a62afde815a..7a3f2075fca 100644
--- a/Lib/test/test_urllib.py
+++ b/Lib/test/test_urllib.py
@@ -8,6 +8,10 @@ import os
import mimetools
import tempfile
import StringIO
+import ftplib
+import threading
+import socket
+import time
def hexescape(char):
"""Escape char as RFC 2396 specifies"""
@@ -541,6 +545,76 @@ class Pathname_Tests(unittest.TestCase):
"url2pathname() failed; %s != %s" %
(expect, result))
+# Just commented them out.
+# Can't really tell why keep failing in windows and sparc.
+# Everywhere else they work ok, but on those machines, someteimes
+# fail in one of the tests, sometimes in other. I have a linux, and
+# the tests go ok.
+# If anybody has one of the problematic enviroments, please help!
+# . Facundo
+#
+# def server(evt):
+# serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+# serv.settimeout(3)
+# serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+# serv.bind(("", 9093))
+# serv.listen(5)
+# try:
+# conn, addr = serv.accept()
+# conn.send("1 Hola mundo\n")
+# cantdata = 0
+# while cantdata < 13:
+# data = conn.recv(13-cantdata)
+# cantdata += len(data)
+# time.sleep(.3)
+# conn.send("2 No more lines\n")
+# conn.close()
+# except socket.timeout:
+# pass
+# finally:
+# serv.close()
+# evt.set()
+#
+# class FTPWrapperTests(unittest.TestCase):
+#
+# def setUp(self):
+# ftplib.FTP.port = 9093
+# self.evt = threading.Event()
+# threading.Thread(target=server, args=(self.evt,)).start()
+# time.sleep(.1)
+#
+# def tearDown(self):
+# self.evt.wait()
+#
+# def testBasic(self):
+# # connects
+# ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, [])
+# ftp.ftp.sock.close()
+#
+# def testTimeoutDefault(self):
+# # default
+# ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, [])
+# self.assertTrue(ftp.ftp.sock.gettimeout() is None)
+# ftp.ftp.sock.close()
+#
+# def testTimeoutValue(self):
+# # a value
+# ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, [], timeout=30)
+# self.assertEqual(ftp.ftp.sock.gettimeout(), 30)
+# ftp.ftp.sock.close()
+#
+# def testTimeoutNone(self):
+# # None, having other default
+# previous = socket.getdefaulttimeout()
+# socket.setdefaulttimeout(30)
+# try:
+# ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, [])
+# finally:
+# socket.setdefaulttimeout(previous)
+# self.assertEqual(ftp.ftp.sock.gettimeout(), 30)
+# ftp.ftp.close()
+#
+
def test_main():
@@ -551,7 +625,8 @@ def test_main():
QuotingTests,
UnquotingTests,
urlencode_Tests,
- Pathname_Tests
+ Pathname_Tests,
+ #FTPWrapperTests,
)
diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py
index 76ec01804b6..1bf62943090 100644
--- a/Lib/test/test_xmlrpc.py
+++ b/Lib/test/test_xmlrpc.py
@@ -17,7 +17,7 @@ alist = [{'astring': 'foo@bar.baz.spam',
'ashortlong': 2,
'anotherlist': ['.zyx.41'],
'abase64': xmlrpclib.Binary("my dog has fleas"),
- 'boolean': xmlrpclib.False,
+ 'boolean': False,
'unicode': '\u4000\u6000\u8000',
'ukey\u4000': 'regular value',
'datetime1': xmlrpclib.DateTime('20050210T11:41:23'),
@@ -133,10 +133,11 @@ class XMLRPCTestCase(unittest.TestCase):
"""
# sys.setdefaultencoding() normally doesn't exist after site.py is
- # loaded. reload(sys) is the way to get it back.
+ # loaded. Re-initializing sys again is the way to get it back. :-(
old_encoding = sys.getdefaultencoding()
setdefaultencoding_existed = hasattr(sys, "setdefaultencoding")
- reload(sys) # ugh!
+ import imp
+ imp.init_builtin('sys')
sys.setdefaultencoding("iso-8859-1")
try:
(s, d), m = xmlrpclib.loads(utf8)
diff --git a/Lib/test/testtar.tar b/Lib/test/testtar.tar
index c4c82b8be53..3529bdf0acf 100644
--- a/Lib/test/testtar.tar
+++ b/Lib/test/testtar.tar
Binary files differ
diff --git a/Lib/textwrap.py b/Lib/textwrap.py
index e65cdc31a31..22a625250d7 100644
--- a/Lib/textwrap.py
+++ b/Lib/textwrap.py
@@ -9,14 +9,6 @@ __revision__ = "$Id$"
import string, re
-# Do the right thing with boolean values for all known Python versions
-# (so this module can be copied to projects that don't depend on Python
-# 2.3, e.g. Optik and Docutils).
-try:
- True, False
-except NameError:
- (True, False) = (1, 0)
-
__all__ = ['TextWrapper', 'wrap', 'fill']
# Hardcode the recognized whitespace characters to the US-ASCII
diff --git a/Lib/unittest.py b/Lib/unittest.py
index 46e28541fba..6ede5ad5905 100644
--- a/Lib/unittest.py
+++ b/Lib/unittest.py
@@ -65,22 +65,6 @@ __all__.extend(['getTestCaseNames', 'makeSuite', 'findTestCases'])
##############################################################################
-# Backward compatibility
-##############################################################################
-if sys.version_info[:2] < (2, 2):
- False, True = 0, 1
- def isinstance(obj, clsinfo):
- import __builtin__
- if type(clsinfo) in (tuple, list):
- for cls in clsinfo:
- if cls is type: cls = types.ClassType
- if __builtin__.isinstance(obj, cls):
- return 1
- return 0
- else: return __builtin__.isinstance(obj, clsinfo)
-
-
-##############################################################################
# Test framework core
##############################################################################
diff --git a/Lib/urllib.py b/Lib/urllib.py
index 6a7c23f4027..c6bd87fc568 100644
--- a/Lib/urllib.py
+++ b/Lib/urllib.py
@@ -805,19 +805,20 @@ def noheaders():
class ftpwrapper:
"""Class used by open_ftp() for cache of open FTP connections."""
- def __init__(self, user, passwd, host, port, dirs):
+ def __init__(self, user, passwd, host, port, dirs, timeout=None):
self.user = user
self.passwd = passwd
self.host = host
self.port = port
self.dirs = dirs
+ self.timeout = timeout
self.init()
def init(self):
import ftplib
self.busy = 0
self.ftp = ftplib.FTP()
- self.ftp.connect(self.host, self.port)
+ self.ftp.connect(self.host, self.port, self.timeout)
self.ftp.login(self.user, self.passwd)
for dir in self.dirs:
self.ftp.cwd(dir)
diff --git a/Lib/uuid.py b/Lib/uuid.py
index 029df518a3d..89fc83c705b 100644
--- a/Lib/uuid.py
+++ b/Lib/uuid.py
@@ -535,8 +535,8 @@ def uuid1(node=None, clock_seq=None):
def uuid3(namespace, name):
"""Generate a UUID from the MD5 hash of a namespace UUID and a name."""
- import hashlib
- hash = hashlib.md5(namespace.bytes + name).digest()
+ from hashlib import md5
+ hash = md5(namespace.bytes + name).digest()
return UUID(bytes=hash[:16], version=3)
def uuid4():
@@ -558,8 +558,8 @@ def uuid4():
def uuid5(namespace, name):
"""Generate a UUID from the SHA-1 hash of a namespace UUID and a name."""
- import sha
- hash = sha.sha(namespace.bytes + name).digest()
+ from hashlib import sha1
+ hash = sha1(namespace.bytes + name).digest()
return UUID(bytes=hash[:16], version=5)
# The following standard UUIDs are for use with uuid3() or uuid5().
diff --git a/Lib/wsgiref/handlers.py b/Lib/wsgiref/handlers.py
index fb81bf3dd2c..00c61819c93 100644
--- a/Lib/wsgiref/handlers.py
+++ b/Lib/wsgiref/handlers.py
@@ -8,23 +8,6 @@ import sys, os, time
__all__ = ['BaseHandler', 'SimpleHandler', 'BaseCGIHandler', 'CGIHandler']
-try:
- dict
-except NameError:
- def dict(items):
- d = {}
- for k,v in items:
- d[k] = v
- return d
-
-try:
- True
- False
-except NameError:
- True = not None
- False = not True
-
-
# Weekday and month names for HTTP date/time formatting; always English!
_weekdayname = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
_monthname = [None, # Dummy so we can use 1-based month numbers
diff --git a/Lib/xmlrpclib.py b/Lib/xmlrpclib.py
index f0e4f8f0057..2b5ed6e51f4 100644
--- a/Lib/xmlrpclib.py
+++ b/Lib/xmlrpclib.py
@@ -274,8 +274,6 @@ class Fault(Error):
# all other values are interpreted as False.
boolean = Boolean = bool
-# to avoid breaking code which references xmlrpclib.{True,False}
-True, False = True, False
##
# Wrapper for XML-RPC DateTime values. This converts a time value to
diff --git a/Misc/BeOS-setup.py b/Misc/BeOS-setup.py
index d75bc2403e0..ea13ca480e3 100644
--- a/Misc/BeOS-setup.py
+++ b/Misc/BeOS-setup.py
@@ -168,8 +168,6 @@ class PyBuildExt(build_ext):
if platform in ['Darwin1.2', 'beos']:
math_libs = []
- # XXX Omitted modules: gl, pure, dl, SGI-specific modules
-
#
# The following modules are all pretty straightforward, and compile
# on pretty much any POSIXish platform.
@@ -242,9 +240,6 @@ class PyBuildExt(build_ext):
# Lance Ellinghaus's syslog daemon interface
exts.append( Extension('syslog', ['syslogmodule.c']) )
- # George Neville-Neil's timing module:
- exts.append( Extension('timing', ['timingmodule.c']) )
-
#
# Here ends the simple stuff. From here on, modules need certain
# libraries, are platform-specific, or present other surprises.
@@ -340,15 +335,8 @@ class PyBuildExt(build_ext):
if self.compiler.find_library_file(lib_dirs, 'db'):
dblib = ['db']
- db185_incs = find_file('db_185.h', inc_dirs,
- ['/usr/include/db3', '/usr/include/db2'])
db_inc = find_file('db.h', inc_dirs, ['/usr/include/db1'])
- if db185_incs is not None:
- exts.append( Extension('bsddb', ['bsddbmodule.c'],
- include_dirs = db185_incs,
- define_macros=[('HAVE_DB_185_H',1)],
- libraries = dblib ) )
- elif db_inc is not None:
+ db_inc is not None:
exts.append( Extension('bsddb', ['bsddbmodule.c'],
include_dirs = db_inc,
libraries = dblib) )
diff --git a/Misc/NEWS b/Misc/NEWS
index 9f54b48d751..100897957ad 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -26,6 +26,8 @@ TO DO
Core and Builtins
-----------------
+- None, True, False are now keywords.
+
- PEP 3119: isinstance() and issubclass() can be overridden.
- Remove BaseException.message.
@@ -137,7 +139,7 @@ Core and Builtins
backticks (ie, `x`), <>
- Removed these Python builtins:
- apply(), callable(), coerce(), file(), reduce()
+ apply(), callable(), coerce(), file(), reduce(), reload()
- Removed these Python methods:
{}.has_key
@@ -163,6 +165,7 @@ Extension Modules
- Removed these attributes from Python modules:
* operator module: div, idiv, __div__, __idiv__, isCallable, sequenceIncludes
+ * sys module: exc_clear(), exc_type, exc_value, exc_traceback
Library
@@ -172,8 +175,8 @@ Library
AST -> bytecode mechanism.
- Removed these modules:
- * Bastion, bsddb185, exceptions, md5, popen2, rexec,
- sets, sha, stringold, strop, xmllib
+ * Bastion, bsddb185, exceptions, md5, MimeWriter, mimify, popen2, rexec,
+ sets, sha, stringold, strop, timing, xmllib.
- Remove obsolete IRIX modules: al/AL, cd/CD, cddb, cdplayer, cl/CL, DEVICE,
ERRNO, FILE, fl/FL, flp, fm, GET, gl/GL, GLWS, IN, imgfile, IOCTL, jpeg,
@@ -223,6 +226,9 @@ Documentation
Mac
---
+- The cfmfile was removed.
+
+
New platforms
-------------
diff --git a/Misc/build.sh b/Misc/build.sh
index 7e0ef43bbe3..4d7bddbba9d 100755
--- a/Misc/build.sh
+++ b/Misc/build.sh
@@ -170,6 +170,7 @@ if [ $err = 0 -a "$BUILD_DISABLED" != "yes" ]; then
start=`current_time`
make install >& build/$F
update_status "Installing" "$F" $start
+ mail_on_failure "install" build/$F
if [ ! -x $PYTHON ]; then
ln -s ${PYTHON}3.* $PYTHON
diff --git a/Misc/cheatsheet b/Misc/cheatsheet
index c1411ebd249..b1a428b85f4 100644
--- a/Misc/cheatsheet
+++ b/Misc/cheatsheet
@@ -41,6 +41,7 @@ Option Effect
-h print this help message and exit
-i Inspect interactively after running script (also PYTHONINSPECT=x) and
force prompts, even if stdin appears not to be a terminal
+-m mod run library module as a script (terminates option list
-O optimize generated bytecode (a tad; also PYTHONOPTIMIZE=x)
-OO remove doc-strings in addition to the -O optimizations
-Q arg division options: -Qold (default), -Qwarn, -Qwarnall, -Qnew
@@ -926,7 +927,6 @@ fromlist]]])
abs(x) Return the absolute value of number x.
bool(x) Returns True when the argument x is true and False otherwise.
buffer(obj) Creates a buffer reference to an object.
-callable(x) Returns True if x callable, else False.
chr(i) Returns one-character string whose ASCII code isinteger i
classmethod(f) Converts a function f, into a method with the class as the
first argument. Useful for creating alternative constructors.
@@ -934,14 +934,14 @@ cmp(x,y) Returns negative, 0, positive if x <, ==, > to y
compile(string, from which the code was read, or eg. '<string>'if not read
filename, kind) from file.kind can be 'eval' if string is a single stmt, or
'single' which prints the output of expression statements
- thatevaluate to something else than None, or be 'exec'.
+ that evaluate to something else than None, or be 'exec'.
complex(real[, Builds a complex object (can also be done using J or j
image]) suffix,e.g. 1+3J)
delattr(obj, name) deletes attribute named name of object obj <=> del obj.name
If no args, returns the list of names in current
dict([items]) Create a new dictionary from the specified item list.
-dir([object]) localsymbol table. With a module, class or class
- instanceobject as arg, returns list of names in its attr.
+dir([object]) local symbol table. With a module, class or class
+ instance object as arg, returns list of names in its attr.
dict.
divmod(a,b) Returns tuple of (a/b, a%b)
enumerate(seq) Return a iterator giving: (0, seq[0]), (1, seq[1]), ...
@@ -956,7 +956,7 @@ sequence) function returns true. function takes one parameter.
float(x) Converts a number or a string to floating point.
getattr(object, [<default> arg added in 1.5.2]Gets attribute called name
name[, default])) from object,e.g. getattr(x, 'f') <=> x.f). If not found,
- raisesAttributeError or returns default if specified.
+ raises AttributeError or returns default if specified.
globals() Returns a dictionary containing current global variables.
hasattr(object, Returns true if object has attr called name.
name)
@@ -966,9 +966,7 @@ hex(x) Converts a number x to a hexadecimal string.
id(object) Returns a unique 'identity' integer for an object.
int(x[, base]) base paramenter specifies base from which to convert string
values.
-intern(aString) Enters aString in the table of "interned strings"
- andreturns the string. Interned strings are 'immortals'.
-isinstance(obj, returns true if obj is an instance of class. Ifissubclass
+isinstance(obj, Returns true if obj is an instance of class. Ifissubclass
class) (A,B) then isinstance(x,A) => isinstance(x,B)
issubclass(class1, returns true if class1 is derived from class2
class2)
@@ -1001,26 +999,24 @@ open(name Open a file.
[, buffering]])
pow(x, y [, z]) Returns x to power y [modulo z]. See also ** operator.
property() Created a property with access controlled by functions.
-range(start [,end Returns list of ints from >= start and < end.With 1 arg,
-[, step]]) list from 0..arg-1With 2 args, list from start..end-1With 3
- args, list from start up to end by step
-reload(module) after fixing it. If module was syntacticallycorrect but had
- an error in initialization, mustimport it one more time
- before calling reload().
- Returns a string containing a printable and if possible
-repr(object) evaluable representation of an object.
+range(start [,end Returns list of ints from >= start and < end. With 1 arg,
+[, step]]) list from 0..arg-1. With 2 args, list from start..end-1.
+ With 3 args, list from start up to end by step
+ after fixing it.
+repr(object) Returns a string containing a printable and if possible
+ evaluable representation of an object.
Class redefinable (__repr__). See also str().
round(x, n=0) Returns the floating point value x rounded to n digitsafter
the decimal point.
-setattr(object, This is the counterpart of getattr().setattr(o, 'foobar',
-name, value) 3) <=> o.foobar = 3Creates attribute if it doesn't exist!
+setattr(object, This is the counterpart of getattr(). setattr(o, 'foobar',
+name, value) 3) <=> o.foobar = 3. Creates attribute if it doesn't exist!
slice([start,] stop Returns a slice object representing a range, with R/
-[, step]) Oattributes: start, stop, step.
- Returns a string containing a nicely
+[, step]) O attributes: start, stop, step.
staticmethod() Convert a function to method with no self or class
argument. Useful for methods associated with a class that
do not need access to an object's internal state.
-str(object) printablerepresentation of an object. Class overridable
+str(object) Returns a string containing a nicely
+ printable representation of an object. Class overridable
(__str__).See also repr().
super(type) Create an unbound super object. Used to call cooperative
superclass methods.
@@ -1042,12 +1038,8 @@ encoding[, error thegiven encoding name and error treatment ('strict',
vars([object]) instance object as argumentreturns a dictionary
corresponding to the object'ssymbol table. Useful with "%"
formatting operator.
-xrange(start [, end Like range(), but doesn't actually store entire listall at
-[, step]]) once. Good to use in "for" loops when there is abig range
- and little memory.
-zip(seq1[, seq2, Returns a list of tuples where each tuple contains the nth
-...]) element of each of the argument sequences.
-
+zip(seq1[, seq2, Returns an iterator of tuples where each tuple contains
+...]) the nth element of each of the argument sequences.
@@ -1314,10 +1306,6 @@ builtin_module_names A list of strings giving the names of all moduleswritten
in C that are linked into this interpreter.
check_interval How often to check for thread switches or signals(measured
in number of virtual machine instructions)
-exc_type, exc_value, Deprecated since release 1.5. Use exc_info() instead.
-exc_traceback
-exitfunc User can set to a parameterless fcn. It will getcalled
- before interpreter exits.
last_type, Set only when an exception not handled andinterpreter
last_value, prints an error. Used by debuggers.
last_traceback
@@ -1350,7 +1338,7 @@ settrace(func) Sets a trace function: called before each line ofcode is
setprofile(func) Sets a profile function for performance profiling.
Info on exception currently being handled; this is atuple
(exc_type, exc_value, exc_traceback).Warning: assigning the
-exc_info() traceback return value to a loca variable in a
+exc_info() traceback return value to a local variable in a
function handling an exception will cause a circular
reference.
setdefaultencoding Change default Unicode encoding - defaults to 7-bit ASCII.
@@ -1857,7 +1845,6 @@ dospath Common operations on DOS pathnames.
dumbdbm A dumb and slow but simple dbm clone.
[DEL:dump:DEL] [DEL:Print python code that reconstructs a variable.:DEL]
email Comprehensive support for internet email.
-exceptions Class based built-in exception hierarchy.
filecmp File comparison.
fileinput Helper class to quickly write a loop over all standard input
files.
@@ -1872,7 +1859,6 @@ getopt Standard command line processing. See also ftp://
www.pauahtun.org/pub/getargspy.zip
getpass Utilities to get a password and/or the current user name.
glob filename globbing.
-gopherlib Gopher protocol client interface.
[DEL:grep:DEL] [DEL:'grep' utilities.:DEL]
gzip Read & write gzipped files.
heapq Priority queue implemented using lists organized as heaps.
@@ -1887,7 +1873,6 @@ imghdr Recognizing image files based on their first few bytes.
imputil Privides a way of writing customised import hooks.
inspect Tool for probing live Python objects.
keyword List of Python keywords.
-knee A Python re-implementation of hierarchical module import.
linecache Cache lines from files.
linuxaudiodev Lunix /dev/audio support.
locale Support for number formatting using the current locale
@@ -1900,8 +1885,6 @@ mailcap Mailcap file handling (RFC 1524).
mhlib MH (mailbox) interface.
mimetools Various tools used by MIME-reading or MIME-writing programs.
mimetypes Guess the MIME type of a file.
-MimeWriter Generic MIME writer.
-mimify Mimification and unmimification of mail messages.
mmap Interface to memory-mapped files - they behave like mutable
strings./font>
multifile Class to make multi-file messages easier to handle.
@@ -1920,7 +1903,6 @@ pickle Pickling (save and restore) of Python objects (a faster
pipes Conversion pipeline templates.
pkgunil Utilities for working with Python packages.
poplib A POP3 client class. Based on the J. Myers POP3 draft.
-posixfile Extended (posix) file operations.
posixpath Common operations on POSIX pathnames.
pprint Support to pretty-print lists, tuples, & dictionaries
recursively.
@@ -1933,7 +1915,6 @@ py_compile Routine to "compile" a .py file to a .pyc file.
pyclbr Parse a Python file and retrieve classes and methods.
Queue A multi-producer, multi-consumer queue.
quopri Conversions to/from quoted-printable transport encoding.
-rand Don't use unless you want compatibility with C's rand().
random Random variable generators
re Regular Expressions.
repr Redo repr() but with limits on most sizes.
@@ -1942,7 +1923,6 @@ rfc822 RFC-822 message manipulation class.
rlcompleter Word completion for GNU readline 2.0.
robotparser Parse robots.txt files, useful for web spiders.
sched A generally useful event scheduler class.
-sets Module for a set datatype.
sgmllib A parser for SGML.
shelve Manage shelves of pickled objects.
shlex Lexical analyzer class for simple shell-like syntaxes.
@@ -1954,7 +1934,6 @@ smtplib SMTP Client class (RFC 821)
sndhdr Several routines that help recognizing sound.
SocketServer Generic socket server classes.
stat Constants and functions for interpreting stat/lstat struct.
-statcache Maintain a cache of file stats.
statvfs Constants for interpreting statvfs struct as returned by
os.statvfs()and os.fstatvfs() (if they exist).
string A collection of string operations.
diff --git a/Modules/Setup.dist b/Modules/Setup.dist
index 6a7a54def5b..4ea727f7265 100644
--- a/Modules/Setup.dist
+++ b/Modules/Setup.dist
@@ -247,11 +247,6 @@ _symtable symtablemodule.c
#linuxaudiodev linuxaudiodev.c
-# George Neville-Neil's timing module:
-
-#timing timingmodule.c
-
-
# The _tkinter module.
#
# The command for _tkinter is long and site specific. Please
diff --git a/Modules/_ctypes/callbacks.c b/Modules/_ctypes/callbacks.c
index cbcf2b8cdd7..2ead9272919 100644
--- a/Modules/_ctypes/callbacks.c
+++ b/Modules/_ctypes/callbacks.c
@@ -385,8 +385,8 @@ long Call_GetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
}
{
- PyObject *py_rclsid = PyLong_FromVoidPtr(rclsid);
- PyObject *py_riid = PyLong_FromVoidPtr(riid);
+ PyObject *py_rclsid = PyLong_FromVoidPtr((void *)rclsid);
+ PyObject *py_riid = PyLong_FromVoidPtr((void *)riid);
PyObject *py_ppv = PyLong_FromVoidPtr(ppv);
if (!py_rclsid || !py_riid || !py_ppv) {
Py_XDECREF(py_rclsid);
diff --git a/Modules/md5.c b/Modules/md5.c
deleted file mode 100644
index c35d96c5ef5..00000000000
--- a/Modules/md5.c
+++ /dev/null
@@ -1,381 +0,0 @@
-/*
- Copyright (C) 1999, 2000, 2002 Aladdin Enterprises. All rights reserved.
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-
- L. Peter Deutsch
- ghost@aladdin.com
-
- */
-/* $Id: md5.c,v 1.6 2002/04/13 19:20:28 lpd Exp $ */
-/*
- Independent implementation of MD5 (RFC 1321).
-
- This code implements the MD5 Algorithm defined in RFC 1321, whose
- text is available at
- http://www.ietf.org/rfc/rfc1321.txt
- The code is derived from the text of the RFC, including the test suite
- (section A.5) but excluding the rest of Appendix A. It does not include
- any code or documentation that is identified in the RFC as being
- copyrighted.
-
- The original and principal author of md5.c is L. Peter Deutsch
- <ghost@aladdin.com>. Other authors are noted in the change history
- that follows (in reverse chronological order):
-
- 2002-04-13 lpd Clarified derivation from RFC 1321; now handles byte order
- either statically or dynamically; added missing #include <string.h>
- in library.
- 2002-03-11 lpd Corrected argument list for main(), and added int return
- type, in test program and T value program.
- 2002-02-21 lpd Added missing #include <stdio.h> in test program.
- 2000-07-03 lpd Patched to eliminate warnings about "constant is
- unsigned in ANSI C, signed in traditional"; made test program
- self-checking.
- 1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
- 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5).
- 1999-05-03 lpd Original version.
- */
-
-#include "md5.h"
-#include <string.h>
-
-#undef BYTE_ORDER /* 1 = big-endian, -1 = little-endian, 0 = unknown */
-#ifdef ARCH_IS_BIG_ENDIAN
-# define BYTE_ORDER (ARCH_IS_BIG_ENDIAN ? 1 : -1)
-#else
-# define BYTE_ORDER 0
-#endif
-
-#define T_MASK ((md5_word_t)~0)
-#define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87)
-#define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9)
-#define T3 0x242070db
-#define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111)
-#define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050)
-#define T6 0x4787c62a
-#define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec)
-#define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe)
-#define T9 0x698098d8
-#define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850)
-#define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e)
-#define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841)
-#define T13 0x6b901122
-#define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c)
-#define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71)
-#define T16 0x49b40821
-#define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d)
-#define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf)
-#define T19 0x265e5a51
-#define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855)
-#define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2)
-#define T22 0x02441453
-#define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e)
-#define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437)
-#define T25 0x21e1cde6
-#define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829)
-#define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278)
-#define T28 0x455a14ed
-#define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa)
-#define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07)
-#define T31 0x676f02d9
-#define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375)
-#define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd)
-#define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e)
-#define T35 0x6d9d6122
-#define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3)
-#define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb)
-#define T38 0x4bdecfa9
-#define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f)
-#define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f)
-#define T41 0x289b7ec6
-#define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805)
-#define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a)
-#define T44 0x04881d05
-#define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6)
-#define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a)
-#define T47 0x1fa27cf8
-#define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a)
-#define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb)
-#define T50 0x432aff97
-#define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58)
-#define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6)
-#define T53 0x655b59c3
-#define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d)
-#define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82)
-#define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e)
-#define T57 0x6fa87e4f
-#define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f)
-#define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb)
-#define T60 0x4e0811a1
-#define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d)
-#define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca)
-#define T63 0x2ad7d2bb
-#define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e)
-
-
-static void
-md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/)
-{
- md5_word_t
- a = pms->abcd[0], b = pms->abcd[1],
- c = pms->abcd[2], d = pms->abcd[3];
- md5_word_t t;
-#if BYTE_ORDER > 0
- /* Define storage only for big-endian CPUs. */
- md5_word_t X[16];
-#else
- /* Define storage for little-endian or both types of CPUs. */
- md5_word_t xbuf[16];
- const md5_word_t *X;
-#endif
-
- {
-#if BYTE_ORDER == 0
- /*
- * Determine dynamically whether this is a big-endian or
- * little-endian machine, since we can use a more efficient
- * algorithm on the latter.
- */
- static const int w = 1;
-
- if (*((const md5_byte_t *)&w)) /* dynamic little-endian */
-#endif
-#if BYTE_ORDER <= 0 /* little-endian */
- {
- /*
- * On little-endian machines, we can process properly aligned
- * data without copying it.
- */
- if (!((data - (const md5_byte_t *)0) & 3)) {
- /* data are properly aligned */
- X = (const md5_word_t *)data;
- } else {
- /* not aligned */
- memcpy(xbuf, data, 64);
- X = xbuf;
- }
- }
-#endif
-#if BYTE_ORDER == 0
- else /* dynamic big-endian */
-#endif
-#if BYTE_ORDER >= 0 /* big-endian */
- {
- /*
- * On big-endian machines, we must arrange the bytes in the
- * right order.
- */
- const md5_byte_t *xp = data;
- int i;
-
-# if BYTE_ORDER == 0
- X = xbuf; /* (dynamic only) */
-# else
-# define xbuf X /* (static only) */
-# endif
- for (i = 0; i < 16; ++i, xp += 4)
- xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24);
- }
-#endif
- }
-
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
-
- /* Round 1. */
- /* Let [abcd k s i] denote the operation
- a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
-#define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
-#define SET(a, b, c, d, k, s, Ti)\
- t = a + F(b,c,d) + X[k] + Ti;\
- a = ROTATE_LEFT(t, s) + b
- /* Do the following 16 operations. */
- SET(a, b, c, d, 0, 7, T1);
- SET(d, a, b, c, 1, 12, T2);
- SET(c, d, a, b, 2, 17, T3);
- SET(b, c, d, a, 3, 22, T4);
- SET(a, b, c, d, 4, 7, T5);
- SET(d, a, b, c, 5, 12, T6);
- SET(c, d, a, b, 6, 17, T7);
- SET(b, c, d, a, 7, 22, T8);
- SET(a, b, c, d, 8, 7, T9);
- SET(d, a, b, c, 9, 12, T10);
- SET(c, d, a, b, 10, 17, T11);
- SET(b, c, d, a, 11, 22, T12);
- SET(a, b, c, d, 12, 7, T13);
- SET(d, a, b, c, 13, 12, T14);
- SET(c, d, a, b, 14, 17, T15);
- SET(b, c, d, a, 15, 22, T16);
-#undef SET
-
- /* Round 2. */
- /* Let [abcd k s i] denote the operation
- a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
-#define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
-#define SET(a, b, c, d, k, s, Ti)\
- t = a + G(b,c,d) + X[k] + Ti;\
- a = ROTATE_LEFT(t, s) + b
- /* Do the following 16 operations. */
- SET(a, b, c, d, 1, 5, T17);
- SET(d, a, b, c, 6, 9, T18);
- SET(c, d, a, b, 11, 14, T19);
- SET(b, c, d, a, 0, 20, T20);
- SET(a, b, c, d, 5, 5, T21);
- SET(d, a, b, c, 10, 9, T22);
- SET(c, d, a, b, 15, 14, T23);
- SET(b, c, d, a, 4, 20, T24);
- SET(a, b, c, d, 9, 5, T25);
- SET(d, a, b, c, 14, 9, T26);
- SET(c, d, a, b, 3, 14, T27);
- SET(b, c, d, a, 8, 20, T28);
- SET(a, b, c, d, 13, 5, T29);
- SET(d, a, b, c, 2, 9, T30);
- SET(c, d, a, b, 7, 14, T31);
- SET(b, c, d, a, 12, 20, T32);
-#undef SET
-
- /* Round 3. */
- /* Let [abcd k s t] denote the operation
- a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
-#define H(x, y, z) ((x) ^ (y) ^ (z))
-#define SET(a, b, c, d, k, s, Ti)\
- t = a + H(b,c,d) + X[k] + Ti;\
- a = ROTATE_LEFT(t, s) + b
- /* Do the following 16 operations. */
- SET(a, b, c, d, 5, 4, T33);
- SET(d, a, b, c, 8, 11, T34);
- SET(c, d, a, b, 11, 16, T35);
- SET(b, c, d, a, 14, 23, T36);
- SET(a, b, c, d, 1, 4, T37);
- SET(d, a, b, c, 4, 11, T38);
- SET(c, d, a, b, 7, 16, T39);
- SET(b, c, d, a, 10, 23, T40);
- SET(a, b, c, d, 13, 4, T41);
- SET(d, a, b, c, 0, 11, T42);
- SET(c, d, a, b, 3, 16, T43);
- SET(b, c, d, a, 6, 23, T44);
- SET(a, b, c, d, 9, 4, T45);
- SET(d, a, b, c, 12, 11, T46);
- SET(c, d, a, b, 15, 16, T47);
- SET(b, c, d, a, 2, 23, T48);
-#undef SET
-
- /* Round 4. */
- /* Let [abcd k s t] denote the operation
- a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
-#define I(x, y, z) ((y) ^ ((x) | ~(z)))
-#define SET(a, b, c, d, k, s, Ti)\
- t = a + I(b,c,d) + X[k] + Ti;\
- a = ROTATE_LEFT(t, s) + b
- /* Do the following 16 operations. */
- SET(a, b, c, d, 0, 6, T49);
- SET(d, a, b, c, 7, 10, T50);
- SET(c, d, a, b, 14, 15, T51);
- SET(b, c, d, a, 5, 21, T52);
- SET(a, b, c, d, 12, 6, T53);
- SET(d, a, b, c, 3, 10, T54);
- SET(c, d, a, b, 10, 15, T55);
- SET(b, c, d, a, 1, 21, T56);
- SET(a, b, c, d, 8, 6, T57);
- SET(d, a, b, c, 15, 10, T58);
- SET(c, d, a, b, 6, 15, T59);
- SET(b, c, d, a, 13, 21, T60);
- SET(a, b, c, d, 4, 6, T61);
- SET(d, a, b, c, 11, 10, T62);
- SET(c, d, a, b, 2, 15, T63);
- SET(b, c, d, a, 9, 21, T64);
-#undef SET
-
- /* Then perform the following additions. (That is increment each
- of the four registers by the value it had before this block
- was started.) */
- pms->abcd[0] += a;
- pms->abcd[1] += b;
- pms->abcd[2] += c;
- pms->abcd[3] += d;
-}
-
-void
-md5_init(md5_state_t *pms)
-{
- pms->count[0] = pms->count[1] = 0;
- pms->abcd[0] = 0x67452301;
- pms->abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476;
- pms->abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301;
- pms->abcd[3] = 0x10325476;
-}
-
-void
-md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes)
-{
- const md5_byte_t *p = data;
- int left = nbytes;
- int offset = (pms->count[0] >> 3) & 63;
- md5_word_t nbits = (md5_word_t)(nbytes << 3);
-
- if (nbytes <= 0)
- return;
-
- /* Update the message length. */
- pms->count[1] += nbytes >> 29;
- pms->count[0] += nbits;
- if (pms->count[0] < nbits)
- pms->count[1]++;
-
- /* Process an initial partial block. */
- if (offset) {
- int copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
-
- memcpy(pms->buf + offset, p, copy);
- if (offset + copy < 64)
- return;
- p += copy;
- left -= copy;
- md5_process(pms, pms->buf);
- }
-
- /* Process full blocks. */
- for (; left >= 64; p += 64, left -= 64)
- md5_process(pms, p);
-
- /* Process a final partial block. */
- if (left)
- memcpy(pms->buf, p, left);
-}
-
-void
-md5_finish(md5_state_t *pms, md5_byte_t digest[16])
-{
- static const md5_byte_t pad[64] = {
- 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- };
- md5_byte_t data[8];
- int i;
-
- /* Save the length before padding. */
- for (i = 0; i < 8; ++i)
- data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3));
- /* Pad to 56 bytes mod 64. */
- md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1);
- /* Append the length. */
- md5_append(pms, data, 8);
- for (i = 0; i < 16; ++i)
- digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3));
-}
diff --git a/Modules/md5.h b/Modules/md5.h
deleted file mode 100644
index 5eb6d6c469c..00000000000
--- a/Modules/md5.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- Copyright (C) 1999, 2002 Aladdin Enterprises. All rights reserved.
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-
- L. Peter Deutsch
- ghost@aladdin.com
-
- */
-/* $Id$ */
-/*
- Independent implementation of MD5 (RFC 1321).
-
- This code implements the MD5 Algorithm defined in RFC 1321, whose
- text is available at
- http://www.ietf.org/rfc/rfc1321.txt
- The code is derived from the text of the RFC, including the test suite
- (section A.5) but excluding the rest of Appendix A. It does not include
- any code or documentation that is identified in the RFC as being
- copyrighted.
-
- The original and principal author of md5.h is L. Peter Deutsch
- <ghost@aladdin.com>. Other authors are noted in the change history
- that follows (in reverse chronological order):
-
- 2002-04-13 lpd Removed support for non-ANSI compilers; removed
- references to Ghostscript; clarified derivation from RFC 1321;
- now handles byte order either statically or dynamically.
- 1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
- 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5);
- added conditionalization for C++ compilation from Martin
- Purschke <purschke@bnl.gov>.
- 1999-05-03 lpd Original version.
- */
-
-#ifndef md5_INCLUDED
-# define md5_INCLUDED
-
-/*
- * This package supports both compile-time and run-time determination of CPU
- * byte order. If ARCH_IS_BIG_ENDIAN is defined as 0, the code will be
- * compiled to run only on little-endian CPUs; if ARCH_IS_BIG_ENDIAN is
- * defined as non-zero, the code will be compiled to run only on big-endian
- * CPUs; if ARCH_IS_BIG_ENDIAN is not defined, the code will be compiled to
- * run on either big- or little-endian CPUs, but will run slightly less
- * efficiently on either one than if ARCH_IS_BIG_ENDIAN is defined.
- */
-
-typedef unsigned char md5_byte_t; /* 8-bit byte */
-typedef unsigned int md5_word_t; /* 32-bit word */
-
-/* Define the state of the MD5 Algorithm. */
-typedef struct md5_state_s {
- md5_word_t count[2]; /* message length in bits, lsw first */
- md5_word_t abcd[4]; /* digest buffer */
- md5_byte_t buf[64]; /* accumulate block */
-} md5_state_t;
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-/* Initialize the algorithm. */
-void md5_init(md5_state_t *pms);
-
-/* Append a string to the message. */
-void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes);
-
-/* Finish the message and return the digest. */
-void md5_finish(md5_state_t *pms, md5_byte_t digest[16]);
-
-#ifdef __cplusplus
-} /* end extern "C" */
-#endif
-
-#endif /* md5_INCLUDED */
diff --git a/Modules/md5module.c b/Modules/md5module.c
deleted file mode 100644
index 5e4f1163295..00000000000
--- a/Modules/md5module.c
+++ /dev/null
@@ -1,312 +0,0 @@
-
-/* MD5 module */
-
-/* This module provides an interface to the RSA Data Security,
- Inc. MD5 Message-Digest Algorithm, described in RFC 1321.
- It requires the files md5c.c and md5.h (which are slightly changed
- from the versions in the RFC to avoid the "global.h" file.) */
-
-
-/* MD5 objects */
-
-#include "Python.h"
-#include "structmember.h"
-#include "md5.h"
-
-typedef struct {
- PyObject_HEAD
- md5_state_t md5; /* the context holder */
-} md5object;
-
-static PyTypeObject MD5type;
-
-#define is_md5object(v) ((v)->ob_type == &MD5type)
-
-static md5object *
-newmd5object(void)
-{
- md5object *md5p;
-
- md5p = PyObject_New(md5object, &MD5type);
- if (md5p == NULL)
- return NULL;
-
- md5_init(&md5p->md5); /* actual initialisation */
- return md5p;
-}
-
-
-/* MD5 methods */
-
-static void
-md5_dealloc(md5object *md5p)
-{
- PyObject_Del(md5p);
-}
-
-
-/* MD5 methods-as-attributes */
-
-static PyObject *
-md5_update(md5object *self, PyObject *args)
-{
- unsigned char *cp;
- int len;
-
- if (!PyArg_ParseTuple(args, "s#:update", &cp, &len))
- return NULL;
-
- md5_append(&self->md5, cp, len);
-
- Py_INCREF(Py_None);
- return Py_None;
-}
-
-PyDoc_STRVAR(update_doc,
-"update (arg)\n\
-\n\
-Update the md5 object with the string arg. Repeated calls are\n\
-equivalent to a single call with the concatenation of all the\n\
-arguments.");
-
-
-static PyObject *
-md5_digest(md5object *self)
-{
- md5_state_t mdContext;
- unsigned char aDigest[16];
-
- /* make a temporary copy, and perform the final */
- mdContext = self->md5;
- md5_finish(&mdContext, aDigest);
-
- return PyString_FromStringAndSize((char *)aDigest, 16);
-}
-
-PyDoc_STRVAR(digest_doc,
-"digest() -> string\n\
-\n\
-Return the digest of the strings passed to the update() method so\n\
-far. This is a 16-byte string which may contain non-ASCII characters,\n\
-including null bytes.");
-
-
-static PyObject *
-md5_hexdigest(md5object *self)
-{
- md5_state_t mdContext;
- unsigned char digest[16];
- unsigned char hexdigest[32];
- int i, j;
-
- /* make a temporary copy, and perform the final */
- mdContext = self->md5;
- md5_finish(&mdContext, digest);
-
- /* Make hex version of the digest */
- for(i=j=0; i<16; i++) {
- char c;
- c = (digest[i] >> 4) & 0xf;
- c = (c>9) ? c+'a'-10 : c + '0';
- hexdigest[j++] = c;
- c = (digest[i] & 0xf);
- c = (c>9) ? c+'a'-10 : c + '0';
- hexdigest[j++] = c;
- }
- return PyString_FromStringAndSize((char*)hexdigest, 32);
-}
-
-
-PyDoc_STRVAR(hexdigest_doc,
-"hexdigest() -> string\n\
-\n\
-Like digest(), but returns the digest as a string of hexadecimal digits.");
-
-
-static PyObject *
-md5_copy(md5object *self)
-{
- md5object *md5p;
-
- if ((md5p = newmd5object()) == NULL)
- return NULL;
-
- md5p->md5 = self->md5;
-
- return (PyObject *)md5p;
-}
-
-PyDoc_STRVAR(copy_doc,
-"copy() -> md5 object\n\
-\n\
-Return a copy (``clone'') of the md5 object.");
-
-
-static PyMethodDef md5_methods[] = {
- {"update", (PyCFunction)md5_update, METH_VARARGS, update_doc},
- {"digest", (PyCFunction)md5_digest, METH_NOARGS, digest_doc},
- {"hexdigest", (PyCFunction)md5_hexdigest, METH_NOARGS, hexdigest_doc},
- {"copy", (PyCFunction)md5_copy, METH_NOARGS, copy_doc},
- {NULL, NULL} /* sentinel */
-};
-
-static PyObject *
-md5_get_block_size(PyObject *self, void *closure)
-{
- return PyInt_FromLong(64);
-}
-
-static PyObject *
-md5_get_digest_size(PyObject *self, void *closure)
-{
- return PyInt_FromLong(16);
-}
-
-static PyObject *
-md5_get_name(PyObject *self, void *closure)
-{
- return PyString_FromStringAndSize("MD5", 3);
-}
-
-static PyGetSetDef md5_getseters[] = {
- {"digest_size",
- (getter)md5_get_digest_size, NULL,
- NULL,
- NULL},
- {"block_size",
- (getter)md5_get_block_size, NULL,
- NULL,
- NULL},
- {"name",
- (getter)md5_get_name, NULL,
- NULL,
- NULL},
- /* the old md5 and sha modules support 'digest_size' as in PEP 247.
- * the old sha module also supported 'digestsize'. ugh. */
- {"digestsize",
- (getter)md5_get_digest_size, NULL,
- NULL,
- NULL},
- {NULL} /* Sentinel */
-};
-
-
-PyDoc_STRVAR(module_doc,
-"This module implements the interface to RSA's MD5 message digest\n\
-algorithm (see also Internet RFC 1321). Its use is quite\n\
-straightforward: use the new() to create an md5 object. You can now\n\
-feed this object with arbitrary strings using the update() method, and\n\
-at any point you can ask it for the digest (a strong kind of 128-bit\n\
-checksum, a.k.a. ``fingerprint'') of the concatenation of the strings\n\
-fed to it so far using the digest() method.\n\
-\n\
-Functions:\n\
-\n\
-new([arg]) -- return a new md5 object, initialized with arg if provided\n\
-md5([arg]) -- DEPRECATED, same as new, but for compatibility\n\
-\n\
-Special Objects:\n\
-\n\
-MD5Type -- type object for md5 objects");
-
-PyDoc_STRVAR(md5type_doc,
-"An md5 represents the object used to calculate the MD5 checksum of a\n\
-string of information.\n\
-\n\
-Methods:\n\
-\n\
-update() -- updates the current digest with an additional string\n\
-digest() -- return the current digest value\n\
-hexdigest() -- return the current digest as a string of hexadecimal digits\n\
-copy() -- return a copy of the current md5 object");
-
-static PyTypeObject MD5type = {
- PyObject_HEAD_INIT(NULL)
- 0, /*ob_size*/
- "_md5.md5", /*tp_name*/
- sizeof(md5object), /*tp_size*/
- 0, /*tp_itemsize*/
- /* methods */
- (destructor)md5_dealloc, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_compare*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash*/
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT, /*tp_flags*/
- md5type_doc, /*tp_doc*/
- 0, /*tp_traverse*/
- 0, /*tp_clear*/
- 0, /*tp_richcompare*/
- 0, /*tp_weaklistoffset*/
- 0, /*tp_iter*/
- 0, /*tp_iternext*/
- md5_methods, /*tp_methods*/
- 0, /*tp_members*/
- md5_getseters, /*tp_getset*/
-};
-
-
-/* MD5 functions */
-
-static PyObject *
-MD5_new(PyObject *self, PyObject *args)
-{
- md5object *md5p;
- unsigned char *cp = NULL;
- int len = 0;
-
- if (!PyArg_ParseTuple(args, "|s#:new", &cp, &len))
- return NULL;
-
- if ((md5p = newmd5object()) == NULL)
- return NULL;
-
- if (cp)
- md5_append(&md5p->md5, cp, len);
-
- return (PyObject *)md5p;
-}
-
-PyDoc_STRVAR(new_doc,
-"new([arg]) -> md5 object\n\
-\n\
-Return a new md5 object. If arg is present, the method call update(arg)\n\
-is made.");
-
-
-/* List of functions exported by this module */
-
-static PyMethodDef md5_functions[] = {
- {"new", (PyCFunction)MD5_new, METH_VARARGS, new_doc},
- {NULL, NULL} /* Sentinel */
-};
-
-
-/* Initialize this module. */
-
-PyMODINIT_FUNC
-init_md5(void)
-{
- PyObject *m, *d;
-
- MD5type.ob_type = &PyType_Type;
- if (PyType_Ready(&MD5type) < 0)
- return;
- m = Py_InitModule3("_md5", md5_functions, module_doc);
- if (m == NULL)
- return;
- d = PyModule_GetDict(m);
- PyDict_SetItemString(d, "MD5Type", (PyObject *)&MD5type);
- PyModule_AddIntConstant(m, "digest_size", 16);
- /* No need to check the error here, the caller will do that */
-}
diff --git a/Modules/shamodule.c b/Modules/shamodule.c
deleted file mode 100644
index 8d68d16eac6..00000000000
--- a/Modules/shamodule.c
+++ /dev/null
@@ -1,593 +0,0 @@
-/* SHA module */
-
-/* This module provides an interface to NIST's Secure Hash Algorithm */
-
-/* See below for information about the original code this module was
- based upon. Additional work performed by:
-
- Andrew Kuchling (amk@amk.ca)
- Greg Stein (gstein@lyra.org)
-
- Copyright (C) 2005 Gregory P. Smith (greg@electricrain.com)
- Licensed to PSF under a Contributor Agreement.
-
-*/
-
-/* SHA objects */
-
-#include "Python.h"
-#include "structmember.h"
-
-
-/* Endianness testing and definitions */
-#define TestEndianness(variable) {int i=1; variable=PCT_BIG_ENDIAN;\
- if (*((char*)&i)==1) variable=PCT_LITTLE_ENDIAN;}
-
-#define PCT_LITTLE_ENDIAN 1
-#define PCT_BIG_ENDIAN 0
-
-/* Some useful types */
-
-typedef unsigned char SHA_BYTE;
-
-#if SIZEOF_INT == 4
-typedef unsigned int SHA_INT32; /* 32-bit integer */
-#else
-/* not defined. compilation will die. */
-#endif
-
-/* The SHA block size and message digest sizes, in bytes */
-
-#define SHA_BLOCKSIZE 64
-#define SHA_DIGESTSIZE 20
-
-/* The structure for storing SHS info */
-
-typedef struct {
- PyObject_HEAD
- SHA_INT32 digest[5]; /* Message digest */
- SHA_INT32 count_lo, count_hi; /* 64-bit bit count */
- SHA_BYTE data[SHA_BLOCKSIZE]; /* SHA data buffer */
- int Endianness;
- int local; /* unprocessed amount in data */
-} SHAobject;
-
-/* When run on a little-endian CPU we need to perform byte reversal on an
- array of longwords. */
-
-static void longReverse(SHA_INT32 *buffer, int byteCount, int Endianness)
-{
- SHA_INT32 value;
-
- if ( Endianness == PCT_BIG_ENDIAN )
- return;
-
- byteCount /= sizeof(*buffer);
- while (byteCount--) {
- value = *buffer;
- value = ( ( value & 0xFF00FF00L ) >> 8 ) | \
- ( ( value & 0x00FF00FFL ) << 8 );
- *buffer++ = ( value << 16 ) | ( value >> 16 );
- }
-}
-
-static void SHAcopy(SHAobject *src, SHAobject *dest)
-{
- dest->Endianness = src->Endianness;
- dest->local = src->local;
- dest->count_lo = src->count_lo;
- dest->count_hi = src->count_hi;
- memcpy(dest->digest, src->digest, sizeof(src->digest));
- memcpy(dest->data, src->data, sizeof(src->data));
-}
-
-
-/* ------------------------------------------------------------------------
- *
- * This code for the SHA algorithm was noted as public domain. The original
- * headers are pasted below.
- *
- * Several changes have been made to make it more compatible with the
- * Python environment and desired interface.
- *
- */
-
-/* NIST Secure Hash Algorithm */
-/* heavily modified by Uwe Hollerbach <uh@alumni.caltech edu> */
-/* from Peter C. Gutmann's implementation as found in */
-/* Applied Cryptography by Bruce Schneier */
-/* Further modifications to include the "UNRAVEL" stuff, below */
-
-/* This code is in the public domain */
-
-/* UNRAVEL should be fastest & biggest */
-/* UNROLL_LOOPS should be just as big, but slightly slower */
-/* both undefined should be smallest and slowest */
-
-#define UNRAVEL
-/* #define UNROLL_LOOPS */
-
-/* The SHA f()-functions. The f1 and f3 functions can be optimized to
- save one boolean operation each - thanks to Rich Schroeppel,
- rcs@cs.arizona.edu for discovering this */
-
-/*#define f1(x,y,z) ((x & y) | (~x & z)) // Rounds 0-19 */
-#define f1(x,y,z) (z ^ (x & (y ^ z))) /* Rounds 0-19 */
-#define f2(x,y,z) (x ^ y ^ z) /* Rounds 20-39 */
-/*#define f3(x,y,z) ((x & y) | (x & z) | (y & z)) // Rounds 40-59 */
-#define f3(x,y,z) ((x & y) | (z & (x | y))) /* Rounds 40-59 */
-#define f4(x,y,z) (x ^ y ^ z) /* Rounds 60-79 */
-
-/* SHA constants */
-
-#define CONST1 0x5a827999L /* Rounds 0-19 */
-#define CONST2 0x6ed9eba1L /* Rounds 20-39 */
-#define CONST3 0x8f1bbcdcL /* Rounds 40-59 */
-#define CONST4 0xca62c1d6L /* Rounds 60-79 */
-
-/* 32-bit rotate */
-
-#define R32(x,n) ((x << n) | (x >> (32 - n)))
-
-/* the generic case, for when the overall rotation is not unraveled */
-
-#define FG(n) \
- T = R32(A,5) + f##n(B,C,D) + E + *WP++ + CONST##n; \
- E = D; D = C; C = R32(B,30); B = A; A = T
-
-/* specific cases, for when the overall rotation is unraveled */
-
-#define FA(n) \
- T = R32(A,5) + f##n(B,C,D) + E + *WP++ + CONST##n; B = R32(B,30)
-
-#define FB(n) \
- E = R32(T,5) + f##n(A,B,C) + D + *WP++ + CONST##n; A = R32(A,30)
-
-#define FC(n) \
- D = R32(E,5) + f##n(T,A,B) + C + *WP++ + CONST##n; T = R32(T,30)
-
-#define FD(n) \
- C = R32(D,5) + f##n(E,T,A) + B + *WP++ + CONST##n; E = R32(E,30)
-
-#define FE(n) \
- B = R32(C,5) + f##n(D,E,T) + A + *WP++ + CONST##n; D = R32(D,30)
-
-#define FT(n) \
- A = R32(B,5) + f##n(C,D,E) + T + *WP++ + CONST##n; C = R32(C,30)
-
-/* do SHA transformation */
-
-static void
-sha_transform(SHAobject *sha_info)
-{
- int i;
- SHA_INT32 T, A, B, C, D, E, W[80], *WP;
-
- memcpy(W, sha_info->data, sizeof(sha_info->data));
- longReverse(W, (int)sizeof(sha_info->data), sha_info->Endianness);
-
- for (i = 16; i < 80; ++i) {
- W[i] = W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16];
-
- /* extra rotation fix */
- W[i] = R32(W[i], 1);
- }
- A = sha_info->digest[0];
- B = sha_info->digest[1];
- C = sha_info->digest[2];
- D = sha_info->digest[3];
- E = sha_info->digest[4];
- WP = W;
-#ifdef UNRAVEL
- FA(1); FB(1); FC(1); FD(1); FE(1); FT(1); FA(1); FB(1); FC(1); FD(1);
- FE(1); FT(1); FA(1); FB(1); FC(1); FD(1); FE(1); FT(1); FA(1); FB(1);
- FC(2); FD(2); FE(2); FT(2); FA(2); FB(2); FC(2); FD(2); FE(2); FT(2);
- FA(2); FB(2); FC(2); FD(2); FE(2); FT(2); FA(2); FB(2); FC(2); FD(2);
- FE(3); FT(3); FA(3); FB(3); FC(3); FD(3); FE(3); FT(3); FA(3); FB(3);
- FC(3); FD(3); FE(3); FT(3); FA(3); FB(3); FC(3); FD(3); FE(3); FT(3);
- FA(4); FB(4); FC(4); FD(4); FE(4); FT(4); FA(4); FB(4); FC(4); FD(4);
- FE(4); FT(4); FA(4); FB(4); FC(4); FD(4); FE(4); FT(4); FA(4); FB(4);
- sha_info->digest[0] += E;
- sha_info->digest[1] += T;
- sha_info->digest[2] += A;
- sha_info->digest[3] += B;
- sha_info->digest[4] += C;
-#else /* !UNRAVEL */
-#ifdef UNROLL_LOOPS
- FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1);
- FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1);
- FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2);
- FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2);
- FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3);
- FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3);
- FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4);
- FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4);
-#else /* !UNROLL_LOOPS */
- for (i = 0; i < 20; ++i) { FG(1); }
- for (i = 20; i < 40; ++i) { FG(2); }
- for (i = 40; i < 60; ++i) { FG(3); }
- for (i = 60; i < 80; ++i) { FG(4); }
-#endif /* !UNROLL_LOOPS */
- sha_info->digest[0] += A;
- sha_info->digest[1] += B;
- sha_info->digest[2] += C;
- sha_info->digest[3] += D;
- sha_info->digest[4] += E;
-#endif /* !UNRAVEL */
-}
-
-/* initialize the SHA digest */
-
-static void
-sha_init(SHAobject *sha_info)
-{
- TestEndianness(sha_info->Endianness)
-
- sha_info->digest[0] = 0x67452301L;
- sha_info->digest[1] = 0xefcdab89L;
- sha_info->digest[2] = 0x98badcfeL;
- sha_info->digest[3] = 0x10325476L;
- sha_info->digest[4] = 0xc3d2e1f0L;
- sha_info->count_lo = 0L;
- sha_info->count_hi = 0L;
- sha_info->local = 0;
-}
-
-/* update the SHA digest */
-
-static void
-sha_update(SHAobject *sha_info, SHA_BYTE *buffer, int count)
-{
- int i;
- SHA_INT32 clo;
-
- clo = sha_info->count_lo + ((SHA_INT32) count << 3);
- if (clo < sha_info->count_lo) {
- ++sha_info->count_hi;
- }
- sha_info->count_lo = clo;
- sha_info->count_hi += (SHA_INT32) count >> 29;
- if (sha_info->local) {
- i = SHA_BLOCKSIZE - sha_info->local;
- if (i > count) {
- i = count;
- }
- memcpy(((SHA_BYTE *) sha_info->data) + sha_info->local, buffer, i);
- count -= i;
- buffer += i;
- sha_info->local += i;
- if (sha_info->local == SHA_BLOCKSIZE) {
- sha_transform(sha_info);
- }
- else {
- return;
- }
- }
- while (count >= SHA_BLOCKSIZE) {
- memcpy(sha_info->data, buffer, SHA_BLOCKSIZE);
- buffer += SHA_BLOCKSIZE;
- count -= SHA_BLOCKSIZE;
- sha_transform(sha_info);
- }
- memcpy(sha_info->data, buffer, count);
- sha_info->local = count;
-}
-
-/* finish computing the SHA digest */
-
-static void
-sha_final(unsigned char digest[20], SHAobject *sha_info)
-{
- int count;
- SHA_INT32 lo_bit_count, hi_bit_count;
-
- lo_bit_count = sha_info->count_lo;
- hi_bit_count = sha_info->count_hi;
- count = (int) ((lo_bit_count >> 3) & 0x3f);
- ((SHA_BYTE *) sha_info->data)[count++] = 0x80;
- if (count > SHA_BLOCKSIZE - 8) {
- memset(((SHA_BYTE *) sha_info->data) + count, 0,
- SHA_BLOCKSIZE - count);
- sha_transform(sha_info);
- memset((SHA_BYTE *) sha_info->data, 0, SHA_BLOCKSIZE - 8);
- }
- else {
- memset(((SHA_BYTE *) sha_info->data) + count, 0,
- SHA_BLOCKSIZE - 8 - count);
- }
-
- /* GJS: note that we add the hi/lo in big-endian. sha_transform will
- swap these values into host-order. */
- sha_info->data[56] = (hi_bit_count >> 24) & 0xff;
- sha_info->data[57] = (hi_bit_count >> 16) & 0xff;
- sha_info->data[58] = (hi_bit_count >> 8) & 0xff;
- sha_info->data[59] = (hi_bit_count >> 0) & 0xff;
- sha_info->data[60] = (lo_bit_count >> 24) & 0xff;
- sha_info->data[61] = (lo_bit_count >> 16) & 0xff;
- sha_info->data[62] = (lo_bit_count >> 8) & 0xff;
- sha_info->data[63] = (lo_bit_count >> 0) & 0xff;
- sha_transform(sha_info);
- digest[ 0] = (unsigned char) ((sha_info->digest[0] >> 24) & 0xff);
- digest[ 1] = (unsigned char) ((sha_info->digest[0] >> 16) & 0xff);
- digest[ 2] = (unsigned char) ((sha_info->digest[0] >> 8) & 0xff);
- digest[ 3] = (unsigned char) ((sha_info->digest[0] ) & 0xff);
- digest[ 4] = (unsigned char) ((sha_info->digest[1] >> 24) & 0xff);
- digest[ 5] = (unsigned char) ((sha_info->digest[1] >> 16) & 0xff);
- digest[ 6] = (unsigned char) ((sha_info->digest[1] >> 8) & 0xff);
- digest[ 7] = (unsigned char) ((sha_info->digest[1] ) & 0xff);
- digest[ 8] = (unsigned char) ((sha_info->digest[2] >> 24) & 0xff);
- digest[ 9] = (unsigned char) ((sha_info->digest[2] >> 16) & 0xff);
- digest[10] = (unsigned char) ((sha_info->digest[2] >> 8) & 0xff);
- digest[11] = (unsigned char) ((sha_info->digest[2] ) & 0xff);
- digest[12] = (unsigned char) ((sha_info->digest[3] >> 24) & 0xff);
- digest[13] = (unsigned char) ((sha_info->digest[3] >> 16) & 0xff);
- digest[14] = (unsigned char) ((sha_info->digest[3] >> 8) & 0xff);
- digest[15] = (unsigned char) ((sha_info->digest[3] ) & 0xff);
- digest[16] = (unsigned char) ((sha_info->digest[4] >> 24) & 0xff);
- digest[17] = (unsigned char) ((sha_info->digest[4] >> 16) & 0xff);
- digest[18] = (unsigned char) ((sha_info->digest[4] >> 8) & 0xff);
- digest[19] = (unsigned char) ((sha_info->digest[4] ) & 0xff);
-}
-
-/*
- * End of copied SHA code.
- *
- * ------------------------------------------------------------------------
- */
-
-static PyTypeObject SHAtype;
-
-
-static SHAobject *
-newSHAobject(void)
-{
- return (SHAobject *)PyObject_New(SHAobject, &SHAtype);
-}
-
-/* Internal methods for a hashing object */
-
-static void
-SHA_dealloc(PyObject *ptr)
-{
- PyObject_Del(ptr);
-}
-
-
-/* External methods for a hashing object */
-
-PyDoc_STRVAR(SHA_copy__doc__, "Return a copy of the hashing object.");
-
-static PyObject *
-SHA_copy(SHAobject *self, PyObject *unused)
-{
- SHAobject *newobj;
-
- if ( (newobj = newSHAobject())==NULL)
- return NULL;
-
- SHAcopy(self, newobj);
- return (PyObject *)newobj;
-}
-
-PyDoc_STRVAR(SHA_digest__doc__,
-"Return the digest value as a string of binary data.");
-
-static PyObject *
-SHA_digest(SHAobject *self, PyObject *unused)
-{
- unsigned char digest[SHA_DIGESTSIZE];
- SHAobject temp;
-
- SHAcopy(self, &temp);
- sha_final(digest, &temp);
- return PyString_FromStringAndSize((const char *)digest, sizeof(digest));
-}
-
-PyDoc_STRVAR(SHA_hexdigest__doc__,
-"Return the digest value as a string of hexadecimal digits.");
-
-static PyObject *
-SHA_hexdigest(SHAobject *self, PyObject *unused)
-{
- unsigned char digest[SHA_DIGESTSIZE];
- SHAobject temp;
- PyObject *retval;
- char *hex_digest;
- int i, j;
-
- /* Get the raw (binary) digest value */
- SHAcopy(self, &temp);
- sha_final(digest, &temp);
-
- /* Create a new string */
- retval = PyString_FromStringAndSize(NULL, sizeof(digest) * 2);
- if (!retval)
- return NULL;
- hex_digest = PyString_AsString(retval);
- if (!hex_digest) {
- Py_DECREF(retval);
- return NULL;
- }
-
- /* Make hex version of the digest */
- for(i=j=0; i<sizeof(digest); i++) {
- char c;
- c = (digest[i] >> 4) & 0xf;
- c = (c>9) ? c+'a'-10 : c + '0';
- hex_digest[j++] = c;
- c = (digest[i] & 0xf);
- c = (c>9) ? c+'a'-10 : c + '0';
- hex_digest[j++] = c;
- }
- return retval;
-}
-
-PyDoc_STRVAR(SHA_update__doc__,
-"Update this hashing object's state with the provided string.");
-
-static PyObject *
-SHA_update(SHAobject *self, PyObject *args)
-{
- unsigned char *cp;
- int len;
-
- if (!PyArg_ParseTuple(args, "s#:update", &cp, &len))
- return NULL;
-
- sha_update(self, cp, len);
-
- Py_INCREF(Py_None);
- return Py_None;
-}
-
-static PyMethodDef SHA_methods[] = {
- {"copy", (PyCFunction)SHA_copy, METH_NOARGS, SHA_copy__doc__},
- {"digest", (PyCFunction)SHA_digest, METH_NOARGS, SHA_digest__doc__},
- {"hexdigest", (PyCFunction)SHA_hexdigest, METH_NOARGS, SHA_hexdigest__doc__},
- {"update", (PyCFunction)SHA_update, METH_VARARGS, SHA_update__doc__},
- {NULL, NULL} /* sentinel */
-};
-
-static PyObject *
-SHA_get_block_size(PyObject *self, void *closure)
-{
- return PyInt_FromLong(SHA_BLOCKSIZE);
-}
-
-static PyObject *
-SHA_get_digest_size(PyObject *self, void *closure)
-{
- return PyInt_FromLong(SHA_DIGESTSIZE);
-}
-
-static PyObject *
-SHA_get_name(PyObject *self, void *closure)
-{
- return PyString_FromStringAndSize("SHA1", 4);
-}
-
-static PyGetSetDef SHA_getseters[] = {
- {"digest_size",
- (getter)SHA_get_digest_size, NULL,
- NULL,
- NULL},
- {"block_size",
- (getter)SHA_get_block_size, NULL,
- NULL,
- NULL},
- {"name",
- (getter)SHA_get_name, NULL,
- NULL,
- NULL},
- /* the old md5 and sha modules support 'digest_size' as in PEP 247.
- * the old sha module also supported 'digestsize'. ugh. */
- {"digestsize",
- (getter)SHA_get_digest_size, NULL,
- NULL,
- NULL},
- {NULL} /* Sentinel */
-};
-
-static PyTypeObject SHAtype = {
- PyObject_HEAD_INIT(NULL)
- 0, /*ob_size*/
- "_sha.sha", /*tp_name*/
- sizeof(SHAobject), /*tp_size*/
- 0, /*tp_itemsize*/
- /* methods */
- SHA_dealloc, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_compare*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash*/
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT, /*tp_flags*/
- 0, /*tp_doc*/
- 0, /*tp_traverse*/
- 0, /*tp_clear*/
- 0, /*tp_richcompare*/
- 0, /*tp_weaklistoffset*/
- 0, /*tp_iter*/
- 0, /*tp_iternext*/
- SHA_methods, /* tp_methods */
- 0, /* tp_members */
- SHA_getseters, /* tp_getset */
-};
-
-
-/* The single module-level function: new() */
-
-PyDoc_STRVAR(SHA_new__doc__,
-"Return a new SHA hashing object. An optional string argument\n\
-may be provided; if present, this string will be automatically\n\
-hashed.");
-
-static PyObject *
-SHA_new(PyObject *self, PyObject *args, PyObject *kwdict)
-{
- static char *kwlist[] = {"string", NULL};
- SHAobject *new;
- unsigned char *cp = NULL;
- int len;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s#:new", kwlist,
- &cp, &len)) {
- return NULL;
- }
-
- if ((new = newSHAobject()) == NULL)
- return NULL;
-
- sha_init(new);
-
- if (PyErr_Occurred()) {
- Py_DECREF(new);
- return NULL;
- }
- if (cp)
- sha_update(new, cp, len);
-
- return (PyObject *)new;
-}
-
-
-/* List of functions exported by this module */
-
-static struct PyMethodDef SHA_functions[] = {
- {"new", (PyCFunction)SHA_new, METH_VARARGS|METH_KEYWORDS, SHA_new__doc__},
- {NULL, NULL} /* Sentinel */
-};
-
-
-/* Initialize this module. */
-
-#define insint(n,v) { PyModule_AddIntConstant(m,n,v); }
-
-PyMODINIT_FUNC
-init_sha(void)
-{
- PyObject *m;
-
- SHAtype.ob_type = &PyType_Type;
- if (PyType_Ready(&SHAtype) < 0)
- return;
- m = Py_InitModule("_sha", SHA_functions);
- if (m == NULL)
- return;
-
- /* Add some symbolic constants to the module */
- insint("blocksize", 1); /* For future use, in case some hash
- functions require an integral number of
- blocks */
- insint("digestsize", 20);
- insint("digest_size", 20);
-}
diff --git a/Modules/timing.h b/Modules/timing.h
deleted file mode 100644
index af26f1a6cb6..00000000000
--- a/Modules/timing.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (c) 1993 George V. Neville-Neil
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by George V. Neville-Neil
- * 4. The name, George Neville-Neil may not be used to endorse or promote
- * products derived from this software without specific prior
- * written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _TIMING_H_
-#define _TIMING_H_
-
-#ifdef TIME_WITH_SYS_TIME
-#include <sys/time.h>
-#include <time.h>
-#else /* !TIME_WITH_SYS_TIME */
-#ifdef HAVE_SYS_TIME_H
-#include <sys/time.h>
-#else /* !HAVE_SYS_TIME_H */
-#include <time.h>
-#endif /* !HAVE_SYS_TIME_H */
-#endif /* !TIME_WITH_SYS_TIME */
-
-static struct timeval aftertp, beforetp;
-
-#define BEGINTIMING gettimeofday(&beforetp, NULL)
-
-#define ENDTIMING gettimeofday(&aftertp, NULL); \
- if(beforetp.tv_usec > aftertp.tv_usec) \
- { \
- aftertp.tv_usec += 1000000; \
- aftertp.tv_sec--; \
- }
-
-#define TIMINGUS (((aftertp.tv_sec - beforetp.tv_sec) * 1000000) + \
- (aftertp.tv_usec - beforetp.tv_usec))
-
-#define TIMINGMS (((aftertp.tv_sec - beforetp.tv_sec) * 1000) + \
- ((aftertp.tv_usec - beforetp.tv_usec) / 1000))
-
-#define TIMINGS ((aftertp.tv_sec - beforetp.tv_sec) + \
- (aftertp.tv_usec - beforetp.tv_usec) / 1000000)
-
-#endif /* _TIMING_H_ */
diff --git a/Modules/timingmodule.c b/Modules/timingmodule.c
deleted file mode 100644
index 56e057a656a..00000000000
--- a/Modules/timingmodule.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Author: George V. Neville-Neil
- */
-
-#include "Python.h"
-
-/* Our stuff... */
-#include "timing.h"
-
-static PyObject *
-start_timing(PyObject *self)
-{
- Py_INCREF(Py_None);
- BEGINTIMING;
- return Py_None;
-}
-
-static PyObject *
-finish_timing(PyObject *self)
-{
- ENDTIMING
- Py_INCREF(Py_None);
- return Py_None;
-}
-
-static PyObject *
-seconds(PyObject *self)
-{
- return PyInt_FromLong(TIMINGS);
-}
-
-static PyObject *
-milli(PyObject *self)
-{
- return PyInt_FromLong(TIMINGMS);
-}
-
-static PyObject *
-micro(PyObject *self)
-{
- return PyInt_FromLong(TIMINGUS);
-}
-
-
-static PyMethodDef timing_methods[] = {
- {"start", (PyCFunction)start_timing, METH_NOARGS},
- {"finish", (PyCFunction)finish_timing, METH_NOARGS},
- {"seconds", (PyCFunction)seconds, METH_NOARGS},
- {"milli", (PyCFunction)milli, METH_NOARGS},
- {"micro", (PyCFunction)micro, METH_NOARGS},
- {NULL, NULL}
-};
-
-
-PyMODINIT_FUNC inittiming(void)
-{
- (void)Py_InitModule("timing", timing_methods);
-}
diff --git a/Objects/abstract.c b/Objects/abstract.c
index 20e171119f1..84b3384925d 100644
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -2131,8 +2131,9 @@ int
PyObject_IsInstance(PyObject *inst, PyObject *cls)
{
PyObject *t, *v, *tb;
+ PyObject *checker;
PyErr_Fetch(&t, &v, &tb);
- PyObject *checker = PyObject_GetAttrString(cls, "__instancecheck__");
+ checker = PyObject_GetAttrString(cls, "__instancecheck__");
PyErr_Restore(t, v, tb);
if (checker != NULL) {
PyObject *res;
@@ -2201,8 +2202,9 @@ int
PyObject_IsSubclass(PyObject *derived, PyObject *cls)
{
PyObject *t, *v, *tb;
+ PyObject *checker;
PyErr_Fetch(&t, &v, &tb);
- PyObject *checker = PyObject_GetAttrString(cls, "__subclasscheck__");
+ checker = PyObject_GetAttrString(cls, "__subclasscheck__");
PyErr_Restore(t, v, tb);
if (checker != NULL) {
PyObject *res;
diff --git a/PC/WinMain.c b/PC/WinMain.c
index 00dc18d484b..2cdd0cb695d 100644
--- a/PC/WinMain.c
+++ b/PC/WinMain.c
@@ -1,10 +1,10 @@
/* Minimal main program -- everything is loaded from the library. */
+#include "Python.h"
+
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
-#include "Python.h"
-
int WINAPI WinMain(
HINSTANCE hInstance, /* handle to current instance */
HINSTANCE hPrevInstance, /* handle to previous instance */
diff --git a/PC/_winreg.c b/PC/_winreg.c
index b981ee3d9ef..ffaaaee5003 100644
--- a/PC/_winreg.c
+++ b/PC/_winreg.c
@@ -12,10 +12,10 @@
*/
-#include "windows.h"
#include "Python.h"
#include "structmember.h"
#include "malloc.h" /* for alloca */
+#include "windows.h"
static BOOL PyHKEY_AsHKEY(PyObject *ob, HKEY *pRes, BOOL bNoneOK);
static PyObject *PyHKEY_FromHKEY(HKEY h);
diff --git a/PC/dl_nt.c b/PC/dl_nt.c
index 2608f7e7aaf..a87b523818a 100644
--- a/PC/dl_nt.c
+++ b/PC/dl_nt.c
@@ -7,11 +7,9 @@ be called, removing that burden (and possible source of frustration if
forgotten) from the programmer.
*/
-#include "windows.h"
-/* NT and Python share these */
-#include "pyconfig.h"
#include "Python.h"
+#include "windows.h"
char dllVersionBuffer[16] = ""; // a private buffer
diff --git a/PC/os2emx/Makefile b/PC/os2emx/Makefile
index 0739f9c4ce1..e13a666221f 100644
--- a/PC/os2emx/Makefile
+++ b/PC/os2emx/Makefile
@@ -300,12 +300,8 @@ SRC.MODULES= $(addprefix $(TOP), \
Modules/itertoolsmodule.c \
Modules/_localemodule.c \
Modules/mathmodule.c \
- Modules/md5.c \
- Modules/md5module.c \
Modules/operator.c \
Modules/_randommodule.c \
- Modules/rgbimgmodule.c \
- Modules/shamodule.c \
Modules/sha256module.c \
Modules/sha512module.c \
Modules/_sre.c \
@@ -313,7 +309,6 @@ SRC.MODULES= $(addprefix $(TOP), \
Modules/symtablemodule.c \
Modules/termios.c \
Modules/timemodule.c \
- Modules/timingmodule.c \
Modules/_weakref.c \
Modules/xxsubtype.c \
Modules/zipimport.c)
diff --git a/PC/os2emx/config.c b/PC/os2emx/config.c
index f47941e1df4..26714a3dca7 100644
--- a/PC/os2emx/config.c
+++ b/PC/os2emx/config.c
@@ -65,14 +65,12 @@ extern void inititertools();
extern void initmath();
extern void init_md5();
extern void initoperator();
-extern void initrgbimg();
extern void init_sha();
extern void init_sha256();
extern void init_sha512();
extern void init_struct();
extern void inittermios();
extern void inittime();
-extern void inittiming();
extern void initxxsubtype();
extern void initzipimport();
#if !HAVE_DYNAMIC_LOADING
@@ -127,16 +125,12 @@ struct _inittab _PyImport_Inittab[] = {
{"imageop", initimageop},
{"itertools", inititertools},
{"math", initmath},
- {"_md5", init_md5},
{"operator", initoperator},
- {"rgbimg", initrgbimg},
- {"_sha", init_sha},
{"_sha256", init_sha256},
{"_sha512", init_sha512},
{"_struct", init_struct},
{"termios", inittermios},
{"time", inittime},
- {"timing", inittiming},
{"xxsubtype", initxxsubtype},
{"zipimport", initzipimport},
#if !HAVE_DYNAMIC_LOADING
diff --git a/PC/os2emx/python25.def b/PC/os2emx/python25.def
index e262e2371c8..190b3aae3a8 100644
--- a/PC/os2emx/python25.def
+++ b/PC/os2emx/python25.def
@@ -1255,26 +1255,12 @@ EXPORTS
; From python25_s.lib(mathmodule)
; "initmath"
-; From python25_s.lib(md5)
- "md5_finish"
- "md5_init"
- "md5_append"
-
-; From python25_s.lib(md5module)
-; "init_md5"
-
; From python25_s.lib(operator)
; "initoperator"
; From python25_s.lib(_randommodule)
; "init_random"
-; From python25_s.lib(rgbimgmodule)
-; "initrgbimg"
-
-; From python25_s.lib(shamodule)
-; "init_sha"
-
; From python25_s.lib(sha256module)
; "init_sha256"
@@ -1298,9 +1284,6 @@ EXPORTS
"_PyTime_DoubleToTimet"
; "inittimezone"
-; From python25_s.lib(timingmodule)
-; "inittiming"
-
; From python25_s.lib(_weakref)
; "init_weakref"
diff --git a/PC/os2vacpp/makefile b/PC/os2vacpp/makefile
index 8136f48adb9..e880225f666 100644
--- a/PC/os2vacpp/makefile
+++ b/PC/os2vacpp/makefile
@@ -371,19 +371,6 @@ _tkinter.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\class
$(PY_INCLUDE)\sliceobject.h $(PY_INCLUDE)\stringobject.h \
$(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h $(PY_INCLUDE)\tupleobject.h
-almodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classobject.h \
- $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h pyconfig.h \
- $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h $(PY_INCLUDE)\floatobject.h \
- $(PY_INCLUDE)\funcobject.h $(PY_INCLUDE)\import.h $(PY_INCLUDE)\intobject.h \
- $(PY_INCLUDE)\intrcheck.h $(PY_INCLUDE)\listobject.h $(PY_INCLUDE)\longobject.h \
- $(PY_INCLUDE)\methodobject.h $(PY_INCLUDE)\modsupport.h \
- $(PY_INCLUDE)\moduleobject.h $(PY_INCLUDE)\mymalloc.h $(PY_INCLUDE)\myproto.h \
- $(PY_INCLUDE)\object.h $(PY_INCLUDE)\objimpl.h $(PY_INCLUDE)\pydebug.h \
- $(PY_INCLUDE)\pyerrors.h $(PY_INCLUDE)\pyfpe.h $(PY_INCLUDE)\pystate.h \
- $(PY_INCLUDE)\python.h $(PY_INCLUDE)\pythonrun.h $(PY_INCLUDE)\rangeobject.h \
- $(PY_INCLUDE)\sliceobject.h $(PY_INCLUDE)\stringobject.h \
- $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h $(PY_INCLUDE)\tupleobject.h
-
arraymodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h \
$(PY_INCLUDE)\classobject.h $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h \
pyconfig.h $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h \
@@ -439,46 +426,6 @@ bsddbmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h \
$(PY_INCLUDE)\stringobject.h $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h \
$(PY_INCLUDE)\tupleobject.h
-cdmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classobject.h \
- $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h pyconfig.h \
- $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h $(PY_INCLUDE)\floatobject.h \
- $(PY_INCLUDE)\funcobject.h $(PY_INCLUDE)\import.h $(PY_INCLUDE)\intobject.h \
- $(PY_INCLUDE)\intrcheck.h $(PY_INCLUDE)\listobject.h $(PY_INCLUDE)\longobject.h \
- $(PY_INCLUDE)\methodobject.h $(PY_INCLUDE)\modsupport.h \
- $(PY_INCLUDE)\moduleobject.h $(PY_INCLUDE)\mymalloc.h $(PY_INCLUDE)\myproto.h \
- $(PY_INCLUDE)\object.h $(PY_INCLUDE)\objimpl.h $(PY_INCLUDE)\pydebug.h \
- $(PY_INCLUDE)\pyerrors.h $(PY_INCLUDE)\pyfpe.h $(PY_INCLUDE)\pystate.h \
- $(PY_INCLUDE)\python.h $(PY_INCLUDE)\pythonrun.h $(PY_INCLUDE)\rangeobject.h \
- $(PY_INCLUDE)\sliceobject.h $(PY_INCLUDE)\stringobject.h \
- $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h $(PY_INCLUDE)\tupleobject.h
-
-cgensupport.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h \
- $(PY_MODULES)\cgensupport.h $(PY_INCLUDE)\classobject.h $(PY_INCLUDE)\cobject.h \
- $(PY_INCLUDE)\complexobject.h pyconfig.h $(PY_INCLUDE)\dictobject.h \
- $(PY_INCLUDE)\fileobject.h $(PY_INCLUDE)\floatobject.h $(PY_INCLUDE)\funcobject.h \
- $(PY_INCLUDE)\import.h $(PY_INCLUDE)\intobject.h $(PY_INCLUDE)\intrcheck.h \
- $(PY_INCLUDE)\listobject.h $(PY_INCLUDE)\longobject.h \
- $(PY_INCLUDE)\methodobject.h $(PY_INCLUDE)\modsupport.h \
- $(PY_INCLUDE)\moduleobject.h $(PY_INCLUDE)\mymalloc.h $(PY_INCLUDE)\myproto.h \
- $(PY_INCLUDE)\object.h $(PY_INCLUDE)\objimpl.h $(PY_INCLUDE)\pydebug.h \
- $(PY_INCLUDE)\pyerrors.h $(PY_INCLUDE)\pyfpe.h $(PY_INCLUDE)\pystate.h \
- $(PY_INCLUDE)\python.h $(PY_INCLUDE)\pythonrun.h $(PY_INCLUDE)\rangeobject.h \
- $(PY_INCLUDE)\sliceobject.h $(PY_INCLUDE)\stringobject.h \
- $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h $(PY_INCLUDE)\tupleobject.h
-
-clmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classobject.h \
- $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h pyconfig.h \
- $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h $(PY_INCLUDE)\floatobject.h \
- $(PY_INCLUDE)\funcobject.h $(PY_INCLUDE)\import.h $(PY_INCLUDE)\intobject.h \
- $(PY_INCLUDE)\intrcheck.h $(PY_INCLUDE)\listobject.h $(PY_INCLUDE)\longobject.h \
- $(PY_INCLUDE)\methodobject.h $(PY_INCLUDE)\modsupport.h \
- $(PY_INCLUDE)\moduleobject.h $(PY_INCLUDE)\mymalloc.h $(PY_INCLUDE)\myproto.h \
- $(PY_INCLUDE)\object.h $(PY_INCLUDE)\objimpl.h $(PY_INCLUDE)\pydebug.h \
- $(PY_INCLUDE)\pyerrors.h $(PY_INCLUDE)\pyfpe.h $(PY_INCLUDE)\pystate.h \
- $(PY_INCLUDE)\python.h $(PY_INCLUDE)\pythonrun.h $(PY_INCLUDE)\rangeobject.h \
- $(PY_INCLUDE)\sliceobject.h $(PY_INCLUDE)\stringobject.h \
- $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h $(PY_INCLUDE)\tupleobject.h
-
cmathmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h \
$(PY_INCLUDE)\classobject.h $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h \
pyconfig.h $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h \
@@ -616,33 +563,6 @@ fcntlmodule.obj: $(PY_INCLUDE)\abstract.h $(OS2TCPIP)\Include\sys\ioctl.h $(PY_I
$(PY_INCLUDE)\stringobject.h $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h \
$(PY_INCLUDE)\tupleobject.h
-flmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classobject.h \
- $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h pyconfig.h \
- $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h $(PY_INCLUDE)\floatobject.h \
- $(PY_INCLUDE)\funcobject.h $(PY_INCLUDE)\import.h $(PY_INCLUDE)\intobject.h \
- $(PY_INCLUDE)\intrcheck.h $(PY_INCLUDE)\listobject.h $(PY_INCLUDE)\longobject.h \
- $(PY_INCLUDE)\methodobject.h $(PY_INCLUDE)\modsupport.h \
- $(PY_INCLUDE)\moduleobject.h $(PY_INCLUDE)\mymalloc.h $(PY_INCLUDE)\myproto.h \
- $(PY_INCLUDE)\object.h $(PY_INCLUDE)\objimpl.h $(PY_INCLUDE)\pydebug.h \
- $(PY_INCLUDE)\pyerrors.h $(PY_INCLUDE)\pyfpe.h $(PY_INCLUDE)\pystate.h \
- $(PY_INCLUDE)\python.h $(PY_INCLUDE)\pythonrun.h $(PY_INCLUDE)\rangeobject.h \
- $(PY_INCLUDE)\sliceobject.h $(PY_INCLUDE)\stringobject.h \
- $(PY_INCLUDE)\structmember.h $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h \
- $(PY_INCLUDE)\tupleobject.h
-
-fmmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classobject.h \
- $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h pyconfig.h \
- $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h $(PY_INCLUDE)\floatobject.h \
- $(PY_INCLUDE)\funcobject.h $(PY_INCLUDE)\import.h $(PY_INCLUDE)\intobject.h \
- $(PY_INCLUDE)\intrcheck.h $(PY_INCLUDE)\listobject.h $(PY_INCLUDE)\longobject.h \
- $(PY_INCLUDE)\methodobject.h $(PY_INCLUDE)\modsupport.h \
- $(PY_INCLUDE)\moduleobject.h $(PY_INCLUDE)\mymalloc.h $(PY_INCLUDE)\myproto.h \
- $(PY_INCLUDE)\object.h $(PY_INCLUDE)\objimpl.h $(PY_INCLUDE)\pydebug.h \
- $(PY_INCLUDE)\pyerrors.h $(PY_INCLUDE)\pyfpe.h $(PY_INCLUDE)\pystate.h \
- $(PY_INCLUDE)\python.h $(PY_INCLUDE)\pythonrun.h $(PY_INCLUDE)\rangeobject.h \
- $(PY_INCLUDE)\sliceobject.h $(PY_INCLUDE)\stringobject.h \
- $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h $(PY_INCLUDE)\tupleobject.h
-
fpectlmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h \
$(PY_INCLUDE)\classobject.h $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h \
pyconfig.h $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h \
@@ -700,20 +620,6 @@ getpath.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classo
$(PY_INCLUDE)\stringobject.h $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h \
$(PY_INCLUDE)\tupleobject.h
-glmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_MODULES)\cgensupport.h \
- $(PY_INCLUDE)\classobject.h $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h \
- pyconfig.h $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h \
- $(PY_INCLUDE)\floatobject.h $(PY_INCLUDE)\funcobject.h $(PY_INCLUDE)\import.h \
- $(PY_INCLUDE)\intobject.h $(PY_INCLUDE)\intrcheck.h $(PY_INCLUDE)\listobject.h \
- $(PY_INCLUDE)\longobject.h $(PY_INCLUDE)\methodobject.h \
- $(PY_INCLUDE)\modsupport.h $(PY_INCLUDE)\moduleobject.h $(PY_INCLUDE)\mymalloc.h \
- $(PY_INCLUDE)\myproto.h $(PY_INCLUDE)\object.h $(PY_INCLUDE)\objimpl.h \
- $(PY_INCLUDE)\pydebug.h $(PY_INCLUDE)\pyerrors.h $(PY_INCLUDE)\pyfpe.h \
- $(PY_INCLUDE)\pystate.h $(PY_INCLUDE)\python.h $(PY_INCLUDE)\pythonrun.h \
- $(PY_INCLUDE)\rangeobject.h $(PY_INCLUDE)\sliceobject.h \
- $(PY_INCLUDE)\stringobject.h $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h \
- $(PY_INCLUDE)\tupleobject.h
-
grpmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classobject.h \
$(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h pyconfig.h \
$(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h $(PY_INCLUDE)\floatobject.h \
@@ -741,19 +647,6 @@ imageop.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classo
$(PY_INCLUDE)\sliceobject.h $(PY_INCLUDE)\stringobject.h \
$(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h $(PY_INCLUDE)\tupleobject.h
-imgfile.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classobject.h \
- $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h pyconfig.h \
- $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h $(PY_INCLUDE)\floatobject.h \
- $(PY_INCLUDE)\funcobject.h $(PY_INCLUDE)\import.h $(PY_INCLUDE)\intobject.h \
- $(PY_INCLUDE)\intrcheck.h $(PY_INCLUDE)\listobject.h $(PY_INCLUDE)\longobject.h \
- $(PY_INCLUDE)\methodobject.h $(PY_INCLUDE)\modsupport.h \
- $(PY_INCLUDE)\moduleobject.h $(PY_INCLUDE)\mymalloc.h $(PY_INCLUDE)\myproto.h \
- $(PY_INCLUDE)\object.h $(PY_INCLUDE)\objimpl.h $(PY_INCLUDE)\pydebug.h \
- $(PY_INCLUDE)\pyerrors.h $(PY_INCLUDE)\pyfpe.h $(PY_INCLUDE)\pystate.h \
- $(PY_INCLUDE)\python.h $(PY_INCLUDE)\pythonrun.h $(PY_INCLUDE)\rangeobject.h \
- $(PY_INCLUDE)\sliceobject.h $(PY_INCLUDE)\stringobject.h \
- $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h $(PY_INCLUDE)\tupleobject.h
-
main.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classobject.h \
$(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h pyconfig.h \
$(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h $(PY_INCLUDE)\floatobject.h \
@@ -781,21 +674,6 @@ mathmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\cla
$(PY_INCLUDE)\stringobject.h $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h \
$(PY_INCLUDE)\tupleobject.h
-md5c.obj: pyconfig.h $(PY_MODULES)\md5.h
-
-md5module.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classobject.h \
- $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h pyconfig.h \
- $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h $(PY_INCLUDE)\floatobject.h \
- $(PY_INCLUDE)\funcobject.h $(PY_INCLUDE)\import.h $(PY_INCLUDE)\intobject.h \
- $(PY_INCLUDE)\intrcheck.h $(PY_INCLUDE)\listobject.h $(PY_INCLUDE)\longobject.h \
- $(PY_MODULES)\md5.h $(PY_INCLUDE)\methodobject.h $(PY_INCLUDE)\modsupport.h \
- $(PY_INCLUDE)\moduleobject.h $(PY_INCLUDE)\mymalloc.h $(PY_INCLUDE)\myproto.h \
- $(PY_INCLUDE)\object.h $(PY_INCLUDE)\objimpl.h $(PY_INCLUDE)\pydebug.h \
- $(PY_INCLUDE)\pyerrors.h $(PY_INCLUDE)\pyfpe.h $(PY_INCLUDE)\pystate.h \
- $(PY_INCLUDE)\python.h $(PY_INCLUDE)\pythonrun.h $(PY_INCLUDE)\rangeobject.h \
- $(PY_INCLUDE)\sliceobject.h $(PY_INCLUDE)\stringobject.h \
- $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h $(PY_INCLUDE)\tupleobject.h
-
mpzmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h \
$(PY_INCLUDE)\classobject.h $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h \
pyconfig.h $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h \
@@ -852,20 +730,6 @@ parsermodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h \
$(PY_INCLUDE)\stringobject.h $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\token.h \
$(PY_INCLUDE)\traceback.h $(PY_INCLUDE)\tupleobject.h
-pcremodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classobject.h \
- $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h pyconfig.h \
- $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h $(PY_INCLUDE)\floatobject.h \
- $(PY_INCLUDE)\funcobject.h $(PY_INCLUDE)\import.h $(PY_INCLUDE)\intobject.h \
- $(PY_INCLUDE)\intrcheck.h $(PY_INCLUDE)\listobject.h $(PY_INCLUDE)\longobject.h \
- $(PY_INCLUDE)\methodobject.h $(PY_INCLUDE)\modsupport.h \
- $(PY_INCLUDE)\moduleobject.h $(PY_INCLUDE)\mymalloc.h $(PY_INCLUDE)\myproto.h \
- $(PY_INCLUDE)\object.h $(PY_INCLUDE)\objimpl.h $(PY_MODULES)\pcre-internal.h \
- $(PY_MODULES)\pcre.h $(PY_INCLUDE)\pydebug.h $(PY_INCLUDE)\pyerrors.h \
- $(PY_INCLUDE)\pyfpe.h $(PY_INCLUDE)\pystate.h $(PY_INCLUDE)\python.h \
- $(PY_INCLUDE)\pythonrun.h $(PY_INCLUDE)\rangeobject.h $(PY_INCLUDE)\sliceobject.h \
- $(PY_INCLUDE)\stringobject.h $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h \
- $(PY_INCLUDE)\tupleobject.h
-
posix.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classobject.h \
$(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h pyconfig.h \
$(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h $(PY_INCLUDE)\floatobject.h \
@@ -894,19 +758,6 @@ posixmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h \
$(PY_INCLUDE)\stringobject.h $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h \
$(PY_INCLUDE)\tupleobject.h
-puremodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classobject.h \
- $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h pyconfig.h \
- $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h $(PY_INCLUDE)\floatobject.h \
- $(PY_INCLUDE)\funcobject.h $(PY_INCLUDE)\import.h $(PY_INCLUDE)\intobject.h \
- $(PY_INCLUDE)\intrcheck.h $(PY_INCLUDE)\listobject.h $(PY_INCLUDE)\longobject.h \
- $(PY_INCLUDE)\methodobject.h $(PY_INCLUDE)\modsupport.h \
- $(PY_INCLUDE)\moduleobject.h $(PY_INCLUDE)\mymalloc.h $(PY_INCLUDE)\myproto.h \
- $(PY_INCLUDE)\object.h $(PY_INCLUDE)\objimpl.h $(PY_INCLUDE)\pydebug.h \
- $(PY_INCLUDE)\pyerrors.h $(PY_INCLUDE)\pyfpe.h $(PY_INCLUDE)\pystate.h \
- $(PY_INCLUDE)\python.h $(PY_INCLUDE)\pythonrun.h $(PY_INCLUDE)\rangeobject.h \
- $(PY_INCLUDE)\sliceobject.h $(PY_INCLUDE)\stringobject.h \
- $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h $(PY_INCLUDE)\tupleobject.h
-
pwdmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classobject.h \
$(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h pyconfig.h \
$(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h $(PY_INCLUDE)\floatobject.h \
@@ -921,20 +772,6 @@ pwdmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\clas
$(PY_INCLUDE)\stringobject.h $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h \
$(PY_INCLUDE)\tupleobject.h
-pypcre.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classobject.h \
- $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h pyconfig.h \
- $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h $(PY_INCLUDE)\floatobject.h \
- $(PY_INCLUDE)\funcobject.h $(PY_INCLUDE)\graminit.h $(PY_INCLUDE)\import.h \
- $(PY_INCLUDE)\intobject.h $(PY_INCLUDE)\intrcheck.h $(PY_INCLUDE)\listobject.h \
- $(PY_INCLUDE)\longobject.h $(PY_INCLUDE)\methodobject.h \
- $(PY_INCLUDE)\modsupport.h $(PY_INCLUDE)\moduleobject.h $(PY_INCLUDE)\mymalloc.h \
- $(PY_INCLUDE)\myproto.h $(PY_INCLUDE)\object.h $(PY_INCLUDE)\objimpl.h \
- $(PY_MODULES)\pcre-internal.h $(PY_MODULES)\pcre.h $(PY_INCLUDE)\pydebug.h \
- $(PY_INCLUDE)\pyerrors.h $(PY_INCLUDE)\pyfpe.h $(PY_INCLUDE)\pystate.h \
- $(PY_INCLUDE)\python.h $(PY_INCLUDE)\pythonrun.h $(PY_INCLUDE)\rangeobject.h \
- $(PY_INCLUDE)\sliceobject.h $(PY_INCLUDE)\stringobject.h \
- $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h $(PY_INCLUDE)\tupleobject.h
-
readline.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classobject.h \
$(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h pyconfig.h \
$(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h $(PY_INCLUDE)\floatobject.h \
@@ -962,20 +799,6 @@ resource.obj: $(PY_INCLUDE)\abstract.h $(OS2TCPIP)\Include\sys\time.h $(PY_INCLU
$(PY_INCLUDE)\stringobject.h $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h \
$(PY_INCLUDE)\tupleobject.h
-rgbimgmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h \
- $(PY_INCLUDE)\classobject.h $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h \
- pyconfig.h $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h \
- $(PY_INCLUDE)\floatobject.h $(PY_INCLUDE)\funcobject.h $(PY_INCLUDE)\import.h \
- $(PY_INCLUDE)\intobject.h $(PY_INCLUDE)\intrcheck.h $(PY_INCLUDE)\listobject.h \
- $(PY_INCLUDE)\longobject.h $(PY_INCLUDE)\methodobject.h \
- $(PY_INCLUDE)\modsupport.h $(PY_INCLUDE)\moduleobject.h $(PY_INCLUDE)\mymalloc.h \
- $(PY_INCLUDE)\myproto.h $(PY_INCLUDE)\object.h $(PY_INCLUDE)\objimpl.h \
- $(PY_INCLUDE)\pydebug.h $(PY_INCLUDE)\pyerrors.h $(PY_INCLUDE)\pyfpe.h \
- $(PY_INCLUDE)\pystate.h $(PY_INCLUDE)\python.h $(PY_INCLUDE)\pythonrun.h \
- $(PY_INCLUDE)\rangeobject.h $(PY_INCLUDE)\sliceobject.h \
- $(PY_INCLUDE)\stringobject.h $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h \
- $(PY_INCLUDE)\tupleobject.h
-
selectmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h \
$(PY_INCLUDE)\classobject.h $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h \
pyconfig.h $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h \
@@ -990,19 +813,6 @@ selectmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h \
$(PY_INCLUDE)\sliceobject.h $(PY_INCLUDE)\stringobject.h \
$(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h $(PY_INCLUDE)\tupleobject.h
-sgimodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classobject.h \
- $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h pyconfig.h \
- $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h $(PY_INCLUDE)\floatobject.h \
- $(PY_INCLUDE)\funcobject.h $(PY_INCLUDE)\import.h $(PY_INCLUDE)\intobject.h \
- $(PY_INCLUDE)\intrcheck.h $(PY_INCLUDE)\listobject.h $(PY_INCLUDE)\longobject.h \
- $(PY_INCLUDE)\methodobject.h $(PY_INCLUDE)\modsupport.h \
- $(PY_INCLUDE)\moduleobject.h $(PY_INCLUDE)\mymalloc.h $(PY_INCLUDE)\myproto.h \
- $(PY_INCLUDE)\object.h $(PY_INCLUDE)\objimpl.h $(PY_INCLUDE)\pydebug.h \
- $(PY_INCLUDE)\pyerrors.h $(PY_INCLUDE)\pyfpe.h $(PY_INCLUDE)\pystate.h \
- $(PY_INCLUDE)\python.h $(PY_INCLUDE)\pythonrun.h $(PY_INCLUDE)\rangeobject.h \
- $(PY_INCLUDE)\sliceobject.h $(PY_INCLUDE)\stringobject.h \
- $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h $(PY_INCLUDE)\tupleobject.h
-
signalmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h \
$(PY_INCLUDE)\classobject.h $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h \
pyconfig.h $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h \
@@ -1032,33 +842,6 @@ socketmodule.obj: $(PY_INCLUDE)\abstract.h $(OS2TCPIP)\Include\netinet\in.h \
$(PY_INCLUDE)\stringobject.h $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h \
$(PY_INCLUDE)\tupleobject.h
-soundex.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classobject.h \
- $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h pyconfig.h \
- $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h $(PY_INCLUDE)\floatobject.h \
- $(PY_INCLUDE)\funcobject.h $(PY_INCLUDE)\import.h $(PY_INCLUDE)\intobject.h \
- $(PY_INCLUDE)\intrcheck.h $(PY_INCLUDE)\listobject.h $(PY_INCLUDE)\longobject.h \
- $(PY_INCLUDE)\methodobject.h $(PY_INCLUDE)\modsupport.h \
- $(PY_INCLUDE)\moduleobject.h $(PY_INCLUDE)\mymalloc.h $(PY_INCLUDE)\myproto.h \
- $(PY_INCLUDE)\object.h $(PY_INCLUDE)\objimpl.h $(PY_INCLUDE)\pydebug.h \
- $(PY_INCLUDE)\pyerrors.h $(PY_INCLUDE)\pyfpe.h $(PY_INCLUDE)\pystate.h \
- $(PY_INCLUDE)\python.h $(PY_INCLUDE)\pythonrun.h $(PY_INCLUDE)\rangeobject.h \
- $(PY_INCLUDE)\sliceobject.h $(PY_INCLUDE)\stringobject.h \
- $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h $(PY_INCLUDE)\tupleobject.h
-
-stdwinmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h \
- $(PY_INCLUDE)\classobject.h $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h \
- pyconfig.h $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h \
- $(PY_INCLUDE)\floatobject.h $(PY_INCLUDE)\funcobject.h $(PY_INCLUDE)\import.h \
- $(PY_INCLUDE)\intobject.h $(PY_INCLUDE)\intrcheck.h $(PY_INCLUDE)\listobject.h \
- $(PY_INCLUDE)\longobject.h $(PY_INCLUDE)\methodobject.h \
- $(PY_INCLUDE)\modsupport.h $(PY_INCLUDE)\moduleobject.h $(PY_INCLUDE)\mymalloc.h \
- $(PY_INCLUDE)\myproto.h $(PY_INCLUDE)\object.h $(PY_INCLUDE)\objimpl.h \
- $(PY_INCLUDE)\pydebug.h $(PY_INCLUDE)\pyerrors.h $(PY_INCLUDE)\pyfpe.h \
- $(PY_INCLUDE)\pystate.h $(PY_INCLUDE)\python.h $(PY_INCLUDE)\pythonrun.h \
- $(PY_INCLUDE)\rangeobject.h $(PY_INCLUDE)\sliceobject.h \
- $(PY_INCLUDE)\stringobject.h $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h \
- $(PY_INCLUDE)\tupleobject.h
-
structmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h \
$(PY_INCLUDE)\classobject.h $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h \
pyconfig.h $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h \
@@ -1087,21 +870,6 @@ sunaudiodev.obj: $(PY_INCLUDE)\abstract.h $(OS2TCPIP)\Include\sys\ioctl.h $(PY_I
$(PY_INCLUDE)\stringobject.h $(PY_INCLUDE)\structmember.h \
$(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h $(PY_INCLUDE)\tupleobject.h
-svmodule.obj: $(PY_INCLUDE)\abstract.h $(OS2TCPIP)\Include\sys\time.h $(PY_INCLUDE)\ceval.h \
- $(PY_INCLUDE)\classobject.h $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\compile.h \
- $(PY_INCLUDE)\complexobject.h pyconfig.h $(PY_INCLUDE)\dictobject.h \
- $(PY_INCLUDE)\fileobject.h $(PY_INCLUDE)\floatobject.h $(PY_INCLUDE)\funcobject.h \
- $(PY_INCLUDE)\import.h $(PY_INCLUDE)\intobject.h $(PY_INCLUDE)\intrcheck.h \
- $(PY_INCLUDE)\listobject.h $(PY_INCLUDE)\longobject.h \
- $(PY_INCLUDE)\methodobject.h $(PY_INCLUDE)\modsupport.h \
- $(PY_INCLUDE)\moduleobject.h $(PY_INCLUDE)\mymalloc.h $(PY_INCLUDE)\myproto.h \
- $(PY_INCLUDE)\object.h $(PY_INCLUDE)\objimpl.h $(PY_INCLUDE)\pydebug.h \
- $(PY_INCLUDE)\pyerrors.h $(PY_INCLUDE)\pyfpe.h $(PY_INCLUDE)\pystate.h \
- $(PY_INCLUDE)\python.h $(PY_INCLUDE)\pythonrun.h $(PY_INCLUDE)\rangeobject.h \
- $(PY_INCLUDE)\sliceobject.h $(PY_INCLUDE)\stringobject.h \
- $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h $(PY_INCLUDE)\tupleobject.h \
- $(PY_MODULES)\yuv.h
-
syslogmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h \
$(PY_INCLUDE)\classobject.h $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h \
pyconfig.h $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h \
@@ -1157,20 +925,6 @@ timemodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\cla
$(PY_INCLUDE)\stringobject.h $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h \
$(PY_INCLUDE)\tupleobject.h
-timingmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h \
- $(PY_INCLUDE)\classobject.h $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h \
- pyconfig.h $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h \
- $(PY_INCLUDE)\floatobject.h $(PY_INCLUDE)\funcobject.h $(PY_INCLUDE)\import.h \
- $(PY_INCLUDE)\intobject.h $(PY_INCLUDE)\intrcheck.h $(PY_INCLUDE)\listobject.h \
- $(PY_INCLUDE)\longobject.h $(PY_INCLUDE)\methodobject.h \
- $(PY_INCLUDE)\modsupport.h $(PY_INCLUDE)\moduleobject.h $(PY_INCLUDE)\mymalloc.h \
- $(PY_INCLUDE)\myproto.h $(PY_INCLUDE)\object.h $(PY_INCLUDE)\objimpl.h \
- $(PY_INCLUDE)\pydebug.h $(PY_INCLUDE)\pyerrors.h $(PY_INCLUDE)\pyfpe.h \
- $(PY_INCLUDE)\pystate.h $(PY_INCLUDE)\python.h $(PY_INCLUDE)\pythonrun.h \
- $(PY_INCLUDE)\rangeobject.h $(PY_INCLUDE)\sliceobject.h \
- $(PY_INCLUDE)\stringobject.h $(PY_INCLUDE)\sysmodule.h $(PY_MODULES)\timing.h \
- $(PY_INCLUDE)\traceback.h $(PY_INCLUDE)\tupleobject.h
-
xxmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classobject.h \
$(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h pyconfig.h \
$(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h $(PY_INCLUDE)\floatobject.h \
diff --git a/PC/os2vacpp/makefile.omk b/PC/os2vacpp/makefile.omk
index fe5fafac1c4..783e5ecc7cc 100644
--- a/PC/os2vacpp/makefile.omk
+++ b/PC/os2vacpp/makefile.omk
@@ -170,45 +170,30 @@ MODULES = \
# Omitted Modules (and Description/Reason):
#
# Multimedia:
- # almodule.c -- Non-OS/2 Audio Channel Facility (?)
- # cdmodule.c -- Wrapper of Non-OS/2 CD Audio Functions
# audioop.c -- Various Compute Operations on Audio Samples
# imageop.c -- Various Compute Operations on Video Samples
- # imgfile.c -- Wrapper of SGI ImageLib API
- # rgbimgmodule.c -- Non-OS/2 Image Read/Write Capability (Primitive)
# sunaudiodev.c -- Wrapper of Sun Audio Device API
- # clmodule.c -- Wrapper of SGI Image/Audio Compression API
# Database:
# dbmmodule.c -- Wrapper of DBM Database API (Generic Flavor)
- # bsddbmodule.c -- Wrapper of DBM Database API (BSD Flavor)
# gdbmmodule.c -- Wrapper of DBM Database API (GNU Flavor)
# Cryptography:
# cryptmodule.c -- Simple Wrapper for crypt() Function
- # rotormodule.c -- Implementation of Enigma Crypto Based on Rotors
-# cgensupport.obj \
# fcntlmodule.obj \
-# fmmodule.obj \
# fpectlmodule.obj \
# fpetestmodule.obj \
# Unix-Specific getpath.obj \
-# glmodule.obj \
# grpmodule.obj \
# mpzmodule.obj \
# nismodule.obj \
# parsermodule.obj \
-# pcremodule.obj \
# pwdmodule.obj \
-# pypcre.obj \
# readline.obj \
# resource.obj \
-# sgimodule.obj \
-# svmodule.obj \
# syslogmodule.obj \
# termios.obj \
-# timingmodule.obj \
# User Interface:
# _tkinter.obj \
@@ -358,14 +343,6 @@ _tkinter.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
pythonrun.h rangeobject.h sliceobject.h stringobject.h sysmodule.h \
traceback.h tupleobject.h
-almodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
- pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
- import.h intobject.h intrcheck.h listobject.h longobject.h \
- methodobject.h modsupport.h moduleobject.h mymalloc.h myproto.h \
- object.h objimpl.h pydebug.h pyerrors.h pyfpe.h pystate.h python.h \
- pythonrun.h rangeobject.h sliceobject.h stringobject.h sysmodule.h \
- traceback.h tupleobject.h
-
arraymodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
import.h intobject.h intrcheck.h listobject.h longobject.h \
@@ -398,30 +375,6 @@ bsddbmodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
pythonrun.h rangeobject.h sliceobject.h stringobject.h sysmodule.h \
traceback.h tupleobject.h
-cdmodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
- pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
- import.h intobject.h intrcheck.h listobject.h longobject.h \
- methodobject.h modsupport.h moduleobject.h mymalloc.h myproto.h \
- object.h objimpl.h pydebug.h pyerrors.h pyfpe.h pystate.h python.h \
- pythonrun.h rangeobject.h sliceobject.h stringobject.h sysmodule.h \
- traceback.h tupleobject.h
-
-cgensupport.obj: abstract.h ceval.h cgensupport.h classobject.h cobject.h \
- complexobject.h pyconfig.h dictobject.h fileobject.h floatobject.h \
- funcobject.h import.h intobject.h intrcheck.h listobject.h \
- longobject.h methodobject.h modsupport.h moduleobject.h mymalloc.h \
- myproto.h object.h objimpl.h pydebug.h pyerrors.h pyfpe.h \
- pystate.h python.h pythonrun.h rangeobject.h sliceobject.h \
- stringobject.h sysmodule.h traceback.h tupleobject.h
-
-clmodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
- pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
- import.h intobject.h intrcheck.h listobject.h longobject.h \
- methodobject.h modsupport.h moduleobject.h mymalloc.h myproto.h \
- object.h objimpl.h pydebug.h pyerrors.h pyfpe.h pystate.h python.h \
- pythonrun.h rangeobject.h sliceobject.h stringobject.h sysmodule.h \
- traceback.h tupleobject.h
-
cmathmodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
import.h intobject.h intrcheck.h listobject.h longobject.h \
@@ -502,22 +455,6 @@ fcntlmodule.obj: abstract.h c:\mptn\include\sys\ioctl.h ceval.h \
pyerrors.h pyfpe.h pystate.h python.h pythonrun.h rangeobject.h \
sliceobject.h stringobject.h sysmodule.h traceback.h tupleobject.h
-flmodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
- pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
- import.h intobject.h intrcheck.h listobject.h longobject.h \
- methodobject.h modsupport.h moduleobject.h mymalloc.h myproto.h \
- object.h objimpl.h pydebug.h pyerrors.h pyfpe.h pystate.h python.h \
- pythonrun.h rangeobject.h sliceobject.h stringobject.h \
- structmember.h sysmodule.h traceback.h tupleobject.h
-
-fmmodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
- pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
- import.h intobject.h intrcheck.h listobject.h longobject.h \
- methodobject.h modsupport.h moduleobject.h mymalloc.h myproto.h \
- object.h objimpl.h pydebug.h pyerrors.h pyfpe.h pystate.h python.h \
- pythonrun.h rangeobject.h sliceobject.h stringobject.h sysmodule.h \
- traceback.h tupleobject.h
-
fpectlmodule.obj: abstract.h ceval.h classobject.h cobject.h \
complexobject.h pyconfig.h dictobject.h fileobject.h floatobject.h \
funcobject.h import.h intobject.h intrcheck.h listobject.h \
@@ -552,14 +489,6 @@ getpath.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
python.h pythonrun.h rangeobject.h sliceobject.h stringobject.h \
sysmodule.h traceback.h tupleobject.h
-glmodule.obj: abstract.h ceval.h cgensupport.h classobject.h cobject.h \
- complexobject.h pyconfig.h dictobject.h fileobject.h floatobject.h \
- funcobject.h import.h intobject.h intrcheck.h listobject.h \
- longobject.h methodobject.h modsupport.h moduleobject.h mymalloc.h \
- myproto.h object.h objimpl.h pydebug.h pyerrors.h pyfpe.h \
- pystate.h python.h pythonrun.h rangeobject.h sliceobject.h \
- stringobject.h sysmodule.h traceback.h tupleobject.h
-
grpmodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
grp.h import.h intobject.h intrcheck.h listobject.h longobject.h \
@@ -576,14 +505,6 @@ imageop.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
pythonrun.h rangeobject.h sliceobject.h stringobject.h sysmodule.h \
traceback.h tupleobject.h
-imgfile.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
- pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
- import.h intobject.h intrcheck.h listobject.h longobject.h \
- methodobject.h modsupport.h moduleobject.h mymalloc.h myproto.h \
- object.h objimpl.h pydebug.h pyerrors.h pyfpe.h pystate.h python.h \
- pythonrun.h rangeobject.h sliceobject.h stringobject.h sysmodule.h \
- traceback.h tupleobject.h
-
main.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
import.h intobject.h intrcheck.h listobject.h longobject.h \
@@ -600,16 +521,6 @@ mathmodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
pystate.h python.h pythonrun.h rangeobject.h sliceobject.h \
stringobject.h sysmodule.h traceback.h tupleobject.h
-md5c.obj: pyconfig.h md5.h
-
-md5module.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
- pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
- import.h intobject.h intrcheck.h listobject.h longobject.h md5.h \
- methodobject.h modsupport.h moduleobject.h mymalloc.h myproto.h \
- object.h objimpl.h pydebug.h pyerrors.h pyfpe.h pystate.h python.h \
- pythonrun.h rangeobject.h sliceobject.h stringobject.h sysmodule.h \
- traceback.h tupleobject.h
-
mpzmodule.obj: abstract.h ceval.h classobject.h cobject.h \
complexobject.h pyconfig.h dictobject.h fileobject.h floatobject.h \
funcobject.h import.h intobject.h intrcheck.h listobject.h \
@@ -643,14 +554,6 @@ parsermodule.obj: abstract.h ceval.h classobject.h cobject.h compile.h \
rangeobject.h sliceobject.h stringobject.h sysmodule.h token.h \
traceback.h tupleobject.h
-pcremodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
- pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
- import.h intobject.h intrcheck.h listobject.h longobject.h \
- methodobject.h modsupport.h moduleobject.h mymalloc.h myproto.h \
- object.h objimpl.h pcre-internal.h pcre.h pydebug.h pyerrors.h \
- pyfpe.h pystate.h python.h pythonrun.h rangeobject.h sliceobject.h \
- stringobject.h sysmodule.h traceback.h tupleobject.h
-
posix.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
import.h intobject.h intrcheck.h listobject.h longobject.h \
@@ -667,14 +570,6 @@ posixmodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
python.h pythonrun.h rangeobject.h sliceobject.h stringobject.h \
sysmodule.h traceback.h tupleobject.h
-puremodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
- pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
- import.h intobject.h intrcheck.h listobject.h longobject.h \
- methodobject.h modsupport.h moduleobject.h mymalloc.h myproto.h \
- object.h objimpl.h pydebug.h pyerrors.h pyfpe.h pystate.h python.h \
- pythonrun.h rangeobject.h sliceobject.h stringobject.h sysmodule.h \
- traceback.h tupleobject.h
-
pwdmodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
import.h intobject.h intrcheck.h listobject.h longobject.h \
@@ -683,14 +578,6 @@ pwdmodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
python.h pythonrun.h rangeobject.h sliceobject.h stringobject.h \
sysmodule.h traceback.h tupleobject.h
-pypcre.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
- pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
- graminit.h import.h intobject.h intrcheck.h listobject.h \
- longobject.h methodobject.h modsupport.h moduleobject.h mymalloc.h \
- myproto.h object.h objimpl.h pcre-internal.h pcre.h pydebug.h \
- pyerrors.h pyfpe.h pystate.h python.h pythonrun.h rangeobject.h \
- sliceobject.h stringobject.h sysmodule.h traceback.h tupleobject.h
-
readline.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
import.h intobject.h intrcheck.h listobject.h longobject.h \
@@ -707,22 +594,6 @@ resource.obj: abstract.h c:\mptn\include\sys\time.h ceval.h classobject.h \
pyerrors.h pyfpe.h pystate.h python.h pythonrun.h rangeobject.h \
sliceobject.h stringobject.h sysmodule.h traceback.h tupleobject.h
-rgbimgmodule.obj: abstract.h ceval.h classobject.h cobject.h \
- complexobject.h pyconfig.h dictobject.h fileobject.h floatobject.h \
- funcobject.h import.h intobject.h intrcheck.h listobject.h \
- longobject.h methodobject.h modsupport.h moduleobject.h mymalloc.h \
- myproto.h object.h objimpl.h pydebug.h pyerrors.h pyfpe.h \
- pystate.h python.h pythonrun.h rangeobject.h sliceobject.h \
- stringobject.h sysmodule.h traceback.h tupleobject.h
-
-rotormodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
- pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
- import.h intobject.h intrcheck.h listobject.h longobject.h \
- methodobject.h modsupport.h moduleobject.h mymalloc.h mymath.h \
- myproto.h object.h objimpl.h pydebug.h pyerrors.h pyfpe.h \
- pystate.h python.h pythonrun.h rangeobject.h sliceobject.h \
- stringobject.h sysmodule.h traceback.h tupleobject.h
-
selectmodule.obj: abstract.h ceval.h classobject.h cobject.h \
complexobject.h pyconfig.h dictobject.h fileobject.h floatobject.h \
funcobject.h import.h intobject.h intrcheck.h listobject.h \
@@ -731,14 +602,6 @@ selectmodule.obj: abstract.h ceval.h classobject.h cobject.h \
pyerrors.h pyfpe.h pystate.h python.h pythonrun.h rangeobject.h \
sliceobject.h stringobject.h sysmodule.h traceback.h tupleobject.h
-sgimodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
- pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
- import.h intobject.h intrcheck.h listobject.h longobject.h \
- methodobject.h modsupport.h moduleobject.h mymalloc.h myproto.h \
- object.h objimpl.h pydebug.h pyerrors.h pyfpe.h pystate.h python.h \
- pythonrun.h rangeobject.h sliceobject.h stringobject.h sysmodule.h \
- traceback.h tupleobject.h
-
signalmodule.obj: abstract.h ceval.h classobject.h cobject.h \
complexobject.h pyconfig.h dictobject.h fileobject.h floatobject.h \
funcobject.h import.h intobject.h intrcheck.h listobject.h \
@@ -756,22 +619,6 @@ socketmodule.obj: abstract.h c:\mptn\include\netinet\in.h \
pyfpe.h pystate.h python.h pythonrun.h rangeobject.h sliceobject.h \
stringobject.h sysmodule.h traceback.h tupleobject.h
-soundex.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
- pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
- import.h intobject.h intrcheck.h listobject.h longobject.h \
- methodobject.h modsupport.h moduleobject.h mymalloc.h myproto.h \
- object.h objimpl.h pydebug.h pyerrors.h pyfpe.h pystate.h python.h \
- pythonrun.h rangeobject.h sliceobject.h stringobject.h sysmodule.h \
- traceback.h tupleobject.h
-
-stdwinmodule.obj: abstract.h ceval.h classobject.h cobject.h \
- complexobject.h pyconfig.h dictobject.h fileobject.h floatobject.h \
- funcobject.h import.h intobject.h intrcheck.h listobject.h \
- longobject.h methodobject.h modsupport.h moduleobject.h mymalloc.h \
- myproto.h object.h objimpl.h pydebug.h pyerrors.h pyfpe.h \
- pystate.h python.h pythonrun.h rangeobject.h sliceobject.h \
- stringobject.h sysmodule.h traceback.h tupleobject.h
-
structmodule.obj: abstract.h ceval.h classobject.h cobject.h \
complexobject.h pyconfig.h dictobject.h fileobject.h floatobject.h \
funcobject.h import.h intobject.h intrcheck.h listobject.h \
@@ -789,15 +636,6 @@ sunaudiodev.obj: abstract.h c:\mptn\include\sys\ioctl.h ceval.h \
sliceobject.h stringobject.h structmember.h sysmodule.h \
traceback.h tupleobject.h
-svmodule.obj: abstract.h c:\mptn\include\sys\time.h ceval.h classobject.h \
- cobject.h compile.h complexobject.h pyconfig.h dictobject.h \
- fileobject.h floatobject.h funcobject.h import.h intobject.h \
- intrcheck.h listobject.h longobject.h methodobject.h modsupport.h \
- moduleobject.h mymalloc.h myproto.h object.h objimpl.h pydebug.h \
- pyerrors.h pyfpe.h pystate.h python.h pythonrun.h rangeobject.h \
- sliceobject.h stringobject.h sysmodule.h traceback.h tupleobject.h \
- yuv.h
-
syslogmodule.obj: abstract.h ceval.h classobject.h cobject.h \
complexobject.h pyconfig.h dictobject.h fileobject.h floatobject.h \
funcobject.h import.h intobject.h intrcheck.h listobject.h \
@@ -830,14 +668,6 @@ timemodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
python.h pythonrun.h rangeobject.h sliceobject.h stringobject.h \
sysmodule.h traceback.h tupleobject.h
-timingmodule.obj: abstract.h ceval.h classobject.h cobject.h \
- complexobject.h pyconfig.h dictobject.h fileobject.h floatobject.h \
- funcobject.h import.h intobject.h intrcheck.h listobject.h \
- longobject.h methodobject.h modsupport.h moduleobject.h mymalloc.h \
- myproto.h object.h objimpl.h pydebug.h pyerrors.h pyfpe.h \
- pystate.h python.h pythonrun.h rangeobject.h sliceobject.h \
- stringobject.h sysmodule.h timing.h traceback.h tupleobject.h
-
xxmodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
import.h intobject.h intrcheck.h listobject.h longobject.h \
diff --git a/PC/pyconfig.h b/PC/pyconfig.h
index cecc5756634..11086e48083 100644
--- a/PC/pyconfig.h
+++ b/PC/pyconfig.h
@@ -488,22 +488,13 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */
/* Define if you want to use the GNU readline library */
/* #define WITH_READLINE 1 */
-/* Define as the integral type used for Unicode representation. */
-#define PY_UNICODE_TYPE unsigned short
-
/* Define as the size of the unicode type. */
-#define Py_UNICODE_SIZE SIZEOF_SHORT
-
-/* Define if you have a useable wchar_t type defined in wchar.h; useable
- means wchar_t must be 16-bit unsigned type. (see
- Include/unicodeobject.h). */
-#if Py_UNICODE_SIZE == 2
-#define HAVE_USABLE_WCHAR_T
+/* This is enough for unicodeobject.h to do the "right thing" on Windows. */
+#define Py_UNICODE_SIZE 2
/* Define to indicate that the Python Unicode representation can be passed
as-is to Win32 Wide API. */
#define Py_WIN_WIDE_FILENAMES
-#endif
/* Use Python's own small-block memory-allocator. */
#define WITH_PYMALLOC 1
diff --git a/PC/winsound.c b/PC/winsound.c
index 4e942304055..9ff3b7e8818 100644
--- a/PC/winsound.c
+++ b/PC/winsound.c
@@ -35,9 +35,9 @@
winsound.PlaySound(None, 0)
*/
+#include <Python.h>
#include <windows.h>
#include <mmsystem.h>
-#include <Python.h>
#ifdef HAVE_CONIO_H
#include <conio.h> /* port functions on Win9x */
#endif
diff --git a/PCbuild/pythoncore.vcproj b/PCbuild/pythoncore.vcproj
index 96e1ee09a39..b63f61237ee 100644
--- a/PCbuild/pythoncore.vcproj
+++ b/PCbuild/pythoncore.vcproj
@@ -626,12 +626,6 @@
RelativePath="..\Modules\mathmodule.c">
</File>
<File
- RelativePath="..\Modules\md5.c">
- </File>
- <File
- RelativePath="..\Modules\md5module.c">
- </File>
- <File
RelativePath="..\Parser\metagrammar.c">
</File>
<File
@@ -725,9 +719,6 @@
RelativePath="..\Modules\sha512module.c">
</File>
<File
- RelativePath="..\Modules\shamodule.c">
- </File>
- <File
RelativePath="..\Modules\signalmodule.c">
</File>
<File
diff --git a/PCbuild8/pythoncore/pythoncore.vcproj b/PCbuild8/pythoncore/pythoncore.vcproj
index 44f3092c259..f527b42a50e 100644
--- a/PCbuild8/pythoncore/pythoncore.vcproj
+++ b/PCbuild8/pythoncore/pythoncore.vcproj
@@ -1518,10 +1518,6 @@
>
</File>
<File
- RelativePath="..\..\Modules\rgbimgmodule.c"
- >
- </File>
- <File
RelativePath="..\..\Modules\rotatingtree.c"
>
</File>
diff --git a/Python/ast.c b/Python/ast.c
index 65527ba271b..e0bd18e7313 100644
--- a/Python/ast.c
+++ b/Python/ast.c
@@ -324,6 +324,29 @@ get_operator(const node *n)
}
}
+static const char* FORBIDDEN[] = {
+ "None",
+ "True",
+ "False",
+ NULL,
+};
+
+static int
+forbidden_name(expr_ty e, const node *n)
+{
+ const char *id;
+ const char **p;
+ assert(PyString_Check(e->v.Name.id));
+ id = PyString_AS_STRING(e->v.Name.id);
+ for (p = FORBIDDEN; *p; p++) {
+ if (strcmp(*p, id) == 0) {
+ ast_error(n, "assignment to keyword");
+ return 1;
+ }
+ }
+ return 0;
+}
+
/* Set the context ctx for expr_ty e, recursively traversing e.
Only sets context for expr kinds that "can appear in assignment context"
@@ -366,9 +389,9 @@ set_context(expr_ty e, expr_context_ty ctx, const node *n)
return 0;
break;
case Name_kind:
- if (ctx == Store &&
- !strcmp(PyString_AS_STRING(e->v.Name.id), "None")) {
- return ast_error(n, "assignment to None");
+ if (ctx == Store) {
+ if (forbidden_name(e, n))
+ return 0; /* forbidden_name() calls ast_error() */
}
e->v.Name.ctx = ctx;
break;
@@ -1227,6 +1250,7 @@ ast_for_atom(struct compiling *c, const node *n)
{
/* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
| '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
+ | '...' | 'None' | 'True' | 'False'
*/
node *ch = CHILD(n, 0);
int bytesmode = 0;
@@ -1894,7 +1918,9 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func)
} else if (e->kind != Name_kind) {
ast_error(CHILD(ch, 0), "keyword can't be an expression");
return NULL;
- }
+ } else if (forbidden_name(e, ch)) {
+ return NULL;
+ }
key = e->v.Name.id;
e = ast_for_expr(c, CHILD(ch, 2));
if (!e)
@@ -1981,11 +2007,8 @@ ast_for_expr_stmt(struct compiling *c, const node *n)
"expression not possible");
return NULL;
case Name_kind: {
- const char *var_name = PyString_AS_STRING(expr1->v.Name.id);
- if (var_name[0] == 'N' && !strcmp(var_name, "None")) {
- ast_error(ch, "assignment to None");
+ if (forbidden_name(expr1, ch))
return NULL;
- }
break;
}
case Attribute_kind:
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 43bbea92b22..97b2c5e1e64 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -1698,17 +1698,6 @@ If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\
On Unix, GNU readline is used if enabled. The prompt string, if given,\n\
is printed without a trailing newline before reading.");
-static PyObject *
-builtin_reload(PyObject *self, PyObject *v)
-{
- return PyImport_ReloadModule(v);
-}
-
-PyDoc_STRVAR(reload_doc,
-"reload(module) -> module\n\
-\n\
-Reload the module. The module must have been successfully imported before.");
-
static PyObject *
builtin_repr(PyObject *self, PyObject *v)
@@ -2006,7 +1995,6 @@ static PyMethodDef builtin_methods[] = {
{"ord", builtin_ord, METH_O, ord_doc},
{"pow", builtin_pow, METH_VARARGS, pow_doc},
{"print", (PyCFunction)builtin_print, METH_VARARGS | METH_KEYWORDS, print_doc},
- {"reload", builtin_reload, METH_O, reload_doc},
{"repr", builtin_repr, METH_O, repr_doc},
{"round", (PyCFunction)builtin_round, METH_VARARGS | METH_KEYWORDS, round_doc},
{"setattr", builtin_setattr, METH_VARARGS, setattr_doc},
diff --git a/Python/ceval.c b/Python/ceval.c
index 37659f8f72a..710a0d1561d 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -2939,10 +2939,6 @@ set_exc_info(PyThreadState *tstate,
Py_XDECREF(tmp_type);
Py_XDECREF(tmp_value);
Py_XDECREF(tmp_tb);
- /* For b/w compatibility */
- PySys_SetObject("exc_type", type);
- PySys_SetObject("exc_value", value);
- PySys_SetObject("exc_traceback", tb);
}
static void
@@ -2973,11 +2969,6 @@ reset_exc_info(PyThreadState *tstate)
Py_XDECREF(tmp_value);
Py_XDECREF(tmp_tb);
- /* For b/w compatibility */
- PySys_SetObject("exc_type", frame->f_exc_type);
- PySys_SetObject("exc_value", frame->f_exc_value);
- PySys_SetObject("exc_traceback", frame->f_exc_traceback);
-
/* Clear the frame's exception info. */
tmp_type = frame->f_exc_type;
tmp_value = frame->f_exc_value;
diff --git a/Python/dynload_win.c b/Python/dynload_win.c
index 1c3b3ab0c8d..fc641b9ff9e 100644
--- a/Python/dynload_win.c
+++ b/Python/dynload_win.c
@@ -1,7 +1,6 @@
/* Support for dynamic loading of extension modules */
-#include <windows.h>
#ifdef HAVE_DIRECT_H
#include <direct.h>
#endif
@@ -9,6 +8,7 @@
#include "Python.h"
#include "importdl.h"
+#include <windows.h>
const struct filedescr _PyImport_DynLoadFiletab[] = {
#ifdef _DEBUG
diff --git a/Python/graminit.c b/Python/graminit.c
index ba2686fb9a3..c1c070b36e3 100644
--- a/Python/graminit.c
+++ b/Python/graminit.c
@@ -1285,7 +1285,7 @@ static state states_62[4] = {
{1, arcs_62_2},
{1, arcs_62_3},
};
-static arc arcs_63_0[7] = {
+static arc arcs_63_0[10] = {
{13, 1},
{146, 2},
{148, 3},
@@ -1293,6 +1293,9 @@ static arc arcs_63_0[7] = {
{151, 4},
{152, 5},
{77, 4},
+ {153, 4},
+ {154, 4},
+ {155, 4},
};
static arc arcs_63_1[3] = {
{46, 6},
@@ -1324,7 +1327,7 @@ static arc arcs_63_8[1] = {
{150, 4},
};
static state states_63[9] = {
- {7, arcs_63_0},
+ {10, arcs_63_0},
{3, arcs_63_1},
{2, arcs_63_2},
{2, arcs_63_3},
@@ -1338,7 +1341,7 @@ static arc arcs_64_0[1] = {
{24, 1},
};
static arc arcs_64_1[3] = {
- {153, 2},
+ {156, 2},
{30, 3},
{0, 1},
};
@@ -1370,7 +1373,7 @@ static arc arcs_65_1[2] = {
{15, 5},
};
static arc arcs_65_2[1] = {
- {154, 6},
+ {157, 6},
};
static arc arcs_65_3[1] = {
{21, 5},
@@ -1394,14 +1397,14 @@ static state states_65[7] = {
{1, arcs_65_6},
};
static arc arcs_66_0[1] = {
- {155, 1},
+ {158, 1},
};
static arc arcs_66_1[2] = {
{30, 2},
{0, 1},
};
static arc arcs_66_2[2] = {
- {155, 1},
+ {158, 1},
{0, 2},
};
static state states_66[3] = {
@@ -1419,11 +1422,11 @@ static arc arcs_67_1[2] = {
};
static arc arcs_67_2[3] = {
{24, 3},
- {156, 4},
+ {159, 4},
{0, 2},
};
static arc arcs_67_3[2] = {
- {156, 4},
+ {159, 4},
{0, 3},
};
static arc arcs_67_4[1] = {
@@ -1488,7 +1491,7 @@ static arc arcs_71_0[1] = {
};
static arc arcs_71_1[4] = {
{25, 2},
- {153, 3},
+ {156, 3},
{30, 4},
{0, 1},
};
@@ -1529,7 +1532,7 @@ static state states_71[9] = {
{1, arcs_71_8},
};
static arc arcs_72_0[1] = {
- {157, 1},
+ {160, 1},
};
static arc arcs_72_1[1] = {
{21, 2},
@@ -1565,7 +1568,7 @@ static state states_72[8] = {
{1, arcs_72_7},
};
static arc arcs_73_0[3] = {
- {158, 1},
+ {161, 1},
{31, 2},
{32, 3},
};
@@ -1580,7 +1583,7 @@ static arc arcs_73_3[1] = {
{24, 6},
};
static arc arcs_73_4[4] = {
- {158, 1},
+ {161, 1},
{31, 2},
{32, 3},
{0, 4},
@@ -1609,7 +1612,7 @@ static arc arcs_74_0[1] = {
{24, 1},
};
static arc arcs_74_1[3] = {
- {153, 2},
+ {156, 2},
{29, 3},
{0, 1},
};
@@ -1626,8 +1629,8 @@ static state states_74[4] = {
{1, arcs_74_3},
};
static arc arcs_75_0[2] = {
- {153, 1},
- {160, 1},
+ {156, 1},
+ {163, 1},
};
static arc arcs_75_1[1] = {
{0, 1},
@@ -1649,7 +1652,7 @@ static arc arcs_76_3[1] = {
{105, 4},
};
static arc arcs_76_4[2] = {
- {159, 5},
+ {162, 5},
{0, 4},
};
static arc arcs_76_5[1] = {
@@ -1670,7 +1673,7 @@ static arc arcs_77_1[1] = {
{107, 2},
};
static arc arcs_77_2[2] = {
- {159, 3},
+ {162, 3},
{0, 2},
};
static arc arcs_77_3[1] = {
@@ -1704,7 +1707,7 @@ static state states_79[2] = {
{1, arcs_79_1},
};
static arc arcs_80_0[1] = {
- {163, 1},
+ {166, 1},
};
static arc arcs_80_1[2] = {
{9, 2},
@@ -1720,11 +1723,11 @@ static state states_80[3] = {
};
static dfa dfas[81] = {
{256, "single_input", 0, 3, states_0,
- "\004\050\060\200\000\000\000\050\170\052\034\144\011\040\004\000\200\041\224\041\010"},
+ "\004\050\060\200\000\000\000\050\170\052\034\144\011\040\004\000\200\041\224\017\101"},
{257, "file_input", 0, 2, states_1,
- "\204\050\060\200\000\000\000\050\170\052\034\144\011\040\004\000\200\041\224\041\010"},
+ "\204\050\060\200\000\000\000\050\170\052\034\144\011\040\004\000\200\041\224\017\101"},
{258, "eval_input", 0, 3, states_2,
- "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\001\000"},
+ "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\017\000"},
{259, "decorator", 0, 7, states_3,
"\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{260, "decorators", 0, 2, states_4,
@@ -1744,13 +1747,13 @@ static dfa dfas[81] = {
{267, "vfpdef", 0, 2, states_11,
"\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{268, "stmt", 0, 2, states_12,
- "\000\050\060\200\000\000\000\050\170\052\034\144\011\040\004\000\200\041\224\041\010"},
+ "\000\050\060\200\000\000\000\050\170\052\034\144\011\040\004\000\200\041\224\017\101"},
{269, "simple_stmt", 0, 4, states_13,
- "\000\040\040\200\000\000\000\050\170\052\034\000\000\040\004\000\200\041\224\001\010"},
+ "\000\040\040\200\000\000\000\050\170\052\034\000\000\040\004\000\200\041\224\017\100"},
{270, "small_stmt", 0, 2, states_14,
- "\000\040\040\200\000\000\000\050\170\052\034\000\000\040\004\000\200\041\224\001\010"},
+ "\000\040\040\200\000\000\000\050\170\052\034\000\000\040\004\000\200\041\224\017\100"},
{271, "expr_stmt", 0, 6, states_15,
- "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\001\000"},
+ "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\017\000"},
{272, "augassign", 0, 2, states_16,
"\000\000\000\000\000\200\377\007\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{273, "del_stmt", 0, 3, states_17,
@@ -1758,7 +1761,7 @@ static dfa dfas[81] = {
{274, "pass_stmt", 0, 2, states_18,
"\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{275, "flow_stmt", 0, 2, states_19,
- "\000\000\000\000\000\000\000\000\170\000\000\000\000\000\000\000\000\000\000\000\010"},
+ "\000\000\000\000\000\000\000\000\170\000\000\000\000\000\000\000\000\000\000\000\100"},
{276, "break_stmt", 0, 2, states_20,
"\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000"},
{277, "continue_stmt", 0, 2, states_21,
@@ -1766,7 +1769,7 @@ static dfa dfas[81] = {
{278, "return_stmt", 0, 3, states_22,
"\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000"},
{279, "yield_stmt", 0, 2, states_23,
- "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\010"},
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\100"},
{280, "raise_stmt", 0, 7, states_24,
"\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000"},
{281, "import_stmt", 0, 2, states_25,
@@ -1792,7 +1795,7 @@ static dfa dfas[81] = {
{291, "assert_stmt", 0, 5, states_35,
"\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000"},
{292, "compound_stmt", 0, 2, states_36,
- "\000\010\020\000\000\000\000\000\000\000\000\144\011\000\000\000\000\000\000\040\000"},
+ "\000\010\020\000\000\000\000\000\000\000\000\144\011\000\000\000\000\000\000\000\001"},
{293, "if_stmt", 0, 8, states_37,
"\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000"},
{294, "while_stmt", 0, 8, states_38,
@@ -1808,67 +1811,67 @@ static dfa dfas[81] = {
{299, "except_clause", 0, 5, states_43,
"\000\000\000\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000"},
{300, "suite", 0, 5, states_44,
- "\004\040\040\200\000\000\000\050\170\052\034\000\000\040\004\000\200\041\224\001\010"},
+ "\004\040\040\200\000\000\000\050\170\052\034\000\000\040\004\000\200\041\224\017\100"},
{301, "test", 0, 6, states_45,
- "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\001\000"},
+ "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\017\000"},
{302, "test_nocond", 0, 2, states_46,
- "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\001\000"},
+ "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\017\000"},
{303, "lambdef", 0, 5, states_47,
"\000\000\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000"},
{304, "lambdef_nocond", 0, 5, states_48,
"\000\000\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000"},
{305, "or_test", 0, 2, states_49,
- "\000\040\040\200\000\000\000\000\000\040\000\000\000\000\004\000\200\041\224\001\000"},
+ "\000\040\040\200\000\000\000\000\000\040\000\000\000\000\004\000\200\041\224\017\000"},
{306, "and_test", 0, 2, states_50,
- "\000\040\040\200\000\000\000\000\000\040\000\000\000\000\004\000\200\041\224\001\000"},
+ "\000\040\040\200\000\000\000\000\000\040\000\000\000\000\004\000\200\041\224\017\000"},
{307, "not_test", 0, 3, states_51,
- "\000\040\040\200\000\000\000\000\000\040\000\000\000\000\004\000\200\041\224\001\000"},
+ "\000\040\040\200\000\000\000\000\000\040\000\000\000\000\004\000\200\041\224\017\000"},
{308, "comparison", 0, 2, states_52,
- "\000\040\040\200\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\001\000"},
+ "\000\040\040\200\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\017\000"},
{309, "comp_op", 0, 4, states_53,
"\000\000\000\000\000\000\000\000\000\000\000\200\000\000\304\037\000\000\000\000\000"},
{310, "star_expr", 0, 3, states_54,
- "\000\040\040\200\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\001\000"},
+ "\000\040\040\200\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\017\000"},
{311, "expr", 0, 2, states_55,
- "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\001\000"},
+ "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\017\000"},
{312, "xor_expr", 0, 2, states_56,
- "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\001\000"},
+ "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\017\000"},
{313, "and_expr", 0, 2, states_57,
- "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\001\000"},
+ "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\017\000"},
{314, "shift_expr", 0, 2, states_58,
- "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\001\000"},
+ "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\017\000"},
{315, "arith_expr", 0, 2, states_59,
- "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\001\000"},
+ "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\017\000"},
{316, "term", 0, 2, states_60,
- "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\001\000"},
+ "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\017\000"},
{317, "factor", 0, 3, states_61,
- "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\001\000"},
+ "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\017\000"},
{318, "power", 0, 4, states_62,
- "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\224\001\000"},
+ "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\224\017\000"},
{319, "atom", 0, 9, states_63,
- "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\224\001\000"},
+ "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\224\017\000"},
{320, "testlist_comp", 0, 5, states_64,
- "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\001\000"},
+ "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\017\000"},
{321, "trailer", 0, 7, states_65,
"\000\040\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\004\000\000"},
{322, "subscriptlist", 0, 3, states_66,
- "\000\040\040\202\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\001\000"},
+ "\000\040\040\202\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\017\000"},
{323, "subscript", 0, 5, states_67,
- "\000\040\040\202\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\001\000"},
+ "\000\040\040\202\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\017\000"},
{324, "sliceop", 0, 3, states_68,
"\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{325, "exprlist", 0, 3, states_69,
- "\000\040\040\200\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\001\000"},
+ "\000\040\040\200\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\017\000"},
{326, "testlist", 0, 3, states_70,
- "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\001\000"},
+ "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\017\000"},
{327, "dictorsetmaker", 0, 9, states_71,
- "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\001\000"},
+ "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\017\000"},
{328, "classdef", 0, 8, states_72,
- "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\040\000"},
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001"},
{329, "arglist", 0, 8, states_73,
- "\000\040\040\200\001\000\000\000\000\040\000\000\000\040\004\000\200\041\224\001\000"},
+ "\000\040\040\200\001\000\000\000\000\040\000\000\000\040\004\000\200\041\224\017\000"},
{330, "argument", 0, 4, states_74,
- "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\001\000"},
+ "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\017\000"},
{331, "comp_iter", 0, 2, states_75,
"\000\000\000\000\000\000\000\000\000\000\000\104\000\000\000\000\000\000\000\000\000"},
{332, "comp_for", 0, 6, states_76,
@@ -1876,13 +1879,13 @@ static dfa dfas[81] = {
{333, "comp_if", 0, 4, states_77,
"\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000"},
{334, "testlist1", 0, 2, states_78,
- "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\001\000"},
+ "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\017\000"},
{335, "encoding_decl", 0, 2, states_79,
"\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{336, "yield_expr", 0, 3, states_80,
- "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\010"},
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\100"},
};
-static label labels[164] = {
+static label labels[167] = {
{0, "EMPTY"},
{256, 0},
{4, 0},
@@ -2036,6 +2039,9 @@ static label labels[164] = {
{27, 0},
{2, 0},
{3, 0},
+ {1, "None"},
+ {1, "True"},
+ {1, "False"},
{332, 0},
{322, 0},
{323, 0},
@@ -2051,6 +2057,6 @@ static label labels[164] = {
grammar _PyParser_Grammar = {
81,
dfas,
- {164, labels},
+ {167, labels},
256
};
diff --git a/Python/import.c b/Python/import.c
index e1a80f48d5e..75f1e015b01 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -371,7 +371,6 @@ PyImport_GetModuleDict(void)
/* List of names to clear in sys */
static char* sys_deletes[] = {
"path", "argv", "ps1", "ps2",
- "exc_type", "exc_value", "exc_traceback",
"last_type", "last_value", "last_traceback",
"path_hooks", "path_importer_cache", "meta_path",
NULL
@@ -2413,7 +2412,7 @@ PyImport_ReloadModule(PyObject *m)
if (modules_reloading == NULL) {
Py_FatalError("PyImport_ReloadModule: "
- "no modules_reloading dictionary!");
+ "no modules_reloading dictionary!");
return NULL;
}
@@ -2457,7 +2456,7 @@ PyImport_ReloadModule(PyObject *m)
"reload(): parent %.200s not in sys.modules",
PyString_AS_STRING(parentname));
Py_DECREF(parentname);
- imp_modules_reloading_clear();
+ imp_modules_reloading_clear();
return NULL;
}
Py_DECREF(parentname);
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index a8bb918f5ab..442e66a8f54 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -163,33 +163,6 @@ clause in the current stack frame or in an older stack frame."
);
static PyObject *
-sys_exc_clear(PyObject *self, PyObject *noargs)
-{
- PyThreadState *tstate = PyThreadState_GET();
- PyObject *tmp_type, *tmp_value, *tmp_tb;
- tmp_type = tstate->exc_type;
- tmp_value = tstate->exc_value;
- tmp_tb = tstate->exc_traceback;
- tstate->exc_type = NULL;
- tstate->exc_value = NULL;
- tstate->exc_traceback = NULL;
- Py_XDECREF(tmp_type);
- Py_XDECREF(tmp_value);
- Py_XDECREF(tmp_tb);
- Py_INCREF(Py_None);
- return Py_None;
-}
-
-PyDoc_STRVAR(exc_clear_doc,
-"exc_clear() -> None\n\
-\n\
-Clear global information on the current exception. Subsequent calls to\n\
-exc_info() will return (None,None,None) until another exception is raised\n\
-in the current thread or the execution stack returns to a frame where\n\
-another exception is being handled."
-);
-
-static PyObject *
sys_exit(PyObject *self, PyObject *args)
{
PyObject *exit_code = 0;
@@ -765,7 +738,6 @@ static PyMethodDef sys_methods[] = {
current_frames_doc},
{"displayhook", sys_displayhook, METH_O, displayhook_doc},
{"exc_info", sys_exc_info, METH_NOARGS, exc_info_doc},
- {"exc_clear", sys_exc_clear, METH_NOARGS, exc_clear_doc},
{"excepthook", sys_excepthook, METH_VARARGS, excepthook_doc},
{"exit", sys_exit, METH_VARARGS, exit_doc},
{"getdefaultencoding", (PyCFunction)sys_getdefaultencoding,
@@ -907,12 +879,6 @@ last_value -- value of last uncaught exception\n\
last_traceback -- traceback of last uncaught exception\n\
These three are only available in an interactive session after a\n\
traceback has been printed.\n\
-\n\
-exc_type -- type of exception currently being handled\n\
-exc_value -- value of exception currently being handled\n\
-exc_traceback -- traceback of exception currently being handled\n\
- The function exc_info() should be used instead of these three,\n\
- because it is thread-safe.\n\
"
)
/* concatenating string here */
@@ -953,7 +919,6 @@ Functions:\n\
displayhook() -- print an object to the screen, and save it in __builtin__._\n\
excepthook() -- print an exception and its traceback to sys.stderr\n\
exc_info() -- return thread-safe information about the current exception\n\
-exc_clear() -- clear the exception state for the current thread\n\
exit() -- exit the interpreter by raising SystemExit\n\
getdlopenflags() -- returns flags to be used for dlopen() calls\n\
getrefcount() -- return the reference count for an object (plus one :-)\n\
diff --git a/README b/README
index 53ea8c435ea..790ff9880c4 100644
--- a/README
+++ b/README
@@ -463,10 +463,10 @@ QNX: Chris Herborth (chrish@qnx.com) writes:
array, audioop, binascii, cPickle, cStringIO, cmath,
crypt, curses, errno, fcntl, gdbm, grp,
- _locale, math, md5, new, operator, parser, pcre,
- posix, pwd, readline, regex, reop,
- select, signal, socket, soundex, struct,
- syslog, termios, time, timing, zlib, audioop
+ _locale, math, new, operator, parser,
+ posix, pwd, readline, regex,
+ select, signal, socket, struct,
+ syslog, termios, time, zlib, audioop
3) make SHELL=/usr/local/bin/bash
@@ -520,9 +520,8 @@ Cray T3E: Mark Hadfield (m.hadfield@niwa.co.nz) writes:
_codecs, _locale, _socket, _symtable, _testcapi, _weakref
array, binascii, cmath, cPickle, crypt, cStringIO, dbm
- errno, fcntl, grp, math, md5, operator, parser, pwd
- rotor, select, struct, syslog, termios,
- time, timing
+ errno, fcntl, grp, math, operator, parser, pwd
+ rotor, select, struct, syslog, termios, time
4) Once the python executable and library have been built, make
will execute setup.py, which will attempt to build remaining
diff --git a/setup.py b/setup.py
index 4401420995f..e8d4b894645 100644
--- a/setup.py
+++ b/setup.py
@@ -477,11 +477,6 @@ class PyBuildExt(build_ext):
else:
missing.append('syslog')
- # George Neville-Neil's timing module:
- # Deprecated in PEP 4 http://www.python.org/peps/pep-0004.html
- # http://mail.python.org/pipermail/python-dev/2006-January/060023.html
- #exts.append( Extension('timing', ['timingmodule.c']) )
-
#
# Here ends the simple stuff. From here on, modules need certain
# libraries, are platform-specific, or present other surprises.
@@ -612,16 +607,7 @@ class PyBuildExt(build_ext):
include_dirs = ssl_incs,
library_dirs = ssl_libs,
libraries = ['ssl', 'crypto']) )
- missing.extend(['_sha', '_md5'])
else:
- # The _sha module implements the SHA1 hash algorithm.
- exts.append( Extension('_sha', ['shamodule.c']) )
- # The _md5 module implements the RSA Data Security, Inc. MD5
- # Message-Digest Algorithm, described in RFC 1321. The
- # necessary files md5.c and md5.h are included here.
- exts.append( Extension('_md5',
- sources = ['md5module.c', 'md5.c'],
- depends = ['md5.h']) )
missing.append('_hashlib')
if (openssl_ver < 0x00908000):