Merged revisions 60481,60485,60489-60520,60523-60527,60530-60533,60535-60538,60540-60551 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

NOTE: I blocked the following revisions:
      svnmerge.py block -r 60521,60522,60528,60529,60534,60539
      The new tests must be merged with lots of manual work.

........
  r60493 | georg.brandl | 2008-02-01 12:59:08 +0100 (Fri, 01 Feb 2008) | 2 lines

  Update IPv6 RFC number.
........
  r60497 | georg.brandl | 2008-02-01 16:50:15 +0100 (Fri, 01 Feb 2008) | 2 lines

  Add link checker builder, written for GHOP by Thomas Lamb.
........
  r60500 | georg.brandl | 2008-02-01 19:08:09 +0100 (Fri, 01 Feb 2008) | 2 lines

  Rename batch file.
........
  r60504 | christian.heimes | 2008-02-01 19:49:26 +0100 (Fri, 01 Feb 2008) | 1 line

  More int -> pid_t.
........
  r60507 | georg.brandl | 2008-02-01 20:24:01 +0100 (Fri, 01 Feb 2008) | 2 lines

  Wording nit.
........
  r60510 | georg.brandl | 2008-02-01 21:45:33 +0100 (Fri, 01 Feb 2008) | 2 lines

  Update for latest sphinx latex writer.
........
  r60511 | raymond.hettinger | 2008-02-01 22:30:23 +0100 (Fri, 01 Feb 2008) | 1 line

  Issue #1996: float.as_integer_ratio() should return fraction in lowest terms.
........
  r60512 | raymond.hettinger | 2008-02-01 23:15:52 +0100 (Fri, 01 Feb 2008) | 1 line

  Integer ratio should return ints instead of longs whereever possible.
........
  r60513 | raymond.hettinger | 2008-02-01 23:22:50 +0100 (Fri, 01 Feb 2008) | 1 line

  labs() takes a long for an input.
........
  r60514 | raymond.hettinger | 2008-02-01 23:42:59 +0100 (Fri, 01 Feb 2008) | 1 line

  Test round-trip on float.as_integer_ratio() and float.__truediv__().
........
  r60515 | marc-andre.lemburg | 2008-02-01 23:58:17 +0100 (Fri, 01 Feb 2008) | 3 lines

  Bump distutils version number to match Python version.
........
  r60516 | raymond.hettinger | 2008-02-02 00:12:19 +0100 (Sat, 02 Feb 2008) | 1 line

  Fix int/long typecase.  Add check for non-binary floating point.
........
  r60517 | raymond.hettinger | 2008-02-02 00:45:44 +0100 (Sat, 02 Feb 2008) | 1 line

  Add protection from weirdness while scaling the mantissa to an integer.
........
  r60518 | raymond.hettinger | 2008-02-02 06:11:40 +0100 (Sat, 02 Feb 2008) | 1 line

  Simpler solution to handling non-IEEE 754 environments.
........
  r60519 | raymond.hettinger | 2008-02-02 06:24:44 +0100 (Sat, 02 Feb 2008) | 1 line

  Neaten-up a bit.
........
  r60520 | georg.brandl | 2008-02-02 10:56:20 +0100 (Sat, 02 Feb 2008) | 2 lines

  Amendments to the urllib2 docs, written for GHOP by Thomas Lamb.
........
  r60525 | georg.brandl | 2008-02-02 11:49:58 +0100 (Sat, 02 Feb 2008) | 3 lines

  Add email example how to send a multipart message.
  Written for GHOP by Martin Matejek.
........
  r60526 | georg.brandl | 2008-02-02 12:05:00 +0100 (Sat, 02 Feb 2008) | 2 lines

  Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
........
  r60527 | georg.brandl | 2008-02-02 12:05:34 +0100 (Sat, 02 Feb 2008) | 2 lines

  Add GHOP contributor.
........
  r60530 | mark.dickinson | 2008-02-02 18:16:13 +0100 (Sat, 02 Feb 2008) | 2 lines

  Make the Rational constructor accept '3.' and '.2' as well as '3.2'.
........
  r60531 | neal.norwitz | 2008-02-02 19:52:51 +0100 (Sat, 02 Feb 2008) | 1 line

  Update the leaky tests (ie, ignore these tests if they report leaks).  This version has been running for a while.
........
  r60533 | skip.montanaro | 2008-02-02 20:11:57 +0100 (Sat, 02 Feb 2008) | 7 lines

  Split the refleak mail body into two parts, the first being those failing
  tests which are deemed more important issues, the second those which are
  known to have difficult to solve problems and are generally expected to
  leak.  Hopefully this doesn't break the script...
........
  r60535 | georg.brandl | 2008-02-03 01:04:50 +0100 (Sun, 03 Feb 2008) | 3 lines

  Wait for a delay before reaping children -- this should fix the
  test_socketserver failures on several platforms.
........
  r60536 | brett.cannon | 2008-02-03 03:07:55 +0100 (Sun, 03 Feb 2008) | 2 lines

  Fix a minor typo.
........
  r60537 | brett.cannon | 2008-02-03 03:08:45 +0100 (Sun, 03 Feb 2008) | 3 lines

  Directories from CPPFLAGS and LDFLAGS were being added in the reverse order for
  searches as to how they were listed in the environment variable.
........
  r60538 | brett.cannon | 2008-02-03 03:34:14 +0100 (Sun, 03 Feb 2008) | 2 lines

  Remove extra tick marks and add a missing closing parenthesis.
........
  r60540 | andrew.macintyre | 2008-02-03 07:58:06 +0100 (Sun, 03 Feb 2008) | 2 lines

  Update OS/2 EMX build bits for 2.6.
........
  r60541 | andrew.macintyre | 2008-02-03 08:01:11 +0100 (Sun, 03 Feb 2008) | 2 lines

  Rename module definition file to reflect v2.6.
........
  r60542 | andrew.macintyre | 2008-02-03 08:07:31 +0100 (Sun, 03 Feb 2008) | 6 lines

  The wrapper function is supposed to be for spawnvpe() so that's
  what we should call [this wrapper only available on OS/2].

  Backport candidate to 2.5.
........
  r60544 | gregory.p.smith | 2008-02-03 08:20:53 +0100 (Sun, 03 Feb 2008) | 6 lines

  Merge this fix from the pybsddb tree:
  r293 | jcea | 2008-01-31 01:08:19 -0800 (Thu, 31 Jan 2008) | 4 lines

  Solved memory leak when using cursors with
  databases without environment.
........
  r60546 | gregory.p.smith | 2008-02-03 09:01:46 +0100 (Sun, 03 Feb 2008) | 2 lines

  remove a repeated occurance of a hardcoded berkeleydb library version number
........
  r60549 | brett.cannon | 2008-02-03 10:59:21 +0100 (Sun, 03 Feb 2008) | 2 lines

  Add an entry for r60537.
........
  r60550 | georg.brandl | 2008-02-03 13:29:00 +0100 (Sun, 03 Feb 2008) | 2 lines

  #2003: fix sentence.
........
  r60551 | christian.heimes | 2008-02-03 15:34:18 +0100 (Sun, 03 Feb 2008) | 2 lines

  Fixed paths to Windows build directories in build_ext.py
  Use vsbuild instead of devenv in build.bat and _bsddb.vcproj
........
This commit is contained in:
Christian Heimes 2008-02-03 16:51:08 +00:00
parent ec17d204f9
commit 292d351fc1
31 changed files with 610 additions and 426 deletions

View File

@ -21,6 +21,7 @@ help:
@echo " htmlhelp to make HTML files and a HTML help project" @echo " htmlhelp to make HTML files and a HTML help project"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " changes to make an overview over all changed/added/deprecated items" @echo " changes to make an overview over all changed/added/deprecated items"
@echo " linkcheck to check all external links for integrity"
checkout: checkout:
@if [ ! -d tools/sphinx ]; then \ @if [ ! -d tools/sphinx ]; then \
@ -71,6 +72,11 @@ changes: BUILDER = changes
changes: build changes: build
@echo "The overview file is in build/changes." @echo "The overview file is in build/changes."
linkcheck: BUILDER = linkcheck
linkcheck: build
@echo "Link check complete; look for any errors in the above output "\
"or in build/$(BUILDER)/output.txt"
clean: clean:
-rm -rf build/* -rm -rf build/*
-rm -rf tools/sphinx -rm -rf tools/sphinx

View File

@ -56,6 +56,10 @@ Available make targets are:
* "latex", which builds LaTeX source files that can be run with "pdflatex" * "latex", which builds LaTeX source files that can be run with "pdflatex"
to produce PDF documents. to produce PDF documents.
* "linkcheck", which checks all external references to see whether they are
broken, redirected or malformed, and outputs this information to stdout
as well as a plain-text (.txt) file.
* "changes", which builds an overview over all versionadded/versionchanged/ * "changes", which builds an overview over all versionadded/versionchanged/
deprecated items in the current version. This is meant as a help for the deprecated items in the current version. This is meant as a help for the
writer of the "What's New" document. writer of the "What's New" document.

View File

@ -103,29 +103,29 @@ latex_font_size = '10pt'
# (source start file, target name, title, author, document class [howto/manual]). # (source start file, target name, title, author, document class [howto/manual]).
_stdauthor = r'Guido van Rossum\\Fred L. Drake, Jr., editor' _stdauthor = r'Guido van Rossum\\Fred L. Drake, Jr., editor'
latex_documents = [ latex_documents = [
('c-api/index.rst', 'c-api.tex', ('c-api/index', 'c-api.tex',
'The Python/C API', _stdauthor, 'manual'), 'The Python/C API', _stdauthor, 'manual'),
('distutils/index.rst', 'distutils.tex', ('distutils/index', 'distutils.tex',
'Distributing Python Modules', _stdauthor, 'manual'), 'Distributing Python Modules', _stdauthor, 'manual'),
('documenting/index.rst', 'documenting.tex', ('documenting/index', 'documenting.tex',
'Documenting Python', 'Georg Brandl', 'manual'), 'Documenting Python', 'Georg Brandl', 'manual'),
('extending/index.rst', 'extending.tex', ('extending/index', 'extending.tex',
'Extending and Embedding Python', _stdauthor, 'manual'), 'Extending and Embedding Python', _stdauthor, 'manual'),
('install/index.rst', 'install.tex', ('install/index', 'install.tex',
'Installing Python Modules', _stdauthor, 'manual'), 'Installing Python Modules', _stdauthor, 'manual'),
('library/index.rst', 'library.tex', ('library/index', 'library.tex',
'The Python Library Reference', _stdauthor, 'manual'), 'The Python Library Reference', _stdauthor, 'manual'),
('reference/index.rst', 'reference.tex', ('reference/index', 'reference.tex',
'The Python Language Reference', _stdauthor, 'manual'), 'The Python Language Reference', _stdauthor, 'manual'),
('tutorial/index.rst', 'tutorial.tex', ('tutorial/index', 'tutorial.tex',
'Python Tutorial', _stdauthor, 'manual'), 'Python Tutorial', _stdauthor, 'manual'),
('using/index.rst', 'using.tex', ('using/index', 'using.tex',
'Using Python', _stdauthor, 'manual'), 'Using Python', _stdauthor, 'manual'),
('whatsnew/' + version + '.rst', 'whatsnew.tex', ('whatsnew/' + version, 'whatsnew.tex',
'What\'s New in Python', 'A. M. Kuchling', 'howto'), 'What\'s New in Python', 'A. M. Kuchling', 'howto'),
] ]
# Collect all HOWTOs individually # Collect all HOWTOs individually
latex_documents.extend(('howto/' + fn, 'howto-' + fn[:-4] + '.tex', latex_documents.extend(('howto/' + fn[:-4], 'howto-' + fn[:-4] + '.tex',
'HOWTO', _stdauthor, 'howto') 'HOWTO', _stdauthor, 'howto')
for fn in os.listdir('howto') for fn in os.listdir('howto')
if fn.endswith('.rst') and fn != 'index.rst') if fn.endswith('.rst') and fn != 'index.rst')
@ -139,4 +139,4 @@ latex_preamble = r'''
''' '''
# Documents to append as an appendix to all manuals. # Documents to append as an appendix to all manuals.
latex_appendices = ['glossary.rst', 'about.rst', 'license.rst', 'copyright.rst'] latex_appendices = ['glossary', 'about', 'license', 'copyright']

View File

@ -0,0 +1,48 @@
#! /usr/bin/python
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
# me == my email address
# you == recipient's email address
me = "my@email.com"
you = "your@email.com"
# Create message container - the correct MIME type is multipart/alternative.
msg = MIMEMultipart('alternative')
msg['Subject'] = "Link"
msg['From'] = me
msg['To'] = you
# Create the body of the message (a plain-text and an HTML version).
text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.python.org"
html = """\
<html>
<head></head>
<body>
<p>Hi!<br>
How are you?<br>
Here is the <a href="http://www.python.org">link</a> you wanted.
</p>
</body>
</html>
"""
# Record the MIME types of both parts - text/plain and text/html.
part1 = MIMEText(text, 'plain')
part2 = MIMEText(html, 'html')
# Attach parts into message container.
# According to RFC 2046, the last part of a multipart message, in this case
# the HTML message, is best and preferred.
msg.attach(part1)
msg.attach(part2)
# Send the message via local SMTP server.
s = smtplib.SMTP('localhost')
# sendmail function takes 3 arguments: sender's address, recipient's address
# and message to send - here it is sent as one string.
s.sendmail(me, you, msg.as_string())
s.close()

View File

@ -21,13 +21,18 @@ message: [1]_
.. literalinclude:: ../includes/email-dir.py .. literalinclude:: ../includes/email-dir.py
And finally, here's an example of how to unpack a MIME message like the one Here's an example of how to unpack a MIME message like the one
above, into a directory of files: above, into a directory of files:
.. literalinclude:: ../includes/email-unpack.py .. literalinclude:: ../includes/email-unpack.py
Here's an example of how to create an HTML message with an alternative plain
text version: [2]_
.. literalinclude:: ../includes/email-alternative.py
.. rubric:: Footnotes .. rubric:: Footnotes
.. [1] Thanks to Matthew Dixon Cowles for the original inspiration and examples. .. [1] Thanks to Matthew Dixon Cowles for the original inspiration and examples.
.. [2] Contributed by Martin Matejek.

View File

@ -71,7 +71,7 @@ The :mod:`Queue` module defines the following classes and exceptions:
Queue Objects Queue Objects
------------- -------------
Queue objects (:class:``Queue``, :class:``LifoQueue``, or :class:``PriorityQueue`` Queue objects (:class:`Queue`, :class:`LifoQueue`, or :class:`PriorityQueue`)
provide the public methods described below. provide the public methods described below.

View File

@ -23,7 +23,7 @@ PS1:7 and PS1:8). The platform-specific reference material for the various
socket-related system calls are also a valuable source of information on the socket-related system calls are also a valuable source of information on the
details of socket semantics. For Unix, refer to the manual pages; for Windows, details of socket semantics. For Unix, refer to the manual pages; for Windows,
see the WinSock (or Winsock 2) specification. For IPv6-ready APIs, readers may see the WinSock (or Winsock 2) specification. For IPv6-ready APIs, readers may
want to refer to :rfc:`2553` titled Basic Socket Interface Extensions for IPv6. want to refer to :rfc:`3493` titled Basic Socket Interface Extensions for IPv6.
.. index:: object: socket .. index:: object: socket

View File

@ -33,10 +33,12 @@ The :mod:`urllib2` module defines the following functions:
This function returns a file-like object with two additional methods: This function returns a file-like object with two additional methods:
* :meth:`geturl` --- return the URL of the resource retrieved * :meth:`geturl` --- return the URL of the resource retrieved, commonly used to
determine if a redirect was followed
* :meth:`info` --- return the meta-information of the page, as a dictionary-like * :meth:`info` --- return the meta-information of the page, such as headers, in
object the form of an ``httplib.HTTPMessage`` instance
(see `Quick Reference to HTTP Headers <http://www.cs.tut.fi/~jkorpela/http.html>`_)
Raises :exc:`URLError` on errors. Raises :exc:`URLError` on errors.
@ -81,13 +83,27 @@ The following exceptions are raised as appropriate:
The handlers raise this exception (or derived exceptions) when they run into a The handlers raise this exception (or derived exceptions) when they run into a
problem. It is a subclass of :exc:`IOError`. problem. It is a subclass of :exc:`IOError`.
.. attribute:: reason
The reason for this error. It can be a message string or another exception
instance (:exc:`socket.error` for remote URLs, :exc:`OSError` for local
URLs).
.. exception:: HTTPError .. exception:: HTTPError
A subclass of :exc:`URLError`, it can also function as a non-exceptional Though being an exception (a subclass of :exc:`URLError`), an :exc:`HTTPError`
file-like return value (the same thing that :func:`urlopen` returns). This can also function as a non-exceptional file-like return value (the same thing
is useful when handling exotic HTTP errors, such as requests for that :func:`urlopen` returns). This is useful when handling exotic HTTP
authentication. errors, such as requests for authentication.
.. attribute:: code
An HTTP status code as defined in `RFC 2616 <http://www.faqs.org/rfcs/rfc2616.html>`_.
This numeric value corresponds to a value found in the dictionary of
codes as found in :attr:`BaseHTTPServer.BaseHTTPRequestHandler.responses`.
The following classes are provided: The following classes are provided:
@ -107,7 +123,12 @@ The following classes are provided:
returns a string in this format. returns a string in this format.
*headers* should be a dictionary, and will be treated as if :meth:`add_header` *headers* should be a dictionary, and will be treated as if :meth:`add_header`
was called with each key and value as arguments. was called with each key and value as arguments. This is often used to "spoof"
the ``User-Agent`` header, which is used by a browser to identify itself --
some HTTP servers only allow requests coming from common browsers as opposed
to scripts. For example, Mozilla Firefox may identify itself as ``"Mozilla/5.0
(X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11"``, while :mod:`urllib2`'s
default user agent string is ``"Python-urllib/2.6"`` (on Python 2.6).
The final two arguments are only of interest for correct handling of third-party The final two arguments are only of interest for correct handling of third-party
HTTP cookies: HTTP cookies:

View File

@ -991,7 +991,7 @@ that all old-style instances, independently of their class, are implemented with
a single built-in type, called ``instance``. a single built-in type, called ``instance``.
New-style classes were introduced in Python 2.2 to unify classes and types. A New-style classes were introduced in Python 2.2 to unify classes and types. A
new-style class neither more nor less than a user-defined type. If *x* is an new-style class is neither more nor less than a user-defined type. If *x* is an
instance of a new-style class, then ``type(x)`` is the same as ``x.__class__``. instance of a new-style class, then ``type(x)`` is the same as ``x.__class__``.
The major motivation for introducing new-style classes is to provide a unified The major motivation for introducing new-style classes is to provide a unified

View File

@ -18,4 +18,4 @@ __revision__ = "$Id$"
# In general, major and minor version should loosely follow the Python # In general, major and minor version should loosely follow the Python
# version number the distutils code was shipped with. # version number the distutils code was shipped with.
# #
__version__ = "2.5.1" __version__ = "2.6.0"

View File

@ -178,13 +178,13 @@ class build_ext(Command):
self.include_dirs.append(os.path.join(sys.exec_prefix, 'PC')) self.include_dirs.append(os.path.join(sys.exec_prefix, 'PC'))
if MSVC_VERSION == 9: if MSVC_VERSION == 9:
self.library_dirs.append(os.path.join(sys.exec_prefix, self.library_dirs.append(os.path.join(sys.exec_prefix,
'PCBuild9')) 'PCbuild'))
elif MSVC_VERSION == 8: elif MSVC_VERSION == 8:
self.library_dirs.append(os.path.join(sys.exec_prefix, self.library_dirs.append(os.path.join(sys.exec_prefix,
'PCBuild8', 'win32release')) 'PC', 'VS8.0', 'win32release'))
else: else:
self.library_dirs.append(os.path.join(sys.exec_prefix, self.library_dirs.append(os.path.join(sys.exec_prefix,
'PCBuild')) 'PC', 'VS7.1'))
# OS/2 (EMX) doesn't support Debug vs Release builds, but has the # OS/2 (EMX) doesn't support Debug vs Release builds, but has the
# import libraries in its "Config" subdirectory # import libraries in its "Config" subdirectory

View File

@ -24,9 +24,18 @@ def gcd(a, b):
return a return a
_RATIONAL_FORMAT = re.compile( _RATIONAL_FORMAT = re.compile(r"""
r'^\s*(?P<sign>[-+]?)(?P<num>\d+)' \A\s* # optional whitespace at the start, then
r'(?:/(?P<denom>\d+)|\.(?P<decimal>\d+))?\s*$') (?P<sign>[-+]?) # an optional sign, then
(?=\d|\.\d) # lookahead for digit or .digit
(?P<num>\d*) # numerator (possibly empty)
(?: # followed by an optional
/(?P<denom>\d+) # / and denominator
| # or
\.(?P<decimal>\d*) # decimal point and fractional part
)?
\s*\Z # and optional whitespace to finish
""", re.VERBOSE)
class Rational(RationalAbc): class Rational(RationalAbc):

View File

@ -593,6 +593,20 @@ class BuiltinTest(unittest.TestCase):
self.assertEqual(format(0, C('10')), ' 0') self.assertEqual(format(0, C('10')), ' 0')
def test_floatasratio(self): def test_floatasratio(self):
for f, ratio in [
(0.875, (7, 8)),
(-0.875, (-7, 8)),
(0.0, (0, 1)),
(11.5, (23, 2)),
]:
self.assertEqual(f.as_integer_ratio(), ratio)
for i in range(10000):
f = random.random()
f *= 10 ** random.randint(-100, 100)
n, d = f.as_integer_ratio()
self.assertEqual(float(n).__truediv__(d), f)
R = rational.Rational R = rational.Rational
self.assertEqual(R(0, 1), self.assertEqual(R(0, 1),
R(*float(0.0).as_integer_ratio())) R(*float(0.0).as_integer_ratio()))

View File

@ -77,6 +77,8 @@ class RationalTest(unittest.TestCase):
self.assertEquals((3, 2), _components(R(" 03/02 \n "))) self.assertEquals((3, 2), _components(R(" 03/02 \n ")))
self.assertEquals((16, 5), _components(R(" 3.2 "))) self.assertEquals((16, 5), _components(R(" 3.2 ")))
self.assertEquals((-16, 5), _components(R(" -3.2 "))) self.assertEquals((-16, 5), _components(R(" -3.2 ")))
self.assertEquals((-3, 1), _components(R(" -3. ")))
self.assertEquals((3, 5), _components(R(" .6 ")))
self.assertRaisesMessage( self.assertRaisesMessage(
ZeroDivisionError, "Rational(3, 0)", ZeroDivisionError, "Rational(3, 0)",
@ -111,6 +113,10 @@ class RationalTest(unittest.TestCase):
# Don't accept combinations of decimals and rationals. # Don't accept combinations of decimals and rationals.
ValueError, "Invalid literal for Rational: 3.2/7", ValueError, "Invalid literal for Rational: 3.2/7",
R, "3.2/7") R, "3.2/7")
self.assertRaisesMessage(
# Allow 3. and .3, but not .
ValueError, "Invalid literal for Rational: .",
R, ".")
def testImmutable(self): def testImmutable(self):
r = R(7, 3) r = R(7, 3)

View File

@ -1,20 +1,32 @@
# Test suite for SocketServer.py """
Test suite for SocketServer.py.
"""
from test import test_support import os
from test.test_support import (verbose, verify, TESTFN, TestSkipped,
reap_children)
test_support.requires('network')
from SocketServer import *
import socket import socket
import errno import errno
import imp
import select import select
import time import time
import threading import threading
import os from functools import wraps
import unittest
import SocketServer
import test.test_support
from test.test_support import reap_children, verbose, TestSkipped
from test.test_support import TESTFN as TEST_FILE
test.test_support.requires("network")
NREQ = 3 NREQ = 3
DELAY = 0.5 DELAY = 0.5
TEST_STR = b"hello world\n"
HOST = "localhost"
HAVE_UNIX_SOCKETS = hasattr(socket, "AF_UNIX")
HAVE_FORKING = hasattr(os, "fork") and os.name != "os2"
class MyMixinHandler: class MyMixinHandler:
def handle(self): def handle(self):
@ -23,23 +35,41 @@ class MyMixinHandler:
time.sleep(DELAY) time.sleep(DELAY)
self.wfile.write(line) self.wfile.write(line)
class MyStreamHandler(MyMixinHandler, StreamRequestHandler):
def receive(sock, n, timeout=20):
r, w, x = select.select([sock], [], [], timeout)
if sock in r:
return sock.recv(n)
else:
raise RuntimeError("timed out on %r" % (sock,))
class MyStreamHandler(MyMixinHandler, SocketServer.StreamRequestHandler):
pass pass
class MyDatagramHandler(MyMixinHandler, DatagramRequestHandler): class MyDatagramHandler(MyMixinHandler,
SocketServer.DatagramRequestHandler):
pass pass
class ForkingUnixStreamServer(SocketServer.ForkingMixIn,
SocketServer.UnixStreamServer):
pass
class ForkingUnixDatagramServer(SocketServer.ForkingMixIn,
SocketServer.UnixDatagramServer):
pass
class MyMixinServer: class MyMixinServer:
def serve_a_few(self): def serve_a_few(self):
for i in range(NREQ): for i in range(NREQ):
self.handle_request() self.handle_request()
def handle_error(self, request, client_address): def handle_error(self, request, client_address):
self.close_request(request) self.close_request(request)
self.server_close() self.server_close()
raise raise
teststring = b"hello world\n"
def receive(sock, n, timeout=20): def receive(sock, n, timeout=20):
r, w, x = select.select([sock], [], [], timeout) r, w, x = select.select([sock], [], [], timeout)
if sock in r: if sock in r:
@ -75,6 +105,7 @@ class ServerThread(threading.Thread):
self.__svrcls = svrcls self.__svrcls = svrcls
self.__hdlrcls = hdlrcls self.__hdlrcls = hdlrcls
self.ready = threading.Event() self.ready = threading.Event()
def run(self): def run(self):
class svrcls(MyMixinServer, self.__svrcls): class svrcls(MyMixinServer, self.__svrcls):
pass pass
@ -93,19 +124,52 @@ class ServerThread(threading.Thread):
svr.serve_a_few() svr.serve_a_few()
if verbose: print("thread: done") if verbose: print("thread: done")
seed = 0
def pickport():
global seed
seed += 1
return 10000 + (os.getpid() % 1000)*10 + seed
host = "localhost" class ForgivingTCPServer(SocketServer.TCPServer):
testfiles = [] # prevent errors if another process is using the port we want
def pickaddr(proto): def server_bind(self):
host, default_port = self.server_address
# this code shamelessly stolen from test.test_support
# the ports were changed to protect the innocent
import sys
for port in [default_port, 3434, 8798, 23833]:
try:
self.server_address = host, port
SocketServer.TCPServer.server_bind(self)
break
except socket.error as e:
(err, msg) = e
if err != errno.EADDRINUSE:
raise
print(' WARNING: failed to listen on port %d, trying another' % port, file=sys.__stderr__)
class SocketServerTest(unittest.TestCase):
"""Test all socket servers."""
def setUp(self):
self.port_seed = 0
self.test_files = []
def tearDown(self):
time.sleep(DELAY)
reap_children()
for fn in self.test_files:
try:
os.remove(fn)
except os.error:
pass
self.test_files[:] = []
def pickport(self):
self.port_seed += 1
return 10000 + (os.getpid() % 1000)*10 + self.port_seed
def pickaddr(self, proto):
if proto == socket.AF_INET: if proto == socket.AF_INET:
return (host, pickport()) return (HOST, self.pickport())
else: else:
fn = TESTFN + str(pickport()) fn = TEST_FILE + str(self.pickport())
if os.name == 'os2': if os.name == 'os2':
# AF_UNIX socket names on OS/2 require a specific prefix # AF_UNIX socket names on OS/2 require a specific prefix
# which can't include a drive letter and must also use # which can't include a drive letter and must also use
@ -119,105 +183,99 @@ def pickaddr(proto):
fn = fn.replace(os.sep, os.altsep) fn = fn.replace(os.sep, os.altsep)
else: else:
fn = fn.replace(os.altsep, os.sep) fn = fn.replace(os.altsep, os.sep)
testfiles.append(fn) self.test_files.append(fn)
return fn return fn
def cleanup(): def run_servers(self, proto, servers, hdlrcls, testfunc):
for fn in testfiles:
try:
os.remove(fn)
except os.error:
pass
testfiles[:] = []
def testloop(proto, servers, hdlrcls, testfunc):
for svrcls in servers: for svrcls in servers:
addr = pickaddr(proto) addr = self.pickaddr(proto)
if verbose: if verbose:
print("ADDR =", addr) print "ADDR =", addr
print("CLASS =", svrcls) print "CLASS =", svrcls
t = ServerThread(addr, svrcls, hdlrcls) t = ServerThread(addr, svrcls, hdlrcls)
if verbose: print("server created") if verbose: print "server created"
t.start() t.start()
if verbose: print("server running") if verbose: print "server running"
for i in range(NREQ): for i in range(NREQ):
t.ready.wait(10*DELAY) t.ready.wait(10*DELAY)
if not t.ready.isSet(): self.assert_(t.ready.isSet(),
raise RuntimeError("Server not ready within a reasonable time") "Server not ready within a reasonable time")
if verbose: print("test client", i) if verbose: print "test client", i
testfunc(proto, addr) testfunc(proto, addr)
if verbose: print("waiting for server") if verbose: print "waiting for server"
t.join() t.join()
if verbose: print("done") if verbose: print "done"
class ForgivingTCPServer(TCPServer): def stream_examine(self, proto, addr):
# prevent errors if another process is using the port we want s = socket.socket(proto, socket.SOCK_STREAM)
def server_bind(self): s.connect(addr)
host, default_port = self.server_address s.sendall(TEST_STR)
# this code shamelessly stolen from test.test_support buf = data = receive(s, 100)
# the ports were changed to protect the innocent while data and '\n' not in buf:
import sys data = receive(s, 100)
for port in [default_port, 3434, 8798, 23833]: buf += data
try: self.assertEquals(buf, TEST_STR)
self.server_address = host, port s.close()
TCPServer.server_bind(self)
break
except socket.error as e:
(err, msg) = e
if err != errno.EADDRINUSE:
raise
print(' WARNING: failed to listen on port %d, trying another' % port, file=sys.__stderr__)
tcpservers = [ForgivingTCPServer, ThreadingTCPServer] def dgram_examine(self, proto, addr):
if hasattr(os, 'fork') and os.name not in ('os2',): s = socket.socket(proto, socket.SOCK_DGRAM)
tcpservers.append(ForkingTCPServer) s.sendto(TEST_STR, addr)
udpservers = [UDPServer, ThreadingUDPServer] buf = data = receive(s, 100)
if hasattr(os, 'fork') and os.name not in ('os2',): while data and '\n' not in buf:
udpservers.append(ForkingUDPServer) data = receive(s, 100)
buf += data
self.assertEquals(buf, TEST_STR)
s.close()
if not hasattr(socket, 'AF_UNIX'): def test_TCPServers(self):
streamservers = [] # Test SocketServer.TCPServer
dgramservers = [] servers = [ForgivingTCPServer, SocketServer.ThreadingTCPServer]
else: if HAVE_FORKING:
class ForkingUnixStreamServer(ForkingMixIn, UnixStreamServer): pass servers.append(SocketServer.ForkingTCPServer)
streamservers = [UnixStreamServer, ThreadingUnixStreamServer] self.run_servers(socket.AF_INET, servers,
if hasattr(os, 'fork') and os.name not in ('os2',): MyStreamHandler, self.stream_examine)
streamservers.append(ForkingUnixStreamServer)
class ForkingUnixDatagramServer(ForkingMixIn, UnixDatagramServer): pass
dgramservers = [UnixDatagramServer, ThreadingUnixDatagramServer]
if hasattr(os, 'fork') and os.name not in ('os2',):
dgramservers.append(ForkingUnixDatagramServer)
def sloppy_cleanup(): def test_UDPServers(self):
# See http://python.org/sf/1540386 # Test SocketServer.UDPServer
# We need to reap children here otherwise a child from one server servers = [SocketServer.UDPServer,
# can be left running for the next server and cause a test failure. SocketServer.ThreadingUDPServer]
time.sleep(DELAY) if HAVE_FORKING:
reap_children() servers.append(SocketServer.ForkingUDPServer)
self.run_servers(socket.AF_INET, servers, MyDatagramHandler,
self.dgram_examine)
def test_stream_servers(self):
# Test SocketServer's stream servers
if not HAVE_UNIX_SOCKETS:
return
servers = [SocketServer.UnixStreamServer,
SocketServer.ThreadingUnixStreamServer]
if HAVE_FORKING:
servers.append(ForkingUnixStreamServer)
self.run_servers(socket.AF_UNIX, servers, MyStreamHandler,
self.stream_examine)
def testall():
testloop(socket.AF_INET, tcpservers, MyStreamHandler, teststream)
sloppy_cleanup()
testloop(socket.AF_INET, udpservers, MyDatagramHandler, testdgram)
if hasattr(socket, 'AF_UNIX'):
sloppy_cleanup()
testloop(socket.AF_UNIX, streamservers, MyStreamHandler, teststream)
# Alas, on Linux (at least) recvfrom() doesn't return a meaningful # Alas, on Linux (at least) recvfrom() doesn't return a meaningful
# client address so this cannot work: # client address so this cannot work:
##testloop(socket.AF_UNIX, dgramservers, MyDatagramHandler, testdgram)
# def test_dgram_servers(self):
# # Test SocketServer.UnixDatagramServer
# if not HAVE_UNIX_SOCKETS:
# return
# servers = [SocketServer.UnixDatagramServer,
# SocketServer.ThreadingUnixDatagramServer]
# if HAVE_FORKING:
# servers.append(ForkingUnixDatagramServer)
# self.run_servers(socket.AF_UNIX, servers, MyDatagramHandler,
# self.dgram_examine)
def test_main(): def test_main():
import imp
if imp.lock_held(): if imp.lock_held():
# If the import lock is held, the threads will hang. # If the import lock is held, the threads will hang
raise TestSkipped("can't run when import lock is held") raise TestSkipped("can't run when import lock is held")
reap_children() test.test_support.run_unittest(SocketServerTest)
try:
testall()
finally:
cleanup()
reap_children()
if __name__ == "__main__": if __name__ == "__main__":
test_main() test_main()

View File

@ -512,6 +512,7 @@ Fernando P
Mark Perrego Mark Perrego
Trevor Perrin Trevor Perrin
Tim Peters Tim Peters
Benjamin Peterson
Chris Petrilli Chris Petrilli
Bjorn Pettersen Bjorn Pettersen
Geoff Philbrick Geoff Philbrick

View File

@ -67,7 +67,7 @@ REFLOG="build/reflog.txt.out"
# Note: test_XXX (none currently) really leak, but are disabled # Note: test_XXX (none currently) really leak, but are disabled
# so we don't send spam. Any test which really leaks should only # so we don't send spam. Any test which really leaks should only
# be listed here if there are also test cases under Lib/test/leakers. # be listed here if there are also test cases under Lib/test/leakers.
LEAKY_TESTS="test_(cmd_line|popen2|socket|threading_local|urllib2_localnet)" LEAKY_TESTS="test_(cmd_line|popen2|socket|sys|threadsignals|urllib2_localnet)"
# These tests always fail, so skip them so we don't get false positives. # These tests always fail, so skip them so we don't get false positives.
_ALWAYS_SKIP="" _ALWAYS_SKIP=""
@ -99,7 +99,17 @@ mail_on_failure() {
if [ "$FAILURE_CC" != "" ]; then if [ "$FAILURE_CC" != "" ]; then
dest="$dest -c $FAILURE_CC" dest="$dest -c $FAILURE_CC"
fi fi
mutt -s "$FAILURE_SUBJECT $1 ($NUM_FAILURES)" $dest < $2 if [ "x$3" != "x" ] ; then
(echo "More important issues:"
echo "----------------------"
egrep -v "$3" < $2
echo ""
echo "Less important issues:"
echo "----------------------"
egrep "$3" < $2)
else
cat $2
fi | mutt -s "$FAILURE_SUBJECT $1 ($NUM_FAILURES)" $dest
fi fi
} }
@ -194,9 +204,10 @@ if [ $err = 0 -a "$BUILD_DISABLED" != "yes" ]; then
## ensure that the reflog exists so the grep doesn't fail ## ensure that the reflog exists so the grep doesn't fail
touch $REFLOG touch $REFLOG
$PYTHON $REGRTEST_ARGS -R 4:3:$REFLOG -u network $LEAKY_SKIPS >& build/$F $PYTHON $REGRTEST_ARGS -R 4:3:$REFLOG -u network $LEAKY_SKIPS >& build/$F
NUM_FAILURES=`egrep -vc "($LEAKY_TESTS|sum=0)" $REFLOG` LEAK_PAT="($LEAKY_TESTS|sum=0)"
NUM_FAILURES=`egrep -vc "$LEAK_PAT" $REFLOG`
update_status "Testing refleaks ($NUM_FAILURES failures)" "$F" $start update_status "Testing refleaks ($NUM_FAILURES failures)" "$F" $start
mail_on_failure "refleak" $REFLOG mail_on_failure "refleak" $REFLOG "$LEAK_PAT"
## now try to run all the tests ## now try to run all the tests
F=make-testall.out F=make-testall.out

View File

@ -904,7 +904,6 @@ DBCursor_dealloc(DBCursorObject* self)
} }
if (self->dbc != NULL) { if (self->dbc != NULL) {
MYDB_BEGIN_ALLOW_THREADS;
/* If the underlying database has been closed, we don't /* If the underlying database has been closed, we don't
need to do anything. If the environment has been closed need to do anything. If the environment has been closed
we need to leak, as BerkeleyDB will crash trying to access we need to leak, as BerkeleyDB will crash trying to access
@ -913,10 +912,15 @@ DBCursor_dealloc(DBCursorObject* self)
a database open. */ a database open. */
if (self->mydb->db && self->mydb->myenvobj && if (self->mydb->db && self->mydb->myenvobj &&
!self->mydb->myenvobj->closed) !self->mydb->myenvobj->closed)
/* test for: open db + no environment or non-closed environment */
if (self->mydb->db && (!self->mydb->myenvobj || (self->mydb->myenvobj &&
!self->mydb->myenvobj->closed))) {
MYDB_BEGIN_ALLOW_THREADS;
err = self->dbc->c_close(self->dbc); err = self->dbc->c_close(self->dbc);
self->dbc = NULL;
MYDB_END_ALLOW_THREADS; MYDB_END_ALLOW_THREADS;
} }
self->dbc = NULL;
}
Py_XDECREF( self->mydb ); Py_XDECREF( self->mydb );
PyObject_Del(self); PyObject_Del(self);
} }

View File

@ -235,8 +235,7 @@ math_trunc(PyObject *self, PyObject *number)
PyDoc_STRVAR(math_trunc_doc, PyDoc_STRVAR(math_trunc_doc,
"trunc(x:Real) -> Integral\n" "trunc(x:Real) -> Integral\n"
"\n" "\n"
"Truncates x to the nearest Integral toward 0. Uses the __trunc__ magic" "Truncates x to the nearest Integral toward 0. Uses the __trunc__ magic method.");
"method.");
static PyObject * static PyObject *
math_frexp(PyObject *self, PyObject *arg) math_frexp(PyObject *self, PyObject *arg)

View File

@ -3579,9 +3579,9 @@ posix_spawnvpe(PyObject *self, PyObject *args)
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
#if defined(PYCC_GCC) #if defined(PYCC_GCC)
spawnval = spawnve(mode, path, argvlist, envlist); spawnval = spawnvpe(mode, path, argvlist, envlist);
#else #else
spawnval = _spawnve(mode, path, argvlist, envlist); spawnval = _spawnvpe(mode, path, argvlist, envlist);
#endif #endif
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
@ -3964,7 +3964,8 @@ Kill a process with a signal.");
static PyObject * static PyObject *
posix_kill(PyObject *self, PyObject *args) posix_kill(PyObject *self, PyObject *args)
{ {
int pid, sig; pid_t pid;
int sig;
if (!PyArg_ParseTuple(args, "ii:kill", &pid, &sig)) if (!PyArg_ParseTuple(args, "ii:kill", &pid, &sig))
return NULL; return NULL;
#if defined(PYOS_OS2) && !defined(PYCC_GCC) #if defined(PYOS_OS2) && !defined(PYCC_GCC)
@ -4209,7 +4210,7 @@ posix_setgroups(PyObject *self, PyObject *groups)
#if defined(HAVE_WAIT3) || defined(HAVE_WAIT4) #if defined(HAVE_WAIT3) || defined(HAVE_WAIT4)
static PyObject * static PyObject *
wait_helper(int pid, int status, struct rusage *ru) wait_helper(pid_t pid, int status, struct rusage *ru)
{ {
PyObject *result; PyObject *result;
static PyObject *struct_rusage; static PyObject *struct_rusage;
@ -4275,7 +4276,8 @@ Wait for completion of a child process.");
static PyObject * static PyObject *
posix_wait3(PyObject *self, PyObject *args) posix_wait3(PyObject *self, PyObject *args)
{ {
int pid, options; pid_t pid;
int options;
struct rusage ru; struct rusage ru;
WAIT_TYPE status; WAIT_TYPE status;
WAIT_STATUS_INT(status) = 0; WAIT_STATUS_INT(status) = 0;
@ -4299,7 +4301,8 @@ Wait for completion of a given child process.");
static PyObject * static PyObject *
posix_wait4(PyObject *self, PyObject *args) posix_wait4(PyObject *self, PyObject *args)
{ {
int pid, options; pid_t pid;
int options;
struct rusage ru; struct rusage ru;
WAIT_TYPE status; WAIT_TYPE status;
WAIT_STATUS_INT(status) = 0; WAIT_STATUS_INT(status) = 0;
@ -4323,7 +4326,8 @@ Wait for completion of a given child process.");
static PyObject * static PyObject *
posix_waitpid(PyObject *self, PyObject *args) posix_waitpid(PyObject *self, PyObject *args)
{ {
int pid, options; pid_t pid;
int options;
WAIT_TYPE status; WAIT_TYPE status;
WAIT_STATUS_INT(status) = 0; WAIT_STATUS_INT(status) = 0;
@ -4372,7 +4376,7 @@ Wait for completion of a child process.");
static PyObject * static PyObject *
posix_wait(PyObject *self, PyObject *noargs) posix_wait(PyObject *self, PyObject *noargs)
{ {
int pid; pid_t pid;
WAIT_TYPE status; WAIT_TYPE status;
WAIT_STATUS_INT(status) = 0; WAIT_STATUS_INT(status) = 0;
@ -4567,7 +4571,8 @@ Call the system call getsid().");
static PyObject * static PyObject *
posix_getsid(PyObject *self, PyObject *args) posix_getsid(PyObject *self, PyObject *args)
{ {
int pid, sid; pid_t pid;
int sid;
if (!PyArg_ParseTuple(args, "i:getsid", &pid)) if (!PyArg_ParseTuple(args, "i:getsid", &pid))
return NULL; return NULL;
sid = getsid(pid); sid = getsid(pid);
@ -4601,7 +4606,8 @@ Call the system call setpgid().");
static PyObject * static PyObject *
posix_setpgid(PyObject *self, PyObject *args) posix_setpgid(PyObject *self, PyObject *args)
{ {
int pid, pgrp; pid_t pid;
int pgrp;
if (!PyArg_ParseTuple(args, "ii:setpgid", &pid, &pgrp)) if (!PyArg_ParseTuple(args, "ii:setpgid", &pid, &pgrp))
return NULL; return NULL;
if (setpgid(pid, pgrp) < 0) if (setpgid(pid, pgrp) < 0)

View File

@ -1066,20 +1066,19 @@ float_float(PyObject *v)
} }
static PyObject * static PyObject *
float_as_integer_ratio(PyObject *v) float_as_integer_ratio(PyObject *v, PyObject *unused)
{ {
double self; double self;
double float_part; double float_part;
int exponent; int exponent;
int is_negative; int i;
const int chunk_size = 28;
PyObject *prev; PyObject *prev;
PyObject *py_chunk = NULL;
PyObject *py_exponent = NULL; PyObject *py_exponent = NULL;
PyObject *numerator = NULL; PyObject *numerator = NULL;
PyObject *denominator = NULL; PyObject *denominator = NULL;
PyObject *result_pair = NULL; PyObject *result_pair = NULL;
PyNumberMethods *long_methods; PyNumberMethods *long_methods = PyLong_Type.tp_as_number;
#define INPLACE_UPDATE(obj, call) \ #define INPLACE_UPDATE(obj, call) \
prev = obj; \ prev = obj; \
@ -1101,93 +1100,31 @@ float_as_integer_ratio(PyObject *v)
} }
#endif #endif
if (self == 0) {
numerator = PyLong_FromLong(0);
if (numerator == NULL) goto error;
denominator = PyLong_FromLong(1);
if (denominator == NULL) goto error;
result_pair = PyTuple_Pack(2, numerator, denominator);
/* Hand ownership over to the tuple. If the tuple
wasn't created successfully, we want to delete the
ints anyway. */
Py_DECREF(numerator);
Py_DECREF(denominator);
return result_pair;
}
/* XXX: Could perhaps handle FLT_RADIX!=2 by using ilogb and
scalbn, but those may not be in C89. */
PyFPE_START_PROTECT("as_integer_ratio", goto error); PyFPE_START_PROTECT("as_integer_ratio", goto error);
float_part = frexp(self, &exponent); float_part = frexp(self, &exponent); /* self == float_part * 2**exponent exactly */
is_negative = 0;
if (float_part < 0) {
float_part = -float_part;
is_negative = 1;
/* 0.5 <= float_part < 1.0 */
}
PyFPE_END_PROTECT(float_part);
/* abs(self) == float_part * 2**exponent exactly */
/* Suck up chunk_size bits at a time; 28 is enough so that we
suck up all bits in 2 iterations for all known binary
double-precision formats, and small enough to fit in a
long. */
numerator = PyLong_FromLong(0);
if (numerator == NULL) goto error;
long_methods = PyLong_Type.tp_as_number;
py_chunk = PyLong_FromLong(chunk_size);
if (py_chunk == NULL) goto error;
while (float_part != 0) {
/* invariant: abs(self) ==
(numerator + float_part) * 2**exponent exactly */
long digit;
PyObject *py_digit;
PyFPE_START_PROTECT("as_integer_ratio", goto error);
/* Pull chunk_size bits out of float_part, into digits. */
float_part = ldexp(float_part, chunk_size);
digit = (long)float_part;
float_part -= digit;
/* 0 <= float_part < 1 */
exponent -= chunk_size;
PyFPE_END_PROTECT(float_part); PyFPE_END_PROTECT(float_part);
/* Shift digits into numerator. */ for (i=0; i<300 && float_part != floor(float_part) ; i++) {
// numerator <<= chunk_size float_part *= 2.0;
INPLACE_UPDATE(numerator, exponent--;
long_methods->nb_lshift(numerator, py_chunk));
if (numerator == NULL) goto error;
// numerator |= digit
py_digit = PyLong_FromLong(digit);
if (py_digit == NULL) goto error;
INPLACE_UPDATE(numerator,
long_methods->nb_or(numerator, py_digit));
Py_DECREF(py_digit);
if (numerator == NULL) goto error;
} }
/* self == float_part * 2**exponent exactly and float_part is integral.
If FLT_RADIX != 2, the 300 steps may leave a tiny fractional part
to be truncated by PyLong_FromDouble(). */
/* Add in the sign bit. */ numerator = PyLong_FromDouble(float_part);
if (is_negative) {
INPLACE_UPDATE(numerator,
long_methods->nb_negative(numerator));
if (numerator == NULL) goto error; if (numerator == NULL) goto error;
}
/* now self = numerator * 2**exponent exactly; fold in 2**exponent */ /* fold in 2**exponent */
denominator = PyLong_FromLong(1); denominator = PyLong_FromLong(1);
py_exponent = PyLong_FromLong(labs(exponent)); py_exponent = PyLong_FromLong(labs((long)exponent));
if (py_exponent == NULL) goto error; if (py_exponent == NULL) goto error;
INPLACE_UPDATE(py_exponent, INPLACE_UPDATE(py_exponent,
long_methods->nb_lshift(denominator, py_exponent)); long_methods->nb_lshift(denominator, py_exponent));
if (py_exponent == NULL) goto error; if (py_exponent == NULL) goto error;
if (exponent > 0) { if (exponent > 0) {
INPLACE_UPDATE(numerator, INPLACE_UPDATE(numerator,
long_methods->nb_multiply(numerator, long_methods->nb_multiply(numerator, py_exponent));
py_exponent));
if (numerator == NULL) goto error; if (numerator == NULL) goto error;
} }
else { else {
@ -1196,12 +1133,17 @@ float_as_integer_ratio(PyObject *v)
py_exponent = NULL; py_exponent = NULL;
} }
/* Returns ints instead of longs where possible */
INPLACE_UPDATE(numerator, PyNumber_Int(numerator));
if (numerator == NULL) goto error;
INPLACE_UPDATE(denominator, PyNumber_Int(denominator));
if (denominator == NULL) goto error;
result_pair = PyTuple_Pack(2, numerator, denominator); result_pair = PyTuple_Pack(2, numerator, denominator);
#undef INPLACE_UPDATE #undef INPLACE_UPDATE
error: error:
Py_XDECREF(py_exponent); Py_XDECREF(py_exponent);
Py_XDECREF(py_chunk);
Py_XDECREF(denominator); Py_XDECREF(denominator);
Py_XDECREF(numerator); Py_XDECREF(numerator);
return result_pair; return result_pair;
@ -1210,17 +1152,16 @@ error:
PyDoc_STRVAR(float_as_integer_ratio_doc, PyDoc_STRVAR(float_as_integer_ratio_doc,
"float.as_integer_ratio() -> (int, int)\n" "float.as_integer_ratio() -> (int, int)\n"
"\n" "\n"
"Returns a pair of integers, not necessarily in lowest terms, whose\n" "Returns a pair of integers, whose ratio is exactly equal to the original\n"
"ratio is exactly equal to the original float. This method raises an\n" "float and with a positive denominator.\n"
"OverflowError on infinities and a ValueError on nans. The resulting\n" "Raises OverflowError on infinities and a ValueError on nans.\n"
"denominator will be positive.\n"
"\n" "\n"
">>> (10.0).as_integer_ratio()\n" ">>> (10.0).as_integer_ratio()\n"
"(167772160L, 16777216L)\n" "(10, 1)\n"
">>> (0.0).as_integer_ratio()\n" ">>> (0.0).as_integer_ratio()\n"
"(0, 1)\n" "(0, 1)\n"
">>> (-.25).as_integer_ratio()\n" ">>> (-.25).as_integer_ratio()\n"
"(-134217728L, 536870912L)"); "(-1, 4)");
static PyObject * static PyObject *

View File

@ -1,16 +1,16 @@
#####################==================---------------- #####################==================----------------
# #
# Top-Level Makefile for Building Python 2.4 for OS/2 using GCC/EMX # Top-Level Makefile for Building Python 2.6 for OS/2 using GCC/EMX
# Originally written by Andrew Zabolotny, <bit@eltech.ru> for Python 1.5.2 # Originally written by Andrew Zabolotny, <bit@eltech.ru> for Python 1.5.2
# Modified by Andrew MacIntyre, <andymac@pcug.org.au> for Python 2.5 # Modified by Andrew MacIntyre, <andymac@pcug.org.au> for Python 2.6
# #
# This makefile was developed for use with [P]GCC/EMX compiler any # This makefile was developed for use with [P]GCC/EMX compiler any
# version and GNU Make. # version and GNU Make.
# #
# The output of the build is a largish Python25.DLL containing the # The output of the build is a largish Python26.DLL containing the
# essential modules of Python and a small Python.exe program to start # essential modules of Python and a small Python.exe program to start
# the interpreter. When embedding Python within another program, only # the interpreter. When embedding Python within another program, only
# Python25.DLL is needed. We also build python_s.a static library (which # Python26.DLL is needed. We also build python_s.a static library (which
# can be converted into OMF (.lib) format using emxomf tool) and both # can be converted into OMF (.lib) format using emxomf tool) and both
# python.a and python.lib import libraries. Then the optional # python.a and python.lib import libraries. Then the optional
# extension modules, which are OS/2 DLLs renamed with a PYD file extension. # extension modules, which are OS/2 DLLs renamed with a PYD file extension.
@ -64,7 +64,7 @@ HAVE_OPENSSL= no
# === install locations === # === install locations ===
# default value of PYTHONHOME # default value of PYTHONHOME
LIB_DIR=C:/Python25 LIB_DIR=C:/Python26
# default is to have everything in or under PYTHONHOME # default is to have everything in or under PYTHONHOME
EXE_DIR=$(LIB_DIR) EXE_DIR=$(LIB_DIR)
DLL_DIR=$(EXE_DIR) DLL_DIR=$(EXE_DIR)
@ -236,8 +236,8 @@ $(OUT)%$O: %.c
@echo STACKSIZE 2097152 >>$@ @echo STACKSIZE 2097152 >>$@
# Output file names # Output file names
PYTHON_VER= 2.5 PYTHON_VER= 2.6
PYTHON_LIB= python25 PYTHON_LIB= python26
PYTHON.LIB= $(PYTHON_LIB)_s$A PYTHON.LIB= $(PYTHON_LIB)_s$A
PYTHON.IMPLIB= $(PYTHON_LIB)$A PYTHON.IMPLIB= $(PYTHON_LIB)$A
ifeq ($(EXEOMF),yes) ifeq ($(EXEOMF),yes)

View File

@ -1,4 +1,4 @@
This is a port of Python 2.5 to OS/2 using the EMX development tools This is a port of Python 2.6 to OS/2 using the EMX development tools
========================================================================= =========================================================================
What's new since the previous release What's new since the previous release
@ -10,11 +10,11 @@ Another day, another version...
Licenses and info about Python and EMX Licenses and info about Python and EMX
-------------------------------------- --------------------------------------
Please read the file README.Python-2.5 included in this package for Please read the file README.Python-2.6 included in this package for
information about Python 2.5. This file is the README file from the information about Python 2.6. This file is the README file from the
Python 2.5 source distribution available via http://www.python.org/ Python 2.6 source distribution available via http://www.python.org/
and its mirrors. The file LICENCE.Python-2.5 is the text of the Licence and its mirrors. The file LICENCE.Python-2.6 is the text of the Licence
from the Python 2.5 source distribution. from the Python 2.6 source distribution.
Note that the EMX package that this package depends on is released under Note that the EMX package that this package depends on is released under
the GNU General Public Licence. Please refer to the documentation the GNU General Public Licence. Please refer to the documentation
@ -46,7 +46,7 @@ There have been ports of previous versions of Python to OS/2.
The best known would be that by Jeff Rush, most recently of version The best known would be that by Jeff Rush, most recently of version
1.5.2. Jeff used IBM's Visual Age C++ (v3) for his ports, and his 1.5.2. Jeff used IBM's Visual Age C++ (v3) for his ports, and his
patches have been included in the Python 2.5 source distribution. patches have been included in the Python 2.6 source distribution.
Andy Zabolotny implemented a port of Python v1.5.2 using the EMX Andy Zabolotny implemented a port of Python v1.5.2 using the EMX
development tools. His patches against the Python v1.5.2 source development tools. His patches against the Python v1.5.2 source
@ -92,7 +92,7 @@ Python.exe is linked as an a.out executable, ie using EMX method E1
to compile & link the executable. This is so that fork() works (see to compile & link the executable. This is so that fork() works (see
"YOU HAVE BEEN WARNED" item 1). "YOU HAVE BEEN WARNED" item 1).
Python25.dll is created as a normal OMF DLL, with an OMF import Python26.dll is created as a normal OMF DLL, with an OMF import
library and module definition file. There is also an a.out (.a) import library and module definition file. There is also an a.out (.a) import
library to support linking the DLL to a.out executables. The DLL library to support linking the DLL to a.out executables. The DLL
requires the EMX runtime DLLs. requires the EMX runtime DLLs.
@ -148,7 +148,7 @@ WARNED" item 13.
Upstream source patches: Upstream source patches:
No updates to the Python 2.5 release have become available. No updates to the Python 2.6 release have become available.
Eberhard Mattes' EMXFIX04 update to his EMX 0.9d tools suite includes Eberhard Mattes' EMXFIX04 update to his EMX 0.9d tools suite includes
bug fixes for the BSD DB library. The bsddb module included in this bug fixes for the BSD DB library. The bsddb module included in this
@ -157,7 +157,7 @@ port incorporates these fixes.
Library and other distributed Python code: Library and other distributed Python code:
The Python standard library lives in the Lib directory. All the standard The Python standard library lives in the Lib directory. All the standard
library code included with the Python 2.5 source distribution is included library code included with the Python 2.6 source distribution is included
in the binary archive, with the exception of the dos-8x3 and tkinter in the binary archive, with the exception of the dos-8x3 and tkinter
subdirectories which have been omitted to reduce the size of the binary subdirectories which have been omitted to reduce the size of the binary
archive - the dos-8x3 components are unnecessary duplicates and Tkinter archive - the dos-8x3 components are unnecessary duplicates and Tkinter
@ -172,7 +172,7 @@ omitted as not being supported by this port. The Misc directory has
also been omitted. also been omitted.
All subdirectories omitted from the binary archive can be reconstituted All subdirectories omitted from the binary archive can be reconstituted
from the Python 2.5 source distribution, if desired. from the Python 2.6 source distribution, if desired.
Support for building Python extensions: Support for building Python extensions:
@ -190,15 +190,15 @@ Packaging
--------- ---------
This port is packaged as follows: This port is packaged as follows:
- python-2.5-os2emx-bin-03????.zip (binaries, library modules) - python-2.6-os2emx-bin-03????.zip (binaries, library modules)
- python-2.5-os2emx-src-03???? (patches+makefiles for non-Python code) - python-2.6-os2emx-src-03???? (patches+makefiles for non-Python code)
As all the Python specific patches for the port are now part of the As all the Python specific patches for the port are now part of the
Python release tarball, only the patches and makefiles involved in Python release tarball, only the patches and makefiles involved in
building external libraries for optional extensions are included in building external libraries for optional extensions are included in
the source archive. the source archive.
Documentation for the Python language, as well as the Python 2.5 Documentation for the Python language, as well as the Python 2.6
source distibution, can be obtained from the Python website source distibution, can be obtained from the Python website
(http://www.python.org/) or the Python project pages at Sourceforge (http://www.python.org/) or the Python project pages at Sourceforge
(http://sf.net/projects/python/). (http://sf.net/projects/python/).
@ -213,7 +213,7 @@ package.
Unpack this archive, preserving the subdirectories, in the root directory Unpack this archive, preserving the subdirectories, in the root directory
of the drive where you want Python to live. of the drive where you want Python to live.
Add the Python directory (eg C:\Python25) to the PATH and LIBPATH Add the Python directory (eg C:\Python26) to the PATH and LIBPATH
variables in CONFIG.SYS. variables in CONFIG.SYS.
You should then set the PYTHONHOME and PYTHONPATH environment variables You should then set the PYTHONHOME and PYTHONPATH environment variables
@ -223,9 +223,9 @@ PYTHONHOME should be set to Python's top level directory. PYTHONPATH
should be set to the semicolon separated list of principal Python library should be set to the semicolon separated list of principal Python library
directories. directories.
I use: I use:
SET PYTHONHOME=F:/Python25 SET PYTHONHOME=F:/Python26
SET PYTHONPATH=F:/Python25/Lib;F:/Python25/Lib/plat-os2emx; SET PYTHONPATH=F:/Python26/Lib;F:/Python26/Lib/plat-os2emx;
F:/Python25/Lib/lib-dynload;F:/Python25/Lib/site-packages F:/Python26/Lib/lib-dynload;F:/Python26/Lib/site-packages
NOTE!: the PYTHONPATH setting above is linewrapped for this document - it NOTE!: the PYTHONPATH setting above is linewrapped for this document - it
should all be on one line in CONFIG.SYS! should all be on one line in CONFIG.SYS!
@ -238,7 +238,7 @@ EMX subset of the Terminfo database included with the ncurses-5.2 source
distribution. This can be used by setting the TERMINFO environment variable distribution. This can be used by setting the TERMINFO environment variable
to the path of the Terminfo subdirectory below the Python home directory. to the path of the Terminfo subdirectory below the Python home directory.
On my system this looks like: On my system this looks like:
SET TERMINFO=F:/Python25/Terminfo SET TERMINFO=F:/Python26/Terminfo
For the TERM environment variable, I would try one of the following: For the TERM environment variable, I would try one of the following:
SET TERM=ansi SET TERM=ansi
@ -252,8 +252,8 @@ If you wish to compile all the included Python library modules to bytecode,
you can change into the Python home directory and run the COMPILEALL.CMD you can change into the Python home directory and run the COMPILEALL.CMD
batch file. batch file.
You can execute the regression tests included with the Python 2.5 source You can execute the regression tests included with the Python 2.6 source
distribution by changing to the Python 2.5 home directory and executing the distribution by changing to the Python 2.6 home directory and executing the
REGRTEST.CMD batch file. The following tests are known to fail at this REGRTEST.CMD batch file. The following tests are known to fail at this
time: time:
- test_mhlib (I don't know of any port of MH to OS/2); - test_mhlib (I don't know of any port of MH to OS/2);
@ -299,7 +299,7 @@ Procedure
1. decide if you need to change the location of the Python installation. 1. decide if you need to change the location of the Python installation.
If you wish to do this, set the value of the Makefile variable LIB_DIR If you wish to do this, set the value of the Makefile variable LIB_DIR
to the directory you wish to use for PYTHONHOME to the directory you wish to use for PYTHONHOME
(eg /usr/local/lib/python2.5). (eg /usr/local/lib/python2.6).
If you want Python to find its library without the PYTHONHOME If you want Python to find its library without the PYTHONHOME
environment variable set, set the value of the Makefile variable environment variable set, set the value of the Makefile variable
@ -309,7 +309,7 @@ Procedure
to be installed in a directory other than the PYTHONHOME directory, set to be installed in a directory other than the PYTHONHOME directory, set
the value of the Makefile variable EXE_DIR to the appropriate directory. the value of the Makefile variable EXE_DIR to the appropriate directory.
3. If you wish the Python core DLL (python25.dll) to be installed in a 3. If you wish the Python core DLL (python26.dll) to be installed in a
directory other than the directory in which the Python executables are directory other than the directory in which the Python executables are
installed (by default, the PYTHONHOME directory), set the value of the installed (by default, the PYTHONHOME directory), set the value of the
Makefile variable DLL_DIR to the appropriate directory. This DLL must Makefile variable DLL_DIR to the appropriate directory. This DLL must
@ -698,4 +698,4 @@ Andrew MacIntyre
E-mail: andymac@bullseye.apana.org.au, or andymac@pcug.org.au E-mail: andymac@bullseye.apana.org.au, or andymac@pcug.org.au
Web: http://www.andymac.org/ Web: http://www.andymac.org/
23 July, 2006. 28 January, 2008.

View File

@ -1,54 +1,54 @@
LIBRARY python25 INITINSTANCE TERMINSTANCE LIBRARY python26 INITINSTANCE TERMINSTANCE
DESCRIPTION "Python 2.5 Core DLL" DESCRIPTION "Python 2.6 Core DLL"
PROTMODE PROTMODE
DATA MULTIPLE NONSHARED DATA MULTIPLE NONSHARED
EXPORTS EXPORTS
; From python25_s.lib(config) ; From python26_s.lib(config)
"_PyImport_Inittab" "_PyImport_Inittab"
; From python25_s.lib(dlfcn) ; From python26_s.lib(dlfcn)
; "dlopen" ; "dlopen"
; "dlsym" ; "dlsym"
; "dlclose" ; "dlclose"
; "dlerror" ; "dlerror"
; From python25_s.lib(getpathp) ; From python26_s.lib(getpathp)
"Py_GetProgramFullPath" "Py_GetProgramFullPath"
"Py_GetPrefix" "Py_GetPrefix"
"Py_GetExecPrefix" "Py_GetExecPrefix"
"Py_GetPath" "Py_GetPath"
; From python25_s.lib(getbuildinfo) ; From python26_s.lib(getbuildinfo)
"Py_GetBuildInfo" "Py_GetBuildInfo"
"_Py_svnversion" "_Py_svnversion"
; From python25_s.lib(main) ; From python26_s.lib(main)
"Py_Main" "Py_Main"
"Py_GetArgcArgv" "Py_GetArgcArgv"
; From python25_s.lib(acceler) ; From python26_s.lib(acceler)
"PyGrammar_AddAccelerators" "PyGrammar_AddAccelerators"
"PyGrammar_RemoveAccelerators" "PyGrammar_RemoveAccelerators"
; From python25_s.lib(grammar1) ; From python26_s.lib(grammar1)
"PyGrammar_FindDFA" "PyGrammar_FindDFA"
"PyGrammar_LabelRepr" "PyGrammar_LabelRepr"
; From python25_s.lib(listnode) ; From python26_s.lib(listnode)
"PyNode_ListTree" "PyNode_ListTree"
; From python25_s.lib(node) ; From python26_s.lib(node)
"PyNode_New" "PyNode_New"
"PyNode_AddChild" "PyNode_AddChild"
"PyNode_Free" "PyNode_Free"
; From python25_s.lib(parser) ; From python26_s.lib(parser)
"PyParser_AddToken" "PyParser_AddToken"
"PyParser_New" "PyParser_New"
"PyParser_Delete" "PyParser_Delete"
; From python25_s.lib(parsetok) ; From python26_s.lib(parsetok)
"Py_TabcheckFlag" "Py_TabcheckFlag"
"PyParser_ParseString" "PyParser_ParseString"
"PyParser_ParseStringFlagsFilename" "PyParser_ParseStringFlagsFilename"
@ -56,18 +56,18 @@ EXPORTS
"PyParser_ParseFileFlags" "PyParser_ParseFileFlags"
"PyParser_ParseStringFlags" "PyParser_ParseStringFlags"
; From python25_s.lib(bitset) ; From python26_s.lib(bitset)
"_Py_newbitset" "_Py_newbitset"
"_Py_delbitset" "_Py_delbitset"
"_Py_addbit" "_Py_addbit"
"_Py_samebitset" "_Py_samebitset"
"_Py_mergebitset" "_Py_mergebitset"
; From python25_s.lib(metagrammar) ; From python26_s.lib(metagrammar)
"_Py_meta_grammar" "_Py_meta_grammar"
"Py_meta_grammar" "Py_meta_grammar"
; From python25_s.lib(tokenizer) ; From python26_s.lib(tokenizer)
"PyToken_OneChar" "PyToken_OneChar"
"PyToken_TwoChars" "PyToken_TwoChars"
"PyToken_ThreeChars" "PyToken_ThreeChars"
@ -77,14 +77,14 @@ EXPORTS
"PyTokenizer_Get" "PyTokenizer_Get"
"_PyParser_TokenNames" "_PyParser_TokenNames"
; From python25_s.lib(myreadline) ; From python26_s.lib(myreadline)
"_PyOS_ReadlineTState" "_PyOS_ReadlineTState"
"PyOS_ReadlineFunctionPointer" "PyOS_ReadlineFunctionPointer"
"PyOS_StdioReadline" "PyOS_StdioReadline"
"PyOS_Readline" "PyOS_Readline"
"PyOS_InputHook" "PyOS_InputHook"
; From python25_s.lib(abstract) ; From python26_s.lib(abstract)
"_PyObject_LengthHint" "_PyObject_LengthHint"
"PyMapping_Size" "PyMapping_Size"
"PyObject_CallMethod" "PyObject_CallMethod"
@ -175,19 +175,27 @@ EXPORTS
"PyObject_IsInstance" "PyObject_IsInstance"
"PyObject_IsSubclass" "PyObject_IsSubclass"
; From python25_s.lib(boolobject) ; From python26_s.lib(boolobject)
"PyBool_FromLong" "PyBool_FromLong"
"PyBool_Type" "PyBool_Type"
"_Py_ZeroStruct" "_Py_ZeroStruct"
"_Py_TrueStruct" "_Py_TrueStruct"
; From python25_s.lib(cellobject) ; From python26_s.lib(bufferobject)
"PyBuffer_FromObject"
"PyBuffer_FromReadWriteObject"
"PyBuffer_FromMemory"
"PyBuffer_FromReadWriteMemory"
"PyBuffer_New"
"PyBuffer_Type"
; From python26_s.lib(cellobject)
"PyCell_New" "PyCell_New"
"PyCell_Get" "PyCell_Get"
"PyCell_Set" "PyCell_Set"
"PyCell_Type" "PyCell_Type"
; From python25_s.lib(classobject) ; From python26_s.lib(classobject)
"PyClass_New" "PyClass_New"
"PyClass_IsSubclass" "PyClass_IsSubclass"
"PyInstance_New" "PyInstance_New"
@ -202,7 +210,7 @@ EXPORTS
"PyInstance_Type" "PyInstance_Type"
"PyMethod_Type" "PyMethod_Type"
; From python25_s.lib(cobject) ; From python26_s.lib(cobject)
"PyCObject_FromVoidPtr" "PyCObject_FromVoidPtr"
"PyCObject_FromVoidPtrAndDesc" "PyCObject_FromVoidPtrAndDesc"
"PyCObject_AsVoidPtr" "PyCObject_AsVoidPtr"
@ -211,13 +219,13 @@ EXPORTS
"PyCObject_SetVoidPtr" "PyCObject_SetVoidPtr"
"PyCObject_Type" "PyCObject_Type"
; From python25_s.lib(codeobject) ; From python26_s.lib(codeobject)
"PyCode_New" "PyCode_New"
"PyCode_Addr2Line" "PyCode_Addr2Line"
"PyCode_CheckLineNumber" "PyCode_CheckLineNumber"
"PyCode_Type" "PyCode_Type"
; From python25_s.lib(complexobject) ; From python26_s.lib(complexobject)
"_Py_c_pow" "_Py_c_pow"
"_Py_c_sum" "_Py_c_sum"
"_Py_c_diff" "_Py_c_diff"
@ -231,7 +239,7 @@ EXPORTS
"PyComplex_AsCComplex" "PyComplex_AsCComplex"
"PyComplex_Type" "PyComplex_Type"
; From python25_s.lib(descrobject) ; From python26_s.lib(descrobject)
"PyWrapper_New" "PyWrapper_New"
"PyDescr_NewMethod" "PyDescr_NewMethod"
"PyDescr_NewClassMethod" "PyDescr_NewClassMethod"
@ -242,7 +250,7 @@ EXPORTS
"PyWrapperDescr_Type" "PyWrapperDescr_Type"
"PyProperty_Type" "PyProperty_Type"
; From python25_s.lib(dictobject) ; From python26_s.lib(dictobject)
"PyDict_New" "PyDict_New"
"PyDict_GetItem" "PyDict_GetItem"
"PyDict_SetItem" "PyDict_SetItem"
@ -266,11 +274,11 @@ EXPORTS
"PyDictIterValue_Type" "PyDictIterValue_Type"
"PyDictIterItem_Type" "PyDictIterItem_Type"
; From python25_s.lib(enumobject) ; From python26_s.lib(enumobject)
"PyEnum_Type" "PyEnum_Type"
"PyReversed_Type" "PyReversed_Type"
; From python25_s.lib(fileobject) ; From python26_s.lib(fileobject)
"PyFile_FromString" "PyFile_FromString"
"Py_UniversalNewlineFread" "Py_UniversalNewlineFread"
"PyFile_GetLine" "PyFile_GetLine"
@ -286,7 +294,7 @@ EXPORTS
"PyFile_Name" "PyFile_Name"
"PyFile_Type" "PyFile_Type"
; From python25_s.lib(floatobject) ; From python26_s.lib(floatobject)
"PyFloat_FromString" "PyFloat_FromString"
"PyFloat_AsDouble" "PyFloat_AsDouble"
"PyFloat_Fini" "PyFloat_Fini"
@ -301,7 +309,7 @@ EXPORTS
"PyFloat_AsStringEx" "PyFloat_AsStringEx"
"PyFloat_Type" "PyFloat_Type"
; From python25_s.lib(frameobject) ; From python26_s.lib(frameobject)
"PyFrame_New" "PyFrame_New"
"PyFrame_FastToLocals" "PyFrame_FastToLocals"
"PyFrame_LocalsToFast" "PyFrame_LocalsToFast"
@ -311,7 +319,7 @@ EXPORTS
"PyFrame_BlockPop" "PyFrame_BlockPop"
"PyFrame_Type" "PyFrame_Type"
; From python25_s.lib(funcobject) ; From python26_s.lib(funcobject)
"PyFunction_New" "PyFunction_New"
"PyFunction_GetCode" "PyFunction_GetCode"
"PyFunction_GetGlobals" "PyFunction_GetGlobals"
@ -326,18 +334,33 @@ EXPORTS
"PyClassMethod_Type" "PyClassMethod_Type"
"PyStaticMethod_Type" "PyStaticMethod_Type"
; From python25_s.lib(genobject) ; From python26_s.lib(genobject)
"PyGen_New" "PyGen_New"
"PyGen_NeedsFinalizing" "PyGen_NeedsFinalizing"
"PyGen_Type" "PyGen_Type"
; From python25_s.lib(iterobject) ; From python26_s.lib(intobject)
"PyInt_AsLong"
"PyInt_AsUnsignedLongMask"
"PyInt_AsUnsignedLongLongMask"
"PyInt_FromString"
"PyInt_AsSsize_t"
"PyInt_Fini"
"PyInt_FromUnicode"
"PyInt_FromLong"
"PyInt_FromSize_t"
"PyInt_FromSsize_t"
"PyInt_GetMax"
"_PyInt_Init"
"PyInt_Type"
; From python26_s.lib(iterobject)
"PySeqIter_New" "PySeqIter_New"
"PyCallIter_New" "PyCallIter_New"
"PySeqIter_Type" "PySeqIter_Type"
"PyCallIter_Type" "PyCallIter_Type"
; From python25_s.lib(listobject) ; From python26_s.lib(listobject)
"PyList_New" "PyList_New"
"PyList_Append" "PyList_Append"
"PyList_Size" "PyList_Size"
@ -355,7 +378,7 @@ EXPORTS
"PyListIter_Type" "PyListIter_Type"
"PyListRevIter_Type" "PyListRevIter_Type"
; From python25_s.lib(longobject) ; From python26_s.lib(longobject)
"PyLong_FromDouble" "PyLong_FromDouble"
"PyLong_AsLong" "PyLong_AsLong"
"_PyLong_AsSsize_t" "_PyLong_AsSsize_t"
@ -385,7 +408,7 @@ EXPORTS
"PyLong_Type" "PyLong_Type"
"_PyLong_DigitValue" "_PyLong_DigitValue"
; From python25_s.lib(methodobject) ; From python26_s.lib(methodobject)
"PyCFunction_Call" "PyCFunction_Call"
"Py_FindMethodInChain" "Py_FindMethodInChain"
"PyCFunction_GetFunction" "PyCFunction_GetFunction"
@ -397,7 +420,7 @@ EXPORTS
"PyCFunction_New" "PyCFunction_New"
"PyCFunction_Type" "PyCFunction_Type"
; From python25_s.lib(moduleobject) ; From python26_s.lib(moduleobject)
"PyModule_New" "PyModule_New"
"_PyModule_Clear" "_PyModule_Clear"
"PyModule_GetDict" "PyModule_GetDict"
@ -405,7 +428,7 @@ EXPORTS
"PyModule_GetFilename" "PyModule_GetFilename"
"PyModule_Type" "PyModule_Type"
; From python25_s.lib(object) ; From python26_s.lib(object)
"Py_DivisionWarningFlag" "Py_DivisionWarningFlag"
"PyObject_Str" "PyObject_Str"
"PyObject_Repr" "PyObject_Repr"
@ -448,6 +471,7 @@ EXPORTS
"PyObject_InitVar" "PyObject_InitVar"
"_PyObject_New" "_PyObject_New"
"_PyObject_NewVar" "_PyObject_NewVar"
"_PyObject_Del"
"_Py_ReadyTypes" "_Py_ReadyTypes"
"_Py_SwappedOp" "_Py_SwappedOp"
"_Py_NotImplementedStruct" "_Py_NotImplementedStruct"
@ -457,15 +481,15 @@ EXPORTS
"_PyTrash_delete_nesting" "_PyTrash_delete_nesting"
"_PyTrash_delete_later" "_PyTrash_delete_later"
; From python25_s.lib(obmalloc) ; From python26_s.lib(obmalloc)
"PyObject_Malloc" "PyObject_Malloc"
"PyObject_Free" "PyObject_Free"
"PyObject_Realloc" "PyObject_Realloc"
; From python25_s.lib(rangeobject) ; From python26_s.lib(rangeobject)
"PyRange_Type" "PyRange_Type"
; From python25_s.lib(setobject) ; From python26_s.lib(setobject)
"PySet_Pop" "PySet_Pop"
"PySet_New" "PySet_New"
"PyFrozenSet_New" "PyFrozenSet_New"
@ -480,7 +504,7 @@ EXPORTS
"PySet_Type" "PySet_Type"
"PyFrozenSet_Type" "PyFrozenSet_Type"
; From python25_s.lib(sliceobject) ; From python26_s.lib(sliceobject)
"_PySlice_FromIndices" "_PySlice_FromIndices"
"PySlice_GetIndices" "PySlice_GetIndices"
"PySlice_GetIndicesEx" "PySlice_GetIndicesEx"
@ -488,7 +512,7 @@ EXPORTS
"_Py_EllipsisObject" "_Py_EllipsisObject"
"PySlice_Type" "PySlice_Type"
; From python25_s.lib(stringobject) ; From python26_s.lib(stringobject)
"PyString_FromStringAndSize" "PyString_FromStringAndSize"
"PyString_InternInPlace" "PyString_InternInPlace"
"PyString_FromString" "PyString_FromString"
@ -519,12 +543,12 @@ EXPORTS
"PyString_Type" "PyString_Type"
"PyBaseString_Type" "PyBaseString_Type"
; From python25_s.lib(structseq) ; From python26_s.lib(structseq)
"PyStructSequence_InitType" "PyStructSequence_InitType"
"PyStructSequence_New" "PyStructSequence_New"
"PyStructSequence_UnnamedField" "PyStructSequence_UnnamedField"
; From python25_s.lib(tupleobject) ; From python26_s.lib(tupleobject)
"PyTuple_New" "PyTuple_New"
"PyTuple_Pack" "PyTuple_Pack"
"_PyTuple_Resize" "_PyTuple_Resize"
@ -536,7 +560,7 @@ EXPORTS
"PyTuple_Type" "PyTuple_Type"
"PyTupleIter_Type" "PyTupleIter_Type"
; From python25_s.lib(typeobject) ; From python26_s.lib(typeobject)
"PyType_IsSubtype" "PyType_IsSubtype"
"_PyType_Lookup" "_PyType_Lookup"
"PyType_Ready" "PyType_Ready"
@ -547,7 +571,7 @@ EXPORTS
"PyBaseObject_Type" "PyBaseObject_Type"
"PySuper_Type" "PySuper_Type"
; From python25_s.lib(unicodeobject) ; From python26_s.lib(unicodeobject)
"PyUnicodeUCS2_Resize" "PyUnicodeUCS2_Resize"
"PyUnicodeUCS2_FromOrdinal" "PyUnicodeUCS2_FromOrdinal"
"PyUnicodeUCS2_FromObject" "PyUnicodeUCS2_FromObject"
@ -613,7 +637,7 @@ EXPORTS
"PyUnicode_AsDecodedObject" "PyUnicode_AsDecodedObject"
"PyUnicode_Type" "PyUnicode_Type"
; From python25_s.lib(unicodectype) ; From python26_s.lib(unicodectype)
"_PyUnicode_TypeRecords" "_PyUnicode_TypeRecords"
"_PyUnicodeUCS2_ToNumeric" "_PyUnicodeUCS2_ToNumeric"
"_PyUnicodeUCS2_IsLowercase" "_PyUnicodeUCS2_IsLowercase"
@ -631,7 +655,7 @@ EXPORTS
"_PyUnicodeUCS2_IsNumeric" "_PyUnicodeUCS2_IsNumeric"
"_PyUnicodeUCS2_IsAlpha" "_PyUnicodeUCS2_IsAlpha"
; From python25_s.lib(weakrefobject) ; From python26_s.lib(weakrefobject)
"PyWeakref_NewRef" "PyWeakref_NewRef"
"PyWeakref_NewProxy" "PyWeakref_NewProxy"
"PyObject_ClearWeakRefs" "PyObject_ClearWeakRefs"
@ -642,7 +666,7 @@ EXPORTS
"_PyWeakref_ProxyType" "_PyWeakref_ProxyType"
"_PyWeakref_CallableProxyType" "_PyWeakref_CallableProxyType"
; From python25_s.lib(Python-ast) ; From python26_s.lib(Python-ast)
; "init_ast" ; "init_ast"
"Module" "Module"
"Interactive" "Interactive"
@ -701,18 +725,18 @@ EXPORTS
"alias" "alias"
"PyAST_mod2obj" "PyAST_mod2obj"
; From python25_s.lib(asdl) ; From python26_s.lib(asdl)
"asdl_seq_new" "asdl_seq_new"
"asdl_int_seq_new" "asdl_int_seq_new"
; From python25_s.lib(ast) ; From python26_s.lib(ast)
"PyAST_FromNode" "PyAST_FromNode"
; From python25_s.lib(bltinmodule) ; From python26_s.lib(bltinmodule)
"_PyBuiltin_Init" "_PyBuiltin_Init"
"Py_FileSystemDefaultEncoding" "Py_FileSystemDefaultEncoding"
; From python25_s.lib(exceptions) ; From python26_s.lib(exceptions)
"PyUnicodeEncodeError_GetStart" "PyUnicodeEncodeError_GetStart"
"PyUnicodeDecodeError_GetStart" "PyUnicodeDecodeError_GetStart"
"PyUnicodeEncodeError_GetEnd" "PyUnicodeEncodeError_GetEnd"
@ -743,6 +767,7 @@ EXPORTS
"_PyExc_Fini" "_PyExc_Fini"
"PyExc_BaseException" "PyExc_BaseException"
"PyExc_Exception" "PyExc_Exception"
"PyExc_StandardError"
"PyExc_TypeError" "PyExc_TypeError"
"PyExc_StopIteration" "PyExc_StopIteration"
"PyExc_GeneratorExit" "PyExc_GeneratorExit"
@ -787,7 +812,7 @@ EXPORTS
"PyExc_ImportWarning" "PyExc_ImportWarning"
"PyExc_MemoryErrorInst" "PyExc_MemoryErrorInst"
; From python25_s.lib(ceval) ; From python26_s.lib(ceval)
"PyEval_EvalFrameEx" "PyEval_EvalFrameEx"
"PyEval_CallObjectWithKeywords" "PyEval_CallObjectWithKeywords"
"PyEval_EvalCodeEx" "PyEval_EvalCodeEx"
@ -826,13 +851,13 @@ EXPORTS
"_Py_CheckInterval" "_Py_CheckInterval"
"_Py_Ticker" "_Py_Ticker"
; From python25_s.lib(compile) ; From python26_s.lib(compile)
"_Py_Mangle" "_Py_Mangle"
"PyAST_Compile" "PyAST_Compile"
"PyNode_Compile" "PyNode_Compile"
"Py_OptimizeFlag" "Py_OptimizeFlag"
; From python25_s.lib(codecs) ; From python26_s.lib(codecs)
"_PyCodec_Lookup" "_PyCodec_Lookup"
"PyCodec_Encode" "PyCodec_Encode"
"PyCodec_Decode" "PyCodec_Decode"
@ -851,7 +876,7 @@ EXPORTS
"PyCodec_LookupError" "PyCodec_LookupError"
"PyCodec_StrictErrors" "PyCodec_StrictErrors"
; From python25_s.lib(errors) ; From python26_s.lib(errors)
"PyErr_SetNone" "PyErr_SetNone"
"PyErr_SetString" "PyErr_SetString"
"PyErr_GivenExceptionMatches" "PyErr_GivenExceptionMatches"
@ -877,16 +902,16 @@ EXPORTS
"PyErr_Warn" "PyErr_Warn"
"PyErr_WarnExplicit" "PyErr_WarnExplicit"
; From python25_s.lib(frozen) ; From python26_s.lib(frozen)
"PyImport_FrozenModules" "PyImport_FrozenModules"
; From python25_s.lib(frozenmain) ; From python26_s.lib(frozenmain)
"Py_FrozenMain" "Py_FrozenMain"
; From python25_s.lib(future) ; From python26_s.lib(future)
"PyFuture_FromAST" "PyFuture_FromAST"
; From python25_s.lib(getargs) ; From python26_s.lib(getargs)
"PyArg_Parse" "PyArg_Parse"
"_PyArg_Parse_SizeT" "_PyArg_Parse_SizeT"
"PyArg_ParseTuple" "PyArg_ParseTuple"
@ -900,25 +925,25 @@ EXPORTS
"_PyArg_VaParse_SizeT" "_PyArg_VaParse_SizeT"
"_PyArg_VaParseTupleAndKeywords_SizeT" "_PyArg_VaParseTupleAndKeywords_SizeT"
; From python25_s.lib(getcompiler) ; From python26_s.lib(getcompiler)
"Py_GetCompiler" "Py_GetCompiler"
; From python25_s.lib(getcopyright) ; From python26_s.lib(getcopyright)
"Py_GetCopyright" "Py_GetCopyright"
; From python25_s.lib(getmtime) ; From python26_s.lib(getmtime)
"PyOS_GetLastModificationTime" "PyOS_GetLastModificationTime"
; From python25_s.lib(getplatform) ; From python26_s.lib(getplatform)
"Py_GetPlatform" "Py_GetPlatform"
; From python25_s.lib(getversion) ; From python26_s.lib(getversion)
"Py_GetVersion" "Py_GetVersion"
; From python25_s.lib(graminit) ; From python26_s.lib(graminit)
"_PyParser_Grammar" "_PyParser_Grammar"
; From python25_s.lib(import) ; From python26_s.lib(import)
"_PyImport_Init" "_PyImport_Init"
"_PyImportHooks_Init" "_PyImportHooks_Init"
"PyImport_ImportModule" "PyImport_ImportModule"
@ -945,10 +970,10 @@ EXPORTS
"PyImport_Inittab" "PyImport_Inittab"
"_PyImport_Filetab" "_PyImport_Filetab"
; From python25_s.lib(importdl) ; From python26_s.lib(importdl)
"_PyImport_LoadDynamicModule" "_PyImport_LoadDynamicModule"
; From python25_s.lib(marshal) ; From python26_s.lib(marshal)
"PyMarshal_ReadLongFromFile" "PyMarshal_ReadLongFromFile"
"PyMarshal_WriteObjectToString" "PyMarshal_WriteObjectToString"
"PyMarshal_WriteLongToFile" "PyMarshal_WriteLongToFile"
@ -959,7 +984,7 @@ EXPORTS
"PyMarshal_ReadObjectFromString" "PyMarshal_ReadObjectFromString"
"PyMarshal_Init" "PyMarshal_Init"
; From python25_s.lib(modsupport) ; From python26_s.lib(modsupport)
"Py_InitModule4" "Py_InitModule4"
"Py_BuildValue" "Py_BuildValue"
"_Py_BuildValue_SizeT" "_Py_BuildValue_SizeT"
@ -972,24 +997,24 @@ EXPORTS
"PyModule_AddStringConstant" "PyModule_AddStringConstant"
"_Py_PackageContext" "_Py_PackageContext"
; From python25_s.lib(mysnprintf) ; From python26_s.lib(mysnprintf)
"PyOS_snprintf" "PyOS_snprintf"
"PyOS_vsnprintf" "PyOS_vsnprintf"
; From python25_s.lib(mystrtoul) ; From python26_s.lib(mystrtoul)
"PyOS_strtoul" "PyOS_strtoul"
"PyOS_strtol" "PyOS_strtol"
; From python25_s.lib(pyarena) ; From python26_s.lib(pyarena)
"PyArena_New" "PyArena_New"
"PyArena_Free" "PyArena_Free"
"PyArena_Malloc" "PyArena_Malloc"
"PyArena_AddPyObject" "PyArena_AddPyObject"
; From python25_s.lib(pyfpe) ; From python26_s.lib(pyfpe)
"PyFPE_dummy" "PyFPE_dummy"
; From python25_s.lib(pystate) ; From python26_s.lib(pystate)
"PyInterpreterState_Clear" "PyInterpreterState_Clear"
"PyThreadState_Clear" "PyThreadState_Clear"
"_PyThread_CurrentFrames" "_PyThread_CurrentFrames"
@ -1014,12 +1039,12 @@ EXPORTS
"_PyThreadState_Current" "_PyThreadState_Current"
"_PyThreadState_GetFrame" "_PyThreadState_GetFrame"
; From python25_s.lib(pystrtod) ; From python26_s.lib(pystrtod)
"PyOS_ascii_strtod" "PyOS_ascii_strtod"
"PyOS_ascii_formatd" "PyOS_ascii_formatd"
"PyOS_ascii_atof" "PyOS_ascii_atof"
; From python25_s.lib(pythonrun) ; From python26_s.lib(pythonrun)
"Py_IgnoreEnvironmentFlag" "Py_IgnoreEnvironmentFlag"
"Py_DebugFlag" "Py_DebugFlag"
"Py_VerboseFlag" "Py_VerboseFlag"
@ -1081,18 +1106,20 @@ EXPORTS
"Py_UnicodeFlag" "Py_UnicodeFlag"
"_Py_QnewFlag" "_Py_QnewFlag"
; From python25_s.lib(structmember) ; From python26_s.lib(structmember)
"PyMember_Get"
"PyMember_GetOne" "PyMember_GetOne"
"PyMember_SetOne" "PyMember_SetOne"
"PyMember_Set"
; From python25_s.lib(symtable) ; From python26_s.lib(symtable)
"PySymtable_Build" "PySymtable_Build"
"PySymtable_Free" "PySymtable_Free"
"PyST_GetScope" "PyST_GetScope"
"PySymtable_Lookup" "PySymtable_Lookup"
"PySTEntry_Type" "PySTEntry_Type"
; From python25_s.lib(sysmodule) ; From python26_s.lib(sysmodule)
"_PySys_Init" "_PySys_Init"
"PySys_WriteStderr" "PySys_WriteStderr"
"PySys_SetPath" "PySys_SetPath"
@ -1106,22 +1133,22 @@ EXPORTS
"PySys_ResetWarnOptions" "PySys_ResetWarnOptions"
"PySys_AddWarnOption" "PySys_AddWarnOption"
; From python25_s.lib(traceback) ; From python26_s.lib(traceback)
"PyTraceBack_Here" "PyTraceBack_Here"
"PyTraceBack_Print" "PyTraceBack_Print"
"PyTraceBack_Type" "PyTraceBack_Type"
; From python25_s.lib(getopt) ; From python26_s.lib(getopt)
"_PyOS_GetOpt" "_PyOS_GetOpt"
"_PyOS_opterr" "_PyOS_opterr"
"_PyOS_optind" "_PyOS_optind"
"_PyOS_optarg" "_PyOS_optarg"
; From python25_s.lib(dynload_shlib) ; From python26_s.lib(dynload_shlib)
"_PyImport_DynLoadFiletab" "_PyImport_DynLoadFiletab"
"_PyImport_GetDynLoadFunc" "_PyImport_GetDynLoadFunc"
; From python25_s.lib(thread) ; From python26_s.lib(thread)
"PyThread_delete_key_value" "PyThread_delete_key_value"
"PyThread_init_thread" "PyThread_init_thread"
"PyThread_start_new_thread" "PyThread_start_new_thread"
@ -1139,7 +1166,7 @@ EXPORTS
"PyThread_get_key_value" "PyThread_get_key_value"
"PyThread__exit_thread" "PyThread__exit_thread"
; From python25_s.lib(gcmodule) ; From python26_s.lib(gcmodule)
; "initgc" ; "initgc"
"_PyObject_GC_New" "_PyObject_GC_New"
"_PyObject_GC_NewVar" "_PyObject_GC_NewVar"
@ -1155,7 +1182,7 @@ EXPORTS
"_PyObject_GC_Del" "_PyObject_GC_Del"
"_PyGC_generation0" "_PyGC_generation0"
; From python25_s.lib(signalmodule) ; From python26_s.lib(signalmodule)
; "initsignal" ; "initsignal"
"PyErr_CheckSignals" "PyErr_CheckSignals"
"PyErr_SetInterrupt" "PyErr_SetInterrupt"
@ -1164,100 +1191,124 @@ EXPORTS
"PyOS_InitInterrupts" "PyOS_InitInterrupts"
"PyOS_AfterFork" "PyOS_AfterFork"
; From python25_s.lib(posixmodule) ; From python26_s.lib(posixmodule)
; "initos2" ; "initos2"
; From python25_s.lib(threadmodule) ; From python26_s.lib(threadmodule)
; "initthread" ; "initthread"
; From python25_s.lib(arraymodule) ; From python26_s.lib(arraymodule)
; "initarray" ; "initarray"
; "array_methods" ; "array_methods"
; From python25_s.lib(binascii) ; From python26_s.lib(binascii)
; "initbinascii" ; "initbinascii"
; From python25_s.lib(cmathmodule) ; From python26_s.lib(cmathmodule)
; "initcmath" ; "initcmath"
; From python25_s.lib(_codecsmodule) ; From python26_s.lib(_codecsmodule)
; "init_codecs" ; "init_codecs"
; From python25_s.lib(collectionsmodule) ; From python26_s.lib(collectionsmodule)
; "initcollections" ; "initcollections"
"dequeiter_type" "dequeiter_type"
"dequereviter_type" "dequereviter_type"
; From python25_s.lib(cStringIO) ; From python26_s.lib(cPickle)
; "initcPickle"
; "fast_save_leave"
; From python26_s.lib(cStringIO)
; "initcStringIO" ; "initcStringIO"
; From python25_s.lib(_csv) ; From python26_s.lib(_csv)
; "init_csv" ; "init_csv"
; From python25_s.lib(datetimemodule) ; From python26_s.lib(datetimemodule)
; "initdatetime" ; "initdatetime"
; From python25_s.lib(dlmodule) ; From python26_s.lib(dlmodule)
; "initdl" ; "initdl"
; From python25_s.lib(errnomodule) ; From python26_s.lib(errnomodule)
; "initerrno" ; "initerrno"
; From python25_s.lib(fcntlmodule) ; From python26_s.lib(fcntlmodule)
; "initfcntl" ; "initfcntl"
; From python25_s.lib(_functoolsmodule) ; From python26_s.lib(_functoolsmodule)
; "init_functools" ; "init_functools"
; From python25_s.lib(_heapqmodule) ; From python26_s.lib(_heapqmodule)
; "init_heapq" ; "init_heapq"
; From python25_s.lib(imageop) ; From python26_s.lib(imageop)
; "initimageop" ; "initimageop"
; From python25_s.lib(itertoolsmodule) ; From python26_s.lib(itertoolsmodule)
; "inititertools" ; "inititertools"
; From python25_s.lib(_localemodule) ; From python26_s.lib(_localemodule)
; "init_locale" ; "init_locale"
; From python25_s.lib(mathmodule) ; From python26_s.lib(mathmodule)
; "initmath" ; "initmath"
; From python25_s.lib(operator) ; From python26_s.lib(md5)
"md5_finish"
"md5_init"
"md5_append"
; From python26_s.lib(md5module)
; "init_md5"
; From python26_s.lib(operator)
; "initoperator" ; "initoperator"
; From python25_s.lib(_randommodule) ; From python26_s.lib(_randommodule)
; "init_random" ; "init_random"
; From python25_s.lib(sha256module) ; From python26_s.lib(rgbimgmodule)
; "initrgbimg"
; From python26_s.lib(shamodule)
; "init_sha"
; From python26_s.lib(sha256module)
; "init_sha256" ; "init_sha256"
; From python25_s.lib(sha512module) ; From python26_s.lib(sha512module)
; "init_sha512" ; "init_sha512"
; From python25_s.lib(_sre) ; From python26_s.lib(_sre)
; "init_sre" ; "init_sre"
; From python25_s.lib(_struct) ; From python26_s.lib(stropmodule)
; "initstrop"
; From python26_s.lib(_struct)
; "init_struct" ; "init_struct"
; From python25_s.lib(symtablemodule) ; From python26_s.lib(symtablemodule)
; "init_symtable" ; "init_symtable"
; From python25_s.lib(termios) ; From python26_s.lib(termios)
; "inittermios" ; "inittermios"
; From python25_s.lib(timemodule) ; From python26_s.lib(timemodule)
; "inittime" ; "inittime"
"_PyTime_DoubleToTimet" "_PyTime_DoubleToTimet"
; "inittimezone" ; "inittimezone"
; From python25_s.lib(_weakref) ; From python26_s.lib(timingmodule)
; "inittiming"
; From python26_s.lib(_weakref)
; "init_weakref" ; "init_weakref"
; From python25_s.lib(xxsubtype) ; From python26_s.lib(xxsubtype)
; "initxxsubtype" ; "initxxsubtype"
; From python25_s.lib(zipimport) ; From python26_s.lib(zipimport)
; "initzipimport" ; "initzipimport"

View File

@ -52,7 +52,7 @@
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Debug\libdb44sd.lib exit 0&#x0D;&#x0A;devenv Berkeley_DB.sln /build Debug /project db_static&#x0D;&#x0A;" CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Debug\libdb44sd.lib exit 0&#x0D;&#x0A;vcbuild /useenv db_static.vcproj &quot;Debug|Win32&quot;&#x0D;&#x0A;"
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
@ -115,7 +115,7 @@
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Debug_AMD64\libdb44sd.lib exit 0&#x0D;&#x0A;devenv Berkeley_DB.sln /build &quot;Debug AMD64&quot; /project db_static /useenv&#x0D;&#x0A;" CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Debug_AMD64\libdb44sd.lib exit 0&#x0D;&#x0A;vcbuild /useenv db_static.vcproj &quot;Debug AMD64|Win32&quot;&#x0D;&#x0A;"
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
@ -178,7 +178,7 @@
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Release\libdb44s.lib exit 0&#x0D;&#x0A;devenv Berkeley_DB.sln /build Release /project db_static&#x0D;&#x0A;" CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Release\libdb44s.lib exit 0&#x0D;&#x0A;vcbuild /useenv db_static.vcproj &quot;Release|Win32&quot;&#x0D;&#x0A;"
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
@ -242,7 +242,7 @@
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Release_AMD64\libdb44s.lib exit 0&#x0D;&#x0A;devenv Berkeley_DB.sln /build &quot;Release AMD64&quot; /project db_static /useenv&#x0D;&#x0A;" CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Release_AMD64\libdb44s.lib exit 0&#x0D;&#x0A;vcbuild /useenv db_static.vcproj &quot;Release AMD64|Win32&quot;&#x0D;&#x0A;"
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
@ -305,7 +305,7 @@
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Release\libdb44s.lib exit 0&#x0D;&#x0A;devenv Berkeley_DB.sln /build Release /project db_static&#x0D;&#x0A;" CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Release\libdb44s.lib exit 0&#x0D;&#x0A;vcbuild /useenv db_static.vcproj &quot;Release|Win32&quot;&#x0D;&#x0A;"
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
@ -369,7 +369,7 @@
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Release_AMD64\libdb44s.lib exit 0&#x0D;&#x0A;devenv Berkeley_DB.sln /build &quot;Release AMD64&quot; /project db_static /useenv&#x0D;&#x0A;" CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Release_AMD64\libdb44s.lib exit 0&#x0D;&#x0A;vcbuild /useenv db_static.vcproj &quot;Release AMD64|Win32&quot;&#x0D;&#x0A;"
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
@ -433,7 +433,7 @@
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Release\libdb44s.lib exit 0&#x0D;&#x0A;devenv Berkeley_DB.sln /build Release /project db_static&#x0D;&#x0A;" CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Release\libdb44s.lib exit 0&#x0D;&#x0A;vcbuild /useenv db_static.vcproj &quot;Release|Win32&quot;&#x0D;&#x0A;"
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
@ -497,7 +497,7 @@
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Release_AMD64\libdb44s.lib exit 0&#x0D;&#x0A;devenv Berkeley_DB.sln /build &quot;Release AMD64&quot; /project db_static /useenv&#x0D;&#x0A;" CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Release_AMD64\libdb44s.lib exit 0&#x0D;&#x0A;vcbuild /useenv db_static.vcproj &quot;Release AMD64|Win32&quot;&#x0D;&#x0A;"
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"

View File

@ -12,6 +12,6 @@ if "%1"=="-c" (set conf=%2) & shift & shift & goto CheckOpts
if "%1"=="-p" (set platf=%2) & shift & shift & goto CheckOpts if "%1"=="-p" (set platf=%2) & shift & shift & goto CheckOpts
if "%1"=="-r" (set build=/rebuild) & shift & goto CheckOpts if "%1"=="-r" (set build=/rebuild) & shift & goto CheckOpts
set cmd=devenv pcbuild.sln %build% "%conf%|%platf%" set cmd=vcbuild /useenv pcbuild.sln %build% "%conf%|%platf%"
echo %cmd% echo %cmd%
%cmd% %cmd%

View File

@ -23,7 +23,6 @@ Solution" or F6 takes care of dependencies except for x64 builds. To make
cross compiling x64 builds on a 32bit OS possible the x64 builds require a cross compiling x64 builds on a 32bit OS possible the x64 builds require a
32bit version of Python. 32bit version of Python.
NOTE: NOTE:
You probably don't want to build most of the other subprojects, unless You probably don't want to build most of the other subprojects, unless
you're building an entire Python distribution from scratch, or you're building an entire Python distribution from scratch, or
@ -192,10 +191,11 @@ _bsddb
svn export http://svn.python.org/projects/external/db-4.4.20 svn export http://svn.python.org/projects/external/db-4.4.20
Next open the solution file db-4.4.20\build_win32\Berkeley_DB.sln with Next open the solution file db-4.4.20\build_win32\Berkeley_DB.sln with
Visual Studio and convert the projects to the new format. The standard Visual Studio and convert the projects to the new format. VS 2008
and professional version of VS 2008 builds the necessary libraries builds the necessary libraries in a pre-link step of _bsddb. You
in a pre-link step of _bsddb. However the express edition is missing have to add "$(VCInstallDir)vcpackages" to the search path first
some pieces and you have to build the libs yourself. (Tools -> Options -> Projects and Solutions -> VC++ Directories,
Platform: Win32, Show directories for: Executable files).
The _bsddb subprojects depends only on the db_static project of The _bsddb subprojects depends only on the db_static project of
Berkeley DB. You have to choose either "Release", "Release AMD64", "Debug" Berkeley DB. You have to choose either "Release", "Release AMD64", "Debug"

4
configure vendored
View File

@ -1,5 +1,5 @@
#! /bin/sh #! /bin/sh
# From configure.in Revision: 60476 . # From configure.in Revision: 60489 .
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.61 for python 3.0. # Generated by GNU Autoconf 2.61 for python 3.0.
# #
@ -1312,7 +1312,7 @@ Optional Features:
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--enable-universalsdk[SDKDIR] --enable-universalsdk[SDKDIR]
Build agains Mac OS X 10.4u SDK (ppc/i386) Build against Mac OS X 10.4u SDK (ppc/i386)
--enable-framework[=INSTALLDIR] --enable-framework[=INSTALLDIR]
Build (MacOSX|Darwin) framework Build (MacOSX|Darwin) framework
--enable-shared disable/enable building shared python library --enable-shared disable/enable building shared python library

View File

@ -61,7 +61,7 @@ AC_SUBST(CONFIG_ARGS)
CONFIG_ARGS="$ac_configure_args" CONFIG_ARGS="$ac_configure_args"
AC_ARG_ENABLE(universalsdk, AC_ARG_ENABLE(universalsdk,
AC_HELP_STRING(--enable-universalsdk@<:@SDKDIR@:>@, Build agains Mac OS X 10.4u SDK (ppc/i386)), AC_HELP_STRING(--enable-universalsdk@<:@SDKDIR@:>@, Build against Mac OS X 10.4u SDK (ppc/i386)),
[ [
case $enableval in case $enableval in
yes) yes)

View File

@ -327,7 +327,7 @@ class PyBuildExt(build_ext):
parser.add_option(arg_name, dest="dirs", action="append") parser.add_option(arg_name, dest="dirs", action="append")
options = parser.parse_args(env_val.split())[0] options = parser.parse_args(env_val.split())[0]
if options.dirs: if options.dirs:
for directory in options.dirs: for directory in reversed(options.dirs):
add_dir_to_list(dir_list, directory) add_dir_to_list(dir_list, directory)
if os.path.normpath(sys.prefix) != '/usr': if os.path.normpath(sys.prefix) != '/usr':
@ -698,10 +698,10 @@ class PyBuildExt(build_ext):
for dn in inc_dirs: for dn in inc_dirs:
std_variants.append(os.path.join(dn, 'db3')) std_variants.append(os.path.join(dn, 'db3'))
std_variants.append(os.path.join(dn, 'db4')) std_variants.append(os.path.join(dn, 'db4'))
for x in (0,1,2,3,4,5,6): for x in range(max_db_ver[1]+1):
std_variants.append(os.path.join(dn, "db4%d"%x)) std_variants.append(os.path.join(dn, "db4%d"%x))
std_variants.append(os.path.join(dn, "db4.%d"%x)) std_variants.append(os.path.join(dn, "db4.%d"%x))
for x in (2,3): for x in (3,):
std_variants.append(os.path.join(dn, "db3%d"%x)) std_variants.append(os.path.join(dn, "db3%d"%x))
std_variants.append(os.path.join(dn, "db3.%d"%x)) std_variants.append(os.path.join(dn, "db3.%d"%x))