Commit 8ce8a784 authored by Guido van Rossum's avatar Guido van Rossum

Merged revisions 58221-58741 via svnmerge from

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

........
  r58221 | georg.brandl | 2007-09-20 10:57:59 -0700 (Thu, 20 Sep 2007) | 2 lines

  Patch #1181: add os.environ.clear() method.
........
  r58225 | sean.reifschneider | 2007-09-20 23:33:28 -0700 (Thu, 20 Sep 2007) | 3 lines

  Issue1704287: "make install" fails unless you do "make" first.  Make
     oldsharedmods and sharedmods in "libinstall".
........
  r58232 | guido.van.rossum | 2007-09-22 13:18:03 -0700 (Sat, 22 Sep 2007) | 4 lines

  Patch # 188 by Philip Jenvey.
  Make tell() mark CRLF as a newline.
  With unit test.
........
  r58242 | georg.brandl | 2007-09-24 10:55:47 -0700 (Mon, 24 Sep 2007) | 2 lines

  Fix typo and double word.
........
  r58245 | georg.brandl | 2007-09-24 10:59:28 -0700 (Mon, 24 Sep 2007) | 2 lines

  #1196: document default radix for int().
........
  r58247 | georg.brandl | 2007-09-24 11:08:24 -0700 (Mon, 24 Sep 2007) | 2 lines

  #1177: accept 2xx responses for https too, not only http.
........
  r58249 | andrew.kuchling | 2007-09-24 16:45:51 -0700 (Mon, 24 Sep 2007) | 1 line

  Remove stray odd character; grammar fix
........
  r58250 | andrew.kuchling | 2007-09-24 16:46:28 -0700 (Mon, 24 Sep 2007) | 1 line

  Typo fix
........
  r58251 | andrew.kuchling | 2007-09-24 17:09:42 -0700 (Mon, 24 Sep 2007) | 1 line

  Add various items
........
  r58268 | vinay.sajip | 2007-09-26 22:34:45 -0700 (Wed, 26 Sep 2007) | 1 line

  Change to flush and close logic to fix #1760556.
........
  r58269 | vinay.sajip | 2007-09-26 22:38:51 -0700 (Wed, 26 Sep 2007) | 1 line

  Change to basicConfig() to fix #1021.
........
  r58270 | georg.brandl | 2007-09-26 23:26:58 -0700 (Wed, 26 Sep 2007) | 2 lines

  #1208: document match object's boolean value.
........
  r58271 | vinay.sajip | 2007-09-26 23:56:13 -0700 (Wed, 26 Sep 2007) | 1 line

  Minor date change.
........
  r58272 | vinay.sajip | 2007-09-27 00:35:10 -0700 (Thu, 27 Sep 2007) | 1 line

  Change to LogRecord.__init__() to fix #1206. Note that archaic use of type(x) == types.DictType is because of keeping 1.5.2 compatibility. While this is much less relevant these days, there probably needs to be a separate commit for removing all archaic constructs at the same time.
........
  r58288 | brett.cannon | 2007-09-30 12:45:10 -0700 (Sun, 30 Sep 2007) | 9 lines

  tuple.__repr__ did not consider a reference loop as it is not possible from
  Python code; but it is possible from C.  object.__str__ had the issue of not
  expecting a type to doing something within it's tp_str implementation that
  could trigger an infinite recursion, but it could in C code..  Both found
  thanks to BaseException and how it handles its repr.

  Closes issue #1686386.  Thanks to Thomas Herve for taking an initial stab at
  coming up with a solution.
........
  r58289 | brett.cannon | 2007-09-30 13:37:19 -0700 (Sun, 30 Sep 2007) | 3 lines

  Fix error introduced by r58288; if a tuple is length 0 return its repr and
  don't worry about any self-referring tuples.
........
  r58294 | facundo.batista | 2007-10-02 10:01:24 -0700 (Tue, 02 Oct 2007) | 11 lines


  Made the various is_* operations return booleans.  This was discussed
  with Cawlishaw by mail, and he basically confirmed that to these is_*
  operations, there's no need to return Decimal(0) and Decimal(1) if
  the language supports the False and True booleans.

  Also added a few tests for the these functions in extra.decTest, since
  they are mostly untested (apart from the doctests).

  Thanks Mark Dickinson
........
  r58295 | facundo.batista | 2007-10-02 11:21:18 -0700 (Tue, 02 Oct 2007) | 4 lines


  Added a class to store the digits of log(10), so that they can be made
  available when necessary without recomputing.  Thanks Mark Dickinson
........
  r58299 | mark.summerfield | 2007-10-03 01:53:21 -0700 (Wed, 03 Oct 2007) | 4 lines

  Added note in footnote about string comparisons about
  unicodedata.normalize().
........
  r58304 | raymond.hettinger | 2007-10-03 14:18:11 -0700 (Wed, 03 Oct 2007) | 1 line

  enumerate() is no longer bounded to using sequences shorter than LONG_MAX.  The possibility of overflow was sending some newsgroup posters into a tizzy.
........
  r58305 | raymond.hettinger | 2007-10-03 17:20:27 -0700 (Wed, 03 Oct 2007) | 1 line

  itertools.count() no longer limited to sys.maxint.
........
  r58306 | kurt.kaiser | 2007-10-03 18:49:54 -0700 (Wed, 03 Oct 2007) | 3 lines

  Assume that the user knows when he wants to end the line; don't insert
  something he didn't select or complete.
........
  r58307 | kurt.kaiser | 2007-10-03 19:07:50 -0700 (Wed, 03 Oct 2007) | 2 lines

  Remove unused theme that was causing a fault in p3k.
........
  r58308 | kurt.kaiser | 2007-10-03 19:09:17 -0700 (Wed, 03 Oct 2007) | 2 lines

  Clean up EditorWindow close.
........
  r58309 | kurt.kaiser | 2007-10-03 19:53:07 -0700 (Wed, 03 Oct 2007) | 7 lines

  textView cleanup. Patch 1718043 Tal Einat.

  M    idlelib/EditorWindow.py
  M    idlelib/aboutDialog.py
  M    idlelib/textView.py
  M    idlelib/NEWS.txt
........
  r58310 | kurt.kaiser | 2007-10-03 20:11:12 -0700 (Wed, 03 Oct 2007) | 3 lines

  configDialog cleanup. Patch 1730217 Tal Einat.
........
  r58311 | neal.norwitz | 2007-10-03 23:00:48 -0700 (Wed, 03 Oct 2007) | 4 lines

  Coverity #151: Remove deadcode.

  All this code already exists above starting at line 653.
........
  r58325 | fred.drake | 2007-10-04 19:46:12 -0700 (Thu, 04 Oct 2007) | 1 line

  wrap lines to <80 characters before fixing errors
........
  r58326 | raymond.hettinger | 2007-10-04 19:47:07 -0700 (Thu, 04 Oct 2007) | 6 lines

  Add __asdict__() to NamedTuple and refine the docs.
  Add maxlen support to deque() and fixup docs.
  Partially fix __reduce__().  The None as a third arg was no longer supported.
  Still needs work on __reduce__() to handle recursive inputs.
........
  r58327 | fred.drake | 2007-10-04 19:48:32 -0700 (Thu, 04 Oct 2007) | 3 lines

  move descriptions of ac_(in|out)_buffer_size to the right place
  http://bugs.python.org/issue1053
........
  r58329 | neal.norwitz | 2007-10-04 20:39:17 -0700 (Thu, 04 Oct 2007) | 3 lines

  dict could be NULL, so we need to XDECREF.
  Fix a compiler warning about passing a PyTypeObject* instead of PyObject*.
........
  r58330 | neal.norwitz | 2007-10-04 20:41:19 -0700 (Thu, 04 Oct 2007) | 2 lines

  Fix Coverity #158: Check the correct variable.
........
  r58332 | neal.norwitz | 2007-10-04 22:01:38 -0700 (Thu, 04 Oct 2007) | 7 lines

  Fix Coverity #159.

  This code was broken if save() returned a negative number since i contained
  a boolean value and then we compared i < 0 which should never be true.

  Will backport (assuming it's necessary)
........
  r58334 | neal.norwitz | 2007-10-04 22:29:17 -0700 (Thu, 04 Oct 2007) | 1 line

  Add a note about fixing some more warnings found by Coverity.
........
  r58338 | raymond.hettinger | 2007-10-05 12:07:31 -0700 (Fri, 05 Oct 2007) | 1 line

  Restore BEGIN/END THREADS macros which were squashed in the previous checkin
........
  r58343 | gregory.p.smith | 2007-10-06 00:48:10 -0700 (Sat, 06 Oct 2007) | 3 lines

  Stab in the dark attempt to fix the test_bsddb3 failure on sparc and S-390
  ubuntu buildbots.
........
  r58344 | gregory.p.smith | 2007-10-06 00:51:59 -0700 (Sat, 06 Oct 2007) | 2 lines

  Allows BerkeleyDB 4.6.x >= 4.6.21 for the bsddb module.
........
  r58348 | gregory.p.smith | 2007-10-06 08:47:37 -0700 (Sat, 06 Oct 2007) | 3 lines

  Use the host the author likely meant in the first place.  pop.gmail.com is
  reliable.  gmail.org is someones personal domain.
........
  r58351 | neal.norwitz | 2007-10-06 12:16:28 -0700 (Sat, 06 Oct 2007) | 3 lines

  Ensure that this test will pass even if another test left an unwritable TESTFN.
  Also use the safe unlink in test_support instead of rolling our own here.
........
  r58368 | georg.brandl | 2007-10-08 00:50:24 -0700 (Mon, 08 Oct 2007) | 3 lines

  #1123: fix the docs for the str.split(None, sep) case.
  Also expand a few other methods' docs, which had more info in the deprecated string module docs.
........
  r58369 | georg.brandl | 2007-10-08 01:06:05 -0700 (Mon, 08 Oct 2007) | 2 lines

  Update docstring of sched, also remove an unused assignment.
........
  r58370 | raymond.hettinger | 2007-10-08 02:14:28 -0700 (Mon, 08 Oct 2007) | 5 lines

  Add comments to NamedTuple code.
  Let the field spec be either a string or a non-string sequence (suggested by Martin Blais with use cases).
  Improve the error message in the case of a SyntaxError (caused by a duplicate field name).
........
  r58371 | raymond.hettinger | 2007-10-08 02:56:29 -0700 (Mon, 08 Oct 2007) | 1 line

  Missed a line in the docs
........
  r58372 | raymond.hettinger | 2007-10-08 03:11:51 -0700 (Mon, 08 Oct 2007) | 1 line

  Better variable names
........
  r58376 | georg.brandl | 2007-10-08 07:12:47 -0700 (Mon, 08 Oct 2007) | 3 lines

  #1199: docs for tp_as_{number,sequence,mapping}, by Amaury Forgeot d'Arc.
  No need to merge this to py3k!
........
  r58380 | raymond.hettinger | 2007-10-08 14:26:58 -0700 (Mon, 08 Oct 2007) | 1 line

  Eliminate camelcase function name
........
  r58381 | andrew.kuchling | 2007-10-08 16:23:03 -0700 (Mon, 08 Oct 2007) | 1 line

  Eliminate camelcase function name
........
  r58382 | raymond.hettinger | 2007-10-08 18:36:23 -0700 (Mon, 08 Oct 2007) | 1 line

  Make the error messages more specific
........
  r58384 | gregory.p.smith | 2007-10-08 23:02:21 -0700 (Mon, 08 Oct 2007) | 10 lines

  Splits Modules/_bsddb.c up into bsddb.h and _bsddb.c and adds a C API
  object available as bsddb.db.api.  This is based on the patch submitted
  by Duncan Grisby here:
    http://sourceforge.net/tracker/index.php?func=detail&aid=1551895&group_id=13900&atid=313900
  See this thread for additional info:
    http://sourceforge.net/mailarchive/forum.php?thread_name=E1GAVDK-0002rk-Iw%40apasphere.com&forum_name=pybsddb-users

  It also cleans up the code a little by removing some ifdef/endifs for
  python prior to 2.1 and for unsupported Berkeley DB <= 3.2.
........
  r58385 | gregory.p.smith | 2007-10-08 23:50:43 -0700 (Mon, 08 Oct 2007) | 5 lines

  Fix a double free when positioning a database cursor to a non-existant
  string key (and probably a few other situations with string keys).
  This was reported with a patch as pybsddb sourceforge bug 1708868 by
  jjjhhhlll at gmail.
........
  r58386 | gregory.p.smith | 2007-10-09 00:19:11 -0700 (Tue, 09 Oct 2007) | 3 lines

  Use the highest cPickle protocol in bsddb.dbshelve.  This comes from
  sourceforge pybsddb patch 1551443 by w_barnes.
........
  r58394 | gregory.p.smith | 2007-10-09 11:26:02 -0700 (Tue, 09 Oct 2007) | 2 lines

  remove another sleepycat reference
........
  r58396 | kurt.kaiser | 2007-10-09 12:31:30 -0700 (Tue, 09 Oct 2007) | 3 lines

  Allow interrupt only when executing user code in subprocess
  Patch 1225 Tal Einat modified from IDLE-Spoon.
........
  r58399 | brett.cannon | 2007-10-09 17:07:50 -0700 (Tue, 09 Oct 2007) | 5 lines

  Remove file-level typedefs that were inconsistently used throughout the file.
  Just move over to the public API names.

  Closes issue1238.
........
  r58401 | raymond.hettinger | 2007-10-09 17:26:46 -0700 (Tue, 09 Oct 2007) | 1 line

  Accept Jim Jewett's api suggestion to use None instead of -1 to indicate unbounded deques.
........
  r58403 | kurt.kaiser | 2007-10-09 17:55:40 -0700 (Tue, 09 Oct 2007) | 2 lines

  Allow cursor color change w/o restart. Patch 1725576 Tal Einat.
........
  r58404 | kurt.kaiser | 2007-10-09 18:06:47 -0700 (Tue, 09 Oct 2007) | 2 lines

  show paste if > 80 columns.  Patch 1659326 Tal Einat.
........
  r58415 | thomas.heller | 2007-10-11 12:51:32 -0700 (Thu, 11 Oct 2007) | 5 lines

  On OS X, use os.uname() instead of gestalt.sysv(...) to get the
  operating system version.  This allows to use ctypes when Python
  was configured with --disable-toolbox-glue.
........
  r58419 | neal.norwitz | 2007-10-11 20:01:01 -0700 (Thu, 11 Oct 2007) | 1 line

  Get rid of warning about not being able to create an existing directory.
........
  r58420 | neal.norwitz | 2007-10-11 20:01:30 -0700 (Thu, 11 Oct 2007) | 1 line

  Get rid of warnings on a bunch of platforms by using a proper prototype.
........
  r58421 | neal.norwitz | 2007-10-11 20:01:54 -0700 (Thu, 11 Oct 2007) | 4 lines

  Get rid of compiler warning about retval being used (returned) without
  being initialized.  (gcc warning and Coverity 202)
........
  r58422 | neal.norwitz | 2007-10-11 20:03:23 -0700 (Thu, 11 Oct 2007) | 1 line

  Fix Coverity 168:  Close the file before returning (exiting).
........
  r58423 | neal.norwitz | 2007-10-11 20:04:18 -0700 (Thu, 11 Oct 2007) | 4 lines

  Fix Coverity 180:  Don't overallocate.  We don't need structs, but pointers.
  Also fix a memory leak.
........
  r58424 | neal.norwitz | 2007-10-11 20:05:19 -0700 (Thu, 11 Oct 2007) | 5 lines

  Fix Coverity 185-186:  If the passed in FILE is NULL, uninitialized memory
  would be accessed.

  Will backport.
........
  r58425 | neal.norwitz | 2007-10-11 20:52:34 -0700 (Thu, 11 Oct 2007) | 1 line

  Get this module to compile with bsddb versions prior to 4.3
........
  r58430 | martin.v.loewis | 2007-10-12 01:56:52 -0700 (Fri, 12 Oct 2007) | 3 lines

  Bug #1216: Restore support for Visual Studio 2002.
  Will backport to 2.5.
........
  r58433 | raymond.hettinger | 2007-10-12 10:53:11 -0700 (Fri, 12 Oct 2007) | 1 line

  Fix test of count.__repr__() to ignore the 'L' if the count is a long
........
  r58434 | gregory.p.smith | 2007-10-12 11:44:06 -0700 (Fri, 12 Oct 2007) | 4 lines

  Fixes http://bugs.python.org/issue1233 - bsddb.dbshelve.DBShelf.append
  was useless due to inverted logic.  Also adds a test case for RECNO dbs
  to test_dbshelve.
........
  r58445 | georg.brandl | 2007-10-13 06:20:03 -0700 (Sat, 13 Oct 2007) | 2 lines

  Fix email example.
........
  r58450 | gregory.p.smith | 2007-10-13 16:02:05 -0700 (Sat, 13 Oct 2007) | 2 lines

  Fix an uncollectable reference leak in bsddb.db.DBShelf.append
........
  r58453 | neal.norwitz | 2007-10-13 17:18:40 -0700 (Sat, 13 Oct 2007) | 8 lines

  Let the O/S supply a port if none of the default ports can be used.
  This should make the tests more robust at the expense of allowing
  tests to be sloppier by not requiring them to cleanup after themselves.
  (It will legitamitely help when running two test suites simultaneously
  or if another process is already using one of the predefined ports.)

  Also simplifies (slightLy) the exception handling elsewhere.
........
  r58459 | neal.norwitz | 2007-10-14 11:30:21 -0700 (Sun, 14 Oct 2007) | 2 lines

  Don't raise a string exception, they don't work anymore.
........
  r58460 | neal.norwitz | 2007-10-14 11:40:37 -0700 (Sun, 14 Oct 2007) | 1 line

  Use unittest for assertions
........
  r58468 | armin.rigo | 2007-10-15 00:48:35 -0700 (Mon, 15 Oct 2007) | 2 lines

  test_bigbits was not testing what it seemed to.
........
  r58471 | guido.van.rossum | 2007-10-15 08:54:11 -0700 (Mon, 15 Oct 2007) | 3 lines

  Change a PyErr_Print() into a PyErr_Clear(),
  per discussion in issue 1031213.
........
  r58500 | raymond.hettinger | 2007-10-16 12:18:30 -0700 (Tue, 16 Oct 2007) | 1 line

  Improve error messages
........
  r58506 | raymond.hettinger | 2007-10-16 14:28:32 -0700 (Tue, 16 Oct 2007) | 1 line

  More docs, error messages, and tests
........
  r58507 | andrew.kuchling | 2007-10-16 15:58:03 -0700 (Tue, 16 Oct 2007) | 1 line

  Add items
........
  r58508 | brett.cannon | 2007-10-16 16:24:06 -0700 (Tue, 16 Oct 2007) | 3 lines

  Remove ``:const:`` notation on None in parameter list.  Since the markup is not
  rendered for parameters it just showed up as ``:const:`None` `` in the output.
........
  r58509 | brett.cannon | 2007-10-16 16:26:45 -0700 (Tue, 16 Oct 2007) | 3 lines

  Re-order some functions whose parameters differ between PyObject and const char
  * so that they are next to each other.
........
  r58522 | armin.rigo | 2007-10-17 11:46:37 -0700 (Wed, 17 Oct 2007) | 5 lines

  Fix the overflow checking of list_repeat.
  Introduce overflow checking into list_inplace_repeat.

  Backport candidate, possibly.
........
  r58530 | facundo.batista | 2007-10-17 20:16:03 -0700 (Wed, 17 Oct 2007) | 7 lines


  Issue #1580738.  When HTTPConnection reads the whole stream with read(),
  it closes itself.  When the stream is read in several calls to read(n),
  it should behave in the same way if HTTPConnection knows where the end
  of the stream is (through self.length).  Added a test case for this
  behaviour.
........
  r58531 | facundo.batista | 2007-10-17 20:44:48 -0700 (Wed, 17 Oct 2007) | 3 lines


  Issue 1289, just a typo.
........
  r58532 | gregory.p.smith | 2007-10-18 00:56:54 -0700 (Thu, 18 Oct 2007) | 4 lines

  cleanup test_dbtables to use mkdtemp.  cleanup dbtables to pass txn as a
  keyword argument whenever possible to avoid bugs and confusion.  (dbtables.py
  line 447 self.db.get using txn as a non-keyword was an actual bug due to this)
........
  r58533 | gregory.p.smith | 2007-10-18 01:34:20 -0700 (Thu, 18 Oct 2007) | 4 lines

  Fix a weird bug in dbtables: if it chose a random rowid string that contained
  NULL bytes it would cause the database all sorts of problems in the future
  leading to very strange random failures and corrupt dbtables.bsdTableDb dbs.
........
  r58534 | gregory.p.smith | 2007-10-18 09:32:02 -0700 (Thu, 18 Oct 2007) | 3 lines

  A cleaner fix than the one committed last night.  Generate random rowids that
  do not contain null bytes.
........
  r58537 | gregory.p.smith | 2007-10-18 10:17:57 -0700 (Thu, 18 Oct 2007) | 2 lines

  mention bsddb fixes.
........
  r58538 | raymond.hettinger | 2007-10-18 14:13:06 -0700 (Thu, 18 Oct 2007) | 1 line

  Remove useless warning
........
  r58539 | gregory.p.smith | 2007-10-19 00:31:20 -0700 (Fri, 19 Oct 2007) | 2 lines

  squelch the warning that this test is supposed to trigger.
........
  r58542 | georg.brandl | 2007-10-19 05:32:39 -0700 (Fri, 19 Oct 2007) | 2 lines

  Clarify wording for apply().
........
  r58544 | mark.summerfield | 2007-10-19 05:48:17 -0700 (Fri, 19 Oct 2007) | 3 lines

  Added a cross-ref to each other.
........
  r58545 | georg.brandl | 2007-10-19 10:38:49 -0700 (Fri, 19 Oct 2007) | 2 lines

  #1284: "S" means "seen", not unread.
........
  r58548 | thomas.heller | 2007-10-19 11:11:41 -0700 (Fri, 19 Oct 2007) | 4 lines

  Fix ctypes on 32-bit systems when Python is configured --with-system-ffi.
  See also https://bugs.launchpad.net/bugs/72505.

  Ported from release25-maint branch.
........
  r58550 | facundo.batista | 2007-10-19 12:25:57 -0700 (Fri, 19 Oct 2007) | 8 lines


  The constructor from tuple was way too permissive: it allowed bad
  coefficient numbers, floats in the sign, and other details that
  generated directly the wrong number in the best case, or triggered
  misfunctionality in the alorithms.

  Test cases added for these issues. Thanks Mark Dickinson.
........
  r58559 | georg.brandl | 2007-10-20 06:22:53 -0700 (Sat, 20 Oct 2007) | 2 lines

  Fix code being interpreted as a target.
........
  r58561 | georg.brandl | 2007-10-20 06:36:24 -0700 (Sat, 20 Oct 2007) | 2 lines

  Document new "cmdoption" directive.
........
  r58562 | georg.brandl | 2007-10-20 08:21:22 -0700 (Sat, 20 Oct 2007) | 2 lines

  Make a path more Unix-standardy.
........
  r58564 | georg.brandl | 2007-10-20 10:51:39 -0700 (Sat, 20 Oct 2007) | 2 lines

  Document new directive "envvar".
........
  r58567 | georg.brandl | 2007-10-20 11:08:14 -0700 (Sat, 20 Oct 2007) | 6 lines

  * Add new toplevel chapter, "Using Python." (how to install,
    configure and setup python on different platforms -- at least
    in theory.)
  * Move the Python on Mac docs in that chapter.
  * Add a new chapter about the command line invocation, by stargaming.
........
  r58568 | georg.brandl | 2007-10-20 11:33:20 -0700 (Sat, 20 Oct 2007) | 2 lines

  Change title, for now.
........
  r58569 | georg.brandl | 2007-10-20 11:39:25 -0700 (Sat, 20 Oct 2007) | 2 lines

  Add entry to ACKS.
........
  r58570 | georg.brandl | 2007-10-20 12:05:45 -0700 (Sat, 20 Oct 2007) | 2 lines

  Clarify -E docs.
........
  r58571 | georg.brandl | 2007-10-20 12:08:36 -0700 (Sat, 20 Oct 2007) | 2 lines

  Even more clarification.
........
  r58572 | andrew.kuchling | 2007-10-20 12:25:37 -0700 (Sat, 20 Oct 2007) | 1 line

  Fix protocol name
........
  r58573 | andrew.kuchling | 2007-10-20 12:35:18 -0700 (Sat, 20 Oct 2007) | 1 line

  Various items
........
  r58574 | andrew.kuchling | 2007-10-20 12:39:35 -0700 (Sat, 20 Oct 2007) | 1 line

  Use correct header line
........
  r58576 | armin.rigo | 2007-10-21 02:14:15 -0700 (Sun, 21 Oct 2007) | 3 lines

  Add a crasher for the long-standing issue with closing a file
  while another thread uses it.
........
  r58577 | georg.brandl | 2007-10-21 03:01:56 -0700 (Sun, 21 Oct 2007) | 2 lines

  Remove duplicate crasher.
........
  r58578 | georg.brandl | 2007-10-21 03:24:20 -0700 (Sun, 21 Oct 2007) | 2 lines

  Unify "byte code" to "bytecode". Also sprinkle :term: markup for it.
........
  r58579 | georg.brandl | 2007-10-21 03:32:54 -0700 (Sun, 21 Oct 2007) | 2 lines

  Add markup to new function descriptions.
........
  r58580 | georg.brandl | 2007-10-21 03:45:46 -0700 (Sun, 21 Oct 2007) | 2 lines

  Add :term:s for descriptors.
........
  r58581 | georg.brandl | 2007-10-21 03:46:24 -0700 (Sun, 21 Oct 2007) | 2 lines

  Unify "file-descriptor" to "file descriptor".
........
  r58582 | georg.brandl | 2007-10-21 03:52:38 -0700 (Sun, 21 Oct 2007) | 2 lines

  Add :term: for generators.
........
  r58583 | georg.brandl | 2007-10-21 05:10:28 -0700 (Sun, 21 Oct 2007) | 2 lines

  Add :term:s for iterator.
........
  r58584 | georg.brandl | 2007-10-21 05:15:05 -0700 (Sun, 21 Oct 2007) | 2 lines

  Add :term:s for "new-style class".
........
  r58588 | neal.norwitz | 2007-10-21 21:47:54 -0700 (Sun, 21 Oct 2007) | 1 line

  Add Chris Monson so he can edit PEPs.
........
  r58594 | guido.van.rossum | 2007-10-22 09:27:19 -0700 (Mon, 22 Oct 2007) | 4 lines

  Issue #1307, patch by Derek Shockey.
  When "MAIL" is received without args, an exception happens instead of
  sending a 501 syntax error response.
........
  r58598 | travis.oliphant | 2007-10-22 19:40:56 -0700 (Mon, 22 Oct 2007) | 1 line

  Add phuang patch from Issue 708374 which adds offset parameter to mmap module.
........
  r58601 | neal.norwitz | 2007-10-22 22:44:27 -0700 (Mon, 22 Oct 2007) | 2 lines

  Bug #1313, fix typo (wrong variable name) in example.
........
  r58609 | georg.brandl | 2007-10-23 11:21:35 -0700 (Tue, 23 Oct 2007) | 2 lines

  Update Pygments version from externals.
........
  r58618 | guido.van.rossum | 2007-10-23 12:25:41 -0700 (Tue, 23 Oct 2007) | 3 lines

  Issue 1307 by Derek Shockey, fox the same bug for RCPT.
  Neal: please backport!
........
  r58620 | raymond.hettinger | 2007-10-23 13:37:41 -0700 (Tue, 23 Oct 2007) | 1 line

  Shorter name for namedtuple()
........
  r58621 | andrew.kuchling | 2007-10-23 13:55:47 -0700 (Tue, 23 Oct 2007) | 1 line

  Update name
........
  r58622 | raymond.hettinger | 2007-10-23 14:23:07 -0700 (Tue, 23 Oct 2007) | 1 line

  Fixup news entry
........
  r58623 | raymond.hettinger | 2007-10-23 18:28:33 -0700 (Tue, 23 Oct 2007) | 1 line

  Optimize sum() for integer and float inputs.
........
  r58624 | raymond.hettinger | 2007-10-23 19:05:51 -0700 (Tue, 23 Oct 2007) | 1 line

  Fixup error return and add support for intermixed ints and floats/
........
  r58628 | vinay.sajip | 2007-10-24 03:47:06 -0700 (Wed, 24 Oct 2007) | 1 line

  Bug #1321: Fixed logic error in TimedRotatingFileHandler.__init__()
........
  r58641 | facundo.batista | 2007-10-24 12:11:08 -0700 (Wed, 24 Oct 2007) | 4 lines


  Issue 1290.  CharacterData.__repr__ was constructing a string
  in response that keeped having a non-ascii character.
........
  r58643 | thomas.heller | 2007-10-24 12:50:45 -0700 (Wed, 24 Oct 2007) | 1 line

  Added unittest for calling a function with paramflags (backport from py3k branch).
........
  r58645 | matthias.klose | 2007-10-24 13:00:44 -0700 (Wed, 24 Oct 2007) | 2 lines

  - Build using system ffi library on arm*-linux*.
........
  r58651 | georg.brandl | 2007-10-24 14:40:38 -0700 (Wed, 24 Oct 2007) | 2 lines

  Bug #1287: make os.environ.pop() work as expected.
........
  r58652 | raymond.hettinger | 2007-10-24 19:26:58 -0700 (Wed, 24 Oct 2007) | 1 line

  Missing DECREFs
........
  r58653 | matthias.klose | 2007-10-24 23:37:24 -0700 (Wed, 24 Oct 2007) | 2 lines

  - Build using system ffi library on arm*-linux*, pass --with-system-ffi to CONFIG_ARGS
........
  r58655 | thomas.heller | 2007-10-25 12:47:32 -0700 (Thu, 25 Oct 2007) | 2 lines

  ffi_type_longdouble may be already #defined.
  See issue 1324.
........
  r58656 | kurt.kaiser | 2007-10-25 15:43:45 -0700 (Thu, 25 Oct 2007) | 3 lines

  Correct an ancient bug in an unused path by removing that path: register() is
  now idempotent.
........
  r58660 | kurt.kaiser | 2007-10-25 17:10:09 -0700 (Thu, 25 Oct 2007) | 4 lines

  1. Add comments to provide top-level documentation.
  2. Refactor to use more descriptive names.
  3. Enhance tests in main().
........
  r58675 | georg.brandl | 2007-10-26 11:30:41 -0700 (Fri, 26 Oct 2007) | 2 lines

  Fix new pop() method on os.environ on ignorecase-platforms.
........
  r58696 | neal.norwitz | 2007-10-27 15:32:21 -0700 (Sat, 27 Oct 2007) | 1 line

  Update URL for Pygments.  0.8.1 is no longer available
........
  r58697 | hyeshik.chang | 2007-10-28 04:19:02 -0700 (Sun, 28 Oct 2007) | 3 lines

  - Add support for FreeBSD 8 which is recently forked from FreeBSD 7.
  - Regenerate IN module for most recent maintenance tree of FreeBSD 6 and 7.
........
  r58698 | hyeshik.chang | 2007-10-28 05:38:09 -0700 (Sun, 28 Oct 2007) | 2 lines

  Enable platform-specific tweaks for FreeBSD 8 (exactly same to FreeBSD 7's yet)
........
  r58700 | kurt.kaiser | 2007-10-28 12:03:59 -0700 (Sun, 28 Oct 2007) | 2 lines

  Add confirmation dialog before printing.  Patch 1717170 Tal Einat.
........
  r58706 | guido.van.rossum | 2007-10-29 13:52:45 -0700 (Mon, 29 Oct 2007) | 3 lines

  Patch 1353 by Jacob Winther.
  Add mp4 mapping to mimetypes.py.
........
  r58709 | guido.van.rossum | 2007-10-29 15:15:05 -0700 (Mon, 29 Oct 2007) | 6 lines

  Backport fixes for the code that decodes octal escapes (and for PyString
  also hex escapes) -- this was reaching beyond the end of the input string
  buffer, even though it is not supposed to be \0-terminated.
  This has no visible effect but is clearly the correct thing to do.
  (In 3.0 it had a visible effect after removing ob_sstate from PyString.)
........
  r58710 | kurt.kaiser | 2007-10-29 19:38:54 -0700 (Mon, 29 Oct 2007) | 7 lines

  check in Tal Einat's update to tabpage.py
  Patch 1612746

  M    configDialog.py
  M    NEWS.txt
  AM   tabbedpages.py
........
  r58715 | georg.brandl | 2007-10-30 10:51:18 -0700 (Tue, 30 Oct 2007) | 2 lines

  Use correct markup.
........
  r58716 | georg.brandl | 2007-10-30 10:57:12 -0700 (Tue, 30 Oct 2007) | 2 lines

  Make example about hiding None return values at the prompt clearer.
........
  r58728 | neal.norwitz | 2007-10-30 23:33:20 -0700 (Tue, 30 Oct 2007) | 1 line

  Fix some compiler warnings for signed comparisons on Unix and Windows.
........
  r58731 | martin.v.loewis | 2007-10-31 10:19:33 -0700 (Wed, 31 Oct 2007) | 2 lines

  Adding Christian Heimes.
........
  r58737 | raymond.hettinger | 2007-10-31 14:57:58 -0700 (Wed, 31 Oct 2007) | 1 line

  Clarify the reasons why pickle is almost always better than marshal
........
  r58739 | raymond.hettinger | 2007-10-31 15:15:49 -0700 (Wed, 31 Oct 2007) | 1 line

  Sets are marshalable.
........
parent 1d1a4001
...@@ -30,11 +30,21 @@ storage. ...@@ -30,11 +30,21 @@ storage.
#------------------------------------------------------------------------ #------------------------------------------------------------------------
import pickle import pickle
try: import sys
#At version 2.3 cPickle switched to using protocol instead of bin and
#DictMixin was added
if sys.version_info[:3] >= (2, 3, 0):
HIGHEST_PROTOCOL = pickle.HIGHEST_PROTOCOL
def _dumps(object, protocol):
return pickle.dumps(object, protocol=protocol)
from UserDict import DictMixin from UserDict import DictMixin
except ImportError: else:
# DictMixin is new in Python 2.3 HIGHEST_PROTOCOL = None
def _dumps(object, protocol):
return pickle.dumps(object, bin=protocol)
class DictMixin: pass class DictMixin: pass
from . import db from . import db
_unspecified = object() _unspecified = object()
...@@ -87,7 +97,10 @@ class DBShelf(DictMixin): ...@@ -87,7 +97,10 @@ class DBShelf(DictMixin):
def __init__(self, dbenv=None): def __init__(self, dbenv=None):
self.db = db.DB(dbenv) self.db = db.DB(dbenv)
self._closed = True self._closed = True
self.binary = 1 if HIGHEST_PROTOCOL:
self.protocol = HIGHEST_PROTOCOL
else:
self.protocol = 1
def __del__(self): def __del__(self):
...@@ -114,7 +127,7 @@ class DBShelf(DictMixin): ...@@ -114,7 +127,7 @@ class DBShelf(DictMixin):
def __setitem__(self, key, value): def __setitem__(self, key, value):
data = pickle.dumps(value, self.binary) data = _dumps(value, self.protocol)
self.db[key] = data self.db[key] = data
...@@ -169,7 +182,7 @@ class DBShelf(DictMixin): ...@@ -169,7 +182,7 @@ class DBShelf(DictMixin):
# Other methods # Other methods
def __append(self, value, txn=None): def __append(self, value, txn=None):
data = pickle.dumps(value, self.binary) data = _dumps(value, self.protocol)
return self.db.append(data, txn) return self.db.append(data, txn)
def append(self, value, txn=None): def append(self, value, txn=None):
...@@ -200,19 +213,19 @@ class DBShelf(DictMixin): ...@@ -200,19 +213,19 @@ class DBShelf(DictMixin):
return pickle.loads(data) return pickle.loads(data)
def get_both(self, key, value, txn=None, flags=0): def get_both(self, key, value, txn=None, flags=0):
data = pickle.dumps(value, self.binary) data = _dumps(value, self.protocol)
data = self.db.get(key, data, txn, flags) data = self.db.get(key, data, txn, flags)
return pickle.loads(data) return pickle.loads(data)
def cursor(self, txn=None, flags=0): def cursor(self, txn=None, flags=0):
c = DBShelfCursor(self.db.cursor(txn, flags)) c = DBShelfCursor(self.db.cursor(txn, flags))
c.binary = self.binary c.protocol = self.protocol
return c return c
def put(self, key, value, txn=None, flags=0): def put(self, key, value, txn=None, flags=0):
data = pickle.dumps(value, self.binary) data = _dumps(value, self.protocol)
return self.db.put(key, data, txn, flags) return self.db.put(key, data, txn, flags)
...@@ -252,11 +265,13 @@ class DBShelfCursor: ...@@ -252,11 +265,13 @@ class DBShelfCursor:
#---------------------------------------------- #----------------------------------------------
def dup(self, flags=0): def dup(self, flags=0):
return DBShelfCursor(self.dbc.dup(flags)) c = DBShelfCursor(self.dbc.dup(flags))
c.protocol = self.protocol
return c
def put(self, key, value, flags=0): def put(self, key, value, flags=0):
data = pickle.dumps(value, self.binary) data = _dumps(value, self.protocol)
return self.dbc.put(key, data, flags) return self.dbc.put(key, data, flags)
...@@ -274,7 +289,7 @@ class DBShelfCursor: ...@@ -274,7 +289,7 @@ class DBShelfCursor:
return self._extract(rec) return self._extract(rec)
def get_3(self, key, value, flags): def get_3(self, key, value, flags):
data = pickle.dumps(value, self.binary) data = _dumps(value, self.protocol)
rec = self.dbc.get(key, flags) rec = self.dbc.get(key, flags)
return self._extract(rec) return self._extract(rec)
...@@ -291,7 +306,7 @@ class DBShelfCursor: ...@@ -291,7 +306,7 @@ class DBShelfCursor:
def get_both(self, key, value, flags=0): def get_both(self, key, value, flags=0):
data = pickle.dumps(value, self.binary) data = _dumps(value, self.protocol)
rec = self.dbc.get_both(key, flags) rec = self.dbc.get_both(key, flags)
return self._extract(rec) return self._extract(rec)
......
...@@ -28,10 +28,10 @@ class MiscTestCase(unittest.TestCase): ...@@ -28,10 +28,10 @@ class MiscTestCase(unittest.TestCase):
pass pass
shutil.rmtree(self.homeDir) shutil.rmtree(self.homeDir)
def test01_badpointer(self): ## def test01_badpointer(self):
dbs = dbshelve.open(self.filename) ## dbs = dbshelve.open(self.filename)
dbs.close() ## dbs.close()
self.assertRaises(db.DBError, dbs.get, "foo") ## self.assertRaises(db.DBError, dbs.get, "foo")
def test02_db_home(self): def test02_db_home(self):
env = db.DBEnv() env = db.DBEnv()
...@@ -46,6 +46,26 @@ class MiscTestCase(unittest.TestCase): ...@@ -46,6 +46,26 @@ class MiscTestCase(unittest.TestCase):
rp = repr(db) rp = repr(db)
self.assertEquals(rp, "{}") self.assertEquals(rp, "{}")
# http://sourceforge.net/tracker/index.php?func=detail&aid=1708868&group_id=13900&atid=313900
#
# See the bug report for details.
#
# The problem was that make_key_dbt() was not allocating a copy of
# string keys but FREE_DBT() was always being told to free it when the
# database was opened with DB_THREAD.
## def test04_double_free_make_key_dbt(self):
## try:
## db1 = db.DB()
## db1.open(self.filename, None, db.DB_BTREE,
## db.DB_CREATE | db.DB_THREAD)
## curs = db1.cursor()
## t = curs.get(b"/foo", db.DB_SET)
## # double free happened during exit from DBC_get
## finally:
## db1.close()
## os.unlink(self.filename)
#---------------------------------------------------------------------- #----------------------------------------------------------------------
......
__all__ = ['deque', 'defaultdict', 'NamedTuple'] __all__ = ['deque', 'defaultdict', 'namedtuple']
from _collections import deque, defaultdict from _collections import deque, defaultdict
from operator import itemgetter as _itemgetter from operator import itemgetter as _itemgetter
from keyword import iskeyword as _iskeyword
import sys as _sys import sys as _sys
# For bootstrapping reasons, the collection ABCs are defined in _abcoll.py. # For bootstrapping reasons, the collection ABCs are defined in _abcoll.py.
...@@ -10,11 +11,10 @@ from _abcoll import * ...@@ -10,11 +11,10 @@ from _abcoll import *
import _abcoll import _abcoll
__all__ += _abcoll.__all__ __all__ += _abcoll.__all__
def namedtuple(typename, field_names, verbose=False):
def NamedTuple(typename, s, verbose=False):
"""Returns a new subclass of tuple with named fields. """Returns a new subclass of tuple with named fields.
>>> Point = NamedTuple('Point', 'x y') >>> Point = namedtuple('Point', 'x y')
>>> Point.__doc__ # docstring for the new class >>> Point.__doc__ # docstring for the new class
'Point(x, y)' 'Point(x, y)'
>>> p = Point(11, y=22) # instantiate with positional args or keywords >>> p = Point(11, y=22) # instantiate with positional args or keywords
...@@ -25,19 +25,36 @@ def NamedTuple(typename, s, verbose=False): ...@@ -25,19 +25,36 @@ def NamedTuple(typename, s, verbose=False):
(11, 22) (11, 22)
>>> p.x + p.y # fields also accessable by name >>> p.x + p.y # fields also accessable by name
33 33
>>> p # readable __repr__ with name=value style >>> d = p.__asdict__() # convert to a dictionary
>>> d['x']
11
>>> Point(**d) # convert from a dictionary
Point(x=11, y=22) Point(x=11, y=22)
>>> p.__replace__('x', 100) # __replace__() is like str.replace() but targets a named field >>> p.__replace__('x', 100) # __replace__() is like str.replace() but targets a named field
Point(x=100, y=22) Point(x=100, y=22)
>>> d = dict(zip(p.__fields__, p)) # use __fields__ to make a dictionary
>>> d['x']
11
""" """
field_names = tuple(s.replace(',', ' ').split()) # names separated by spaces and/or commas # Parse and validate the field names
if not ''.join((typename,) + field_names).replace('_', '').isalnum(): if isinstance(field_names, str):
raise ValueError('Type names and field names can only contain alphanumeric characters and underscores') field_names = field_names.replace(',', ' ').split() # names separated by whitespace and/or commas
field_names = tuple(field_names)
for name in (typename,) + field_names:
if not name.replace('_', '').isalnum():
raise ValueError('Type names and field names can only contain alphanumeric characters and underscores: %r' % name)
if _iskeyword(name):
raise ValueError('Type names and field names cannot be a keyword: %r' % name)
if name[0].isdigit():
raise ValueError('Type names and field names cannot start with a number: %r' % name)
seen_names = set()
for name in field_names:
if name.startswith('__') and name.endswith('__'):
raise ValueError('Field names cannot start and end with double underscores: %r' % name)
if name in seen_names:
raise ValueError('Encountered duplicate field name: %r' % name)
seen_names.add(name)
# Create and fill-in the class template
argtxt = repr(field_names).replace("'", "")[1:-1] # tuple repr without parens or quotes argtxt = repr(field_names).replace("'", "")[1:-1] # tuple repr without parens or quotes
reprtxt = ', '.join('%s=%%r' % name for name in field_names) reprtxt = ', '.join('%s=%%r' % name for name in field_names)
template = '''class %(typename)s(tuple): template = '''class %(typename)s(tuple):
...@@ -48,18 +65,31 @@ def NamedTuple(typename, s, verbose=False): ...@@ -48,18 +65,31 @@ def NamedTuple(typename, s, verbose=False):
return tuple.__new__(cls, (%(argtxt)s)) return tuple.__new__(cls, (%(argtxt)s))
def __repr__(self): def __repr__(self):
return '%(typename)s(%(reprtxt)s)' %% self return '%(typename)s(%(reprtxt)s)' %% self
def __replace__(self, field, value): def __asdict__(self, dict=dict, zip=zip):
'Return a new dict mapping field names to their values'
return dict(zip(%(field_names)r, self))
def __replace__(self, field, value, dict=dict, zip=zip):
'Return a new %(typename)s object replacing one field with a new value' 'Return a new %(typename)s object replacing one field with a new value'
return %(typename)s(**dict(list(zip(%(field_names)r, self)) + [(field, value)])) \n''' % locals() return %(typename)s(**dict(list(zip(%(field_names)r, self)) + [(field, value)])) \n''' % locals()
for i, name in enumerate(field_names): for i, name in enumerate(field_names):
template += ' %s = property(itemgetter(%d))\n' % (name, i) template += ' %s = property(itemgetter(%d))\n' % (name, i)
if verbose: if verbose:
print(template) print(template)
m = dict(itemgetter=_itemgetter)
exec(template, m) # Execute the template string in a temporary namespace
result = m[typename] namespace = dict(itemgetter=_itemgetter)
try:
exec(template, namespace)
except SyntaxError as e:
raise SyntaxError(e.message + ':\n' + template)
result = namespace[typename]
# For pickling to work, the __module__ variable needs to be set to the frame
# where the named tuple is created. Bypass this step in enviroments where
# sys._getframe is not defined (Jython for example).
if hasattr(_sys, '_getframe'): if hasattr(_sys, '_getframe'):
result.__module__ = _sys._getframe(1).f_globals['__name__'] result.__module__ = _sys._getframe(1).f_globals['__name__']
return result return result
...@@ -69,10 +99,10 @@ def NamedTuple(typename, s, verbose=False): ...@@ -69,10 +99,10 @@ def NamedTuple(typename, s, verbose=False):
if __name__ == '__main__': if __name__ == '__main__':
# verify that instances can be pickled # verify that instances can be pickled
from pickle import loads, dumps from pickle import loads, dumps
Point = NamedTuple('Point', 'x, y', True) Point = namedtuple('Point', 'x, y', True)
p = Point(x=10, y=20) p = Point(x=10, y=20)
assert p == loads(dumps(p)) assert p == loads(dumps(p))
import doctest import doctest
TestResults = NamedTuple('TestResults', 'failed attempted') TestResults = namedtuple('TestResults', 'failed attempted')
print(TestResults(*doctest.testmod())) print(TestResults(*doctest.testmod()))
...@@ -21,19 +21,12 @@ if _os.name in ("nt", "ce"): ...@@ -21,19 +21,12 @@ if _os.name in ("nt", "ce"):
DEFAULT_MODE = RTLD_LOCAL DEFAULT_MODE = RTLD_LOCAL
if _os.name == "posix" and _sys.platform == "darwin": if _os.name == "posix" and _sys.platform == "darwin":
import gestalt
# gestalt.gestalt("sysv") returns the version number of the
# currently active system file as BCD.
# On OS X 10.4.6 -> 0x1046
# On OS X 10.2.8 -> 0x1028
# See also http://www.rgaros.nl/gestalt/
#
# On OS X 10.3, we use RTLD_GLOBAL as default mode # On OS X 10.3, we use RTLD_GLOBAL as default mode
# because RTLD_LOCAL does not work at least on some # because RTLD_LOCAL does not work at least on some
# libraries. # libraries. OS X 10.3 is Darwin 7, so we check for
# that.
if gestalt.gestalt("sysv") < 0x1040: if int(_os.uname()[2].split('.')[0]) < 8:
DEFAULT_MODE = RTLD_GLOBAL DEFAULT_MODE = RTLD_GLOBAL
from _ctypes import FUNCFLAG_CDECL as _FUNCFLAG_CDECL, \ from _ctypes import FUNCFLAG_CDECL as _FUNCFLAG_CDECL, \
......
This diff is collapsed.
...@@ -527,7 +527,7 @@ class HTTPResponse: ...@@ -527,7 +527,7 @@ class HTTPResponse:
def read(self, amt=None): def read(self, amt=None):
if self.fp is None: if self.fp is None:
return "" return b""
if self.chunked: if self.chunked:
return self._read_chunked(amt) return self._read_chunked(amt)
...@@ -553,7 +553,8 @@ class HTTPResponse: ...@@ -553,7 +553,8 @@ class HTTPResponse:
s = self.fp.read(amt) s = self.fp.read(amt)
if self.length is not None: if self.length is not None:
self.length -= len(s) self.length -= len(s)
if not self.length:
self.close()
return s return s
def _read_chunked(self, amt): def _read_chunked(self, amt):
...@@ -595,7 +596,7 @@ class HTTPResponse: ...@@ -595,7 +596,7 @@ class HTTPResponse:
### note: we shouldn't have any trailers! ### note: we shouldn't have any trailers!
while True: while True:
line = self.fp.readline() line = self.fp.readline()
if line == "\r\n": if line == b"\r\n":
break break
# we read everything; close the "file" # we read everything; close the "file"
......
...@@ -27,7 +27,7 @@ class AutoComplete: ...@@ -27,7 +27,7 @@ class AutoComplete:
menudefs = [ menudefs = [
('edit', [ ('edit', [
("Show completions", "<<force-open-completions>>"), ("Show Completions", "<<force-open-completions>>"),
]) ])
] ]
......
...@@ -283,20 +283,9 @@ class AutoCompleteWindow: ...@@ -283,20 +283,9 @@ class AutoCompleteWindow:
self._selection_changed() self._selection_changed()
return "break" return "break"
elif keysym == "Return" and not state: elif keysym == "Return":
# If start is a prefix of the selection, or there was an indication self.hide_window()
# that the user used the completion window, put the selected return
# completion in the text, and close the list.
# Otherwise, close the window and let the event through.
cursel = int(self.listbox.curselection()[0])
if self.completions[cursel][:len(self.start)] == self.start or \
self.userwantswindow:
self._change_start(self.completions[cursel])
self.hide_window()
return "break"
else:
self.hide_window()
return
elif (self.mode == COMPLETE_ATTRIBUTES and keysym in elif (self.mode == COMPLETE_ATTRIBUTES and keysym in
("period", "space", "parenleft", "parenright", "bracketleft", ("period", "space", "parenleft", "parenright", "bracketleft",
......
...@@ -386,7 +386,7 @@ class EditorWindow(object): ...@@ -386,7 +386,7 @@ class EditorWindow(object):
def help_dialog(self, event=None): def help_dialog(self, event=None):
fn=os.path.join(os.path.abspath(os.path.dirname(__file__)),'help.txt') fn=os.path.join(os.path.abspath(os.path.dirname(__file__)),'help.txt')
textView.TextViewer(self.top,'Help',fn) textView.view_file(self.top,'Help',fn)
def python_docs(self, event=None): def python_docs(self, event=None):
if sys.platform[:3] == 'win': if sys.platform[:3] == 'win':
...@@ -408,6 +408,7 @@ class EditorWindow(object): ...@@ -408,6 +408,7 @@ class EditorWindow(object):
def paste(self,event): def paste(self,event):
self.text.event_generate("<<Paste>>") self.text.event_generate("<<Paste>>")
self.text.see("insert")
return "break" return "break"
def select_all(self, event=None): def select_all(self, event=None):
...@@ -549,7 +550,8 @@ class EditorWindow(object): ...@@ -549,7 +550,8 @@ class EditorWindow(object):
def close_hook(self): def close_hook(self):
if self.flist: if self.flist:
self.flist.close_edit(self) self.flist.unregister_maybe_terminate(self)
self.flist = None
def set_close_hook(self, close_hook): def set_close_hook(self, close_hook):
self.close_hook = close_hook self.close_hook = close_hook
...@@ -828,22 +830,21 @@ class EditorWindow(object): ...@@ -828,22 +830,21 @@ class EditorWindow(object):
if self.io.filename: if self.io.filename:
self.update_recent_files_list(new_file=self.io.filename) self.update_recent_files_list(new_file=self.io.filename)
WindowList.unregister_callback(self.postwindowsmenu) WindowList.unregister_callback(self.postwindowsmenu)
if self.close_hook:
self.close_hook()
self.flist = None
colorizing = 0
self.unload_extensions() self.unload_extensions()
self.io.close(); self.io = None self.io.close()
self.undo = None # XXX self.io = None
self.undo = None
if self.color: if self.color:
colorizing = self.color.colorizing self.color.close(False)
doh = colorizing and self.top self.color = None
self.color.close(doh) # Cancel colorization
self.text = None self.text = None
self.tkinter_vars = None self.tkinter_vars = None
self.per.close(); self.per = None self.per.close()
if not colorizing: self.per = None
self.top.destroy() self.top.destroy()
if self.close_hook:
# unless override: unregister from flist, terminate if last window
self.close_hook()
def load_extensions(self): def load_extensions(self):
self.extensions = {} self.extensions = {}
...@@ -1501,6 +1502,7 @@ def test(): ...@@ -1501,6 +1502,7 @@ def test():
filename = None filename = None
edit = EditorWindow(root=root, filename=filename) edit = EditorWindow(root=root, filename=filename)
edit.set_close_hook(root.quit) edit.set_close_hook(root.quit)
edit.text.bind("<<close-all-windows>>", edit.close_event)
root.mainloop() root.mainloop()
root.destroy() root.destroy()
......
...@@ -55,7 +55,7 @@ class FileList: ...@@ -55,7 +55,7 @@ class FileList:
break break
return "break" return "break"
def close_edit(self, edit): def unregister_maybe_terminate(self, edit):
try: try:
key = self.inversedict[edit] key = self.inversedict[edit]
except KeyError: except KeyError:
......
...@@ -485,13 +485,23 @@ class IOBinding: ...@@ -485,13 +485,23 @@ class IOBinding:
self.text.insert("end-1c", "\n") self.text.insert("end-1c", "\n")
def print_window(self, event): def print_window(self, event):
m = tkMessageBox.Message(
title="Print",
message="Print to Default Printer",
icon=tkMessageBox.QUESTION,
type=tkMessageBox.OKCANCEL,
default=tkMessageBox.OK,
master=self.text)
reply = m.show()
if reply != tkMessageBox.OK:
self.text.focus_set()
return "break"
tempfilename = None tempfilename = None
saved = self.get_saved() saved = self.get_saved()
if saved: if saved:
filename = self.filename filename = self.filename
# shell undo is reset after every prompt, looks saved, probably isn't # shell undo is reset after every prompt, looks saved, probably isn't
if not saved or filename is None: if not saved or filename is None:
# XXX KBK 08Jun03 Wouldn't it be better to ask the user to save?
(tfd, tempfilename) = tempfile.mkstemp(prefix='IDLE_tmp_') (tfd, tempfilename) = tempfile.mkstemp(prefix='IDLE_tmp_')
filename = tempfilename filename = tempfilename
os.close(tfd) os.close(tfd)
......
...@@ -30,6 +30,24 @@ What's New in IDLE 2.6a1? ...@@ -30,6 +30,24 @@ What's New in IDLE 2.6a1?
*Release date: XX-XXX-200X* UNRELEASED, but merged into 3.0a1 *Release date: XX-XXX-200X* UNRELEASED, but merged into 3.0a1
- tabpage.py updated: tabbedPages.py now supports multiple dynamic rows
of tabs. Patch 1612746 Tal Einat.
- Add confirmation dialog before printing. Patch 1717170 Tal Einat.
- Show paste position if > 80 col. Patch 1659326 Tal Einat.
- Update cursor color without restarting. Patch 1725576 Tal Einat.
- Allow keyboard interrupt only when user code is executing in subprocess.
Patch 1225 Tal Einat (reworked from IDLE-Spoon).
- configDialog cleanup. Patch 1730217 Tal Einat.
- textView cleanup. Patch 1718043 Tal Einat.
- Clean up EditorWindow close.
- Corrected some bugs in AutoComplete. Also, Page Up/Down in ACW implemented; - Corrected some bugs in AutoComplete. Also, Page Up/Down in ACW implemented;
mouse and cursor selection in ACWindow implemented; double Tab inserts mouse and cursor selection in ACWindow implemented; double Tab inserts
current selection and closes ACW (similar to double-click and Return); scroll current selection and closes ACW (similar to double-click and Return); scroll
...@@ -51,6 +69,8 @@ What's New in IDLE 2.6a1? ...@@ -51,6 +69,8 @@ What's New in IDLE 2.6a1?
- Bug #813342: Start the IDLE subprocess with -Qnew if the parent - Bug #813342: Start the IDLE subprocess with -Qnew if the parent
is started with that option. is started with that option.
- Honor the "Cancel" action in the save dialog (Debian bug #299092)
- Some syntax errors were being caught by tokenize during the tabnanny - Some syntax errors were being caught by tokenize during the tabnanny
check, resulting in obscure error messages. Do the syntax check check, resulting in obscure error messages. Do the syntax check
first. Bug 1562716, 1562719 first. Bug 1562716, 1562719
......
...@@ -296,9 +296,6 @@ class ModifiedColorDelegator(ColorDelegator): ...@@ -296,9 +296,6 @@ class ModifiedColorDelegator(ColorDelegator):
"stdout": idleConf.GetHighlight(theme, "stdout"), "stdout": idleConf.GetHighlight(theme, "stdout"),
"stderr": idleConf.GetHighlight(theme, "stderr"), "stderr": idleConf.GetHighlight(theme, "stderr"),
"console": idleConf.GetHighlight(theme, "console"), "console": idleConf.GetHighlight(theme, "console"),
### KBK 10Aug07: None tag doesn't seem to serve a purpose and
### breaks in py3k. Comment out for now.
#None: idleConf.GetHighlight(theme, "normal"),
}) })
class ModifiedUndoDelegator(UndoDelegator): class ModifiedUndoDelegator(UndoDelegator):
......
from Tkinter import * from Tkinter import *
class WidgetRedirector: class WidgetRedirector:
"""Support for redirecting arbitrary widget subcommands.""" """Support for redirecting arbitrary widget subcommands.
Some Tk operations don't normally pass through Tkinter. For example, if a
character is inserted into a Text widget by pressing a key, a default Tk
binding to the widget's 'insert' operation is activated, and the Tk library
processes the insert without calling back into Tkinter.
Although a binding to <Key> could be made via Tkinter, what we really want
to do is to hook the Tk 'insert' operation itself.
When a widget is instantiated, a Tcl command is created whose name is the
same as the pathname widget._w. This command is used to invoke the various
widget operations, e.g. insert (for a Text widget). We are going to hook
this command and provide a facility ('register') to intercept the widget
operation.
In IDLE, the function being registered provides access to the top of a
Percolator chain. At the bottom of the chain is a call to the original
Tk widget operation.
"""
def __init__(self, widget): def __init__(self, widget):
self.dict = {} self._operations = {}
self.widget = widget self.widget = widget # widget instance
self.tk = tk = widget.tk self.tk = tk = widget.tk # widget's root
w = widget._w w = widget._w # widget's (full) Tk pathname
self.orig = w + "_orig" self.orig = w + "_orig"
# Rename the Tcl command within Tcl:
tk.call("rename", w, self.orig) tk.call("rename", w, self.orig)
# Create a new Tcl command whose name is the widget's pathname, and
# whose action is to dispatch on the operation passed to the widget:
tk.createcommand(w, self.dispatch) tk.createcommand(w, self.dispatch)
def __repr__(self): def __repr__(self):
...@@ -19,74 +40,87 @@ class WidgetRedirector: ...@@ -19,74 +40,87 @@ class WidgetRedirector:
self.widget._w) self.widget._w)
def close(self): def close(self):
for name in list(self.dict.keys()): for operation in list(self._operations):
self.unregister(name) self.unregister(operation)
widget = self.widget; del self.widget widget = self.widget; del self.widget
orig = self.orig; del self.orig orig = self.orig; del self.orig
tk = widget.tk tk = widget.tk
w = widget._w w = widget._w
tk.deletecommand(w) tk.deletecommand(w)
# restore the original widget Tcl command:
tk.call("rename", orig, w) tk.call("rename", orig, w)
def register(self, name, function): def register(self, operation, function):
if name in self.dict: self._operations[operation] = function
previous = dict[name] setattr(self.widget, operation, function)
else: return OriginalCommand(self, operation)
previous = OriginalCommand(self, name)
self.dict[name] = function def unregister(self, operation):
setattr(self.widget, name, function) if operation in self._operations:
return previous function = self._operations[operation]
del self._operations[operation]
def unregister(self, name): if hasattr(self.widget, operation):
if name in self.dict: delattr(self.widget, operation)
function = self.dict[name]
del self.dict[name]
if hasattr(self.widget, name):
delattr(self.widget, name)
return function return function
else: else:
return None return None
def dispatch(self, cmd, *args): def dispatch(self, operation, *args):
m = self.dict.get(cmd) '''Callback from Tcl which runs when the widget is referenced.
If an operation has been registered in self._operations, apply the
associated function to the args passed into Tcl. Otherwise, pass the
operation through to Tk via the original Tcl function.
Note that if a registered function is called, the operation is not
passed through to Tk. Apply the function returned by self.register()
to *args to accomplish that. For an example, see ColorDelegator.py.
'''
m = self._operations.get(operation)
try: try:
if m: if m:
return m(*args) return m(*args)
else: else:
return self.tk.call((self.orig, cmd) + args) return self.tk.call((self.orig, operation) + args)
except TclError: except TclError:
return "" return ""
class OriginalCommand: class OriginalCommand:
def __init__(self, redir, name): def __init__(self, redir, operation):
self.redir = redir self.redir = redir
self.name = name self.operation = operation
self.tk = redir.tk self.tk = redir.tk
self.orig = redir.orig self.orig = redir.orig
self.tk_call = self.tk.call self.tk_call = self.tk.call
self.orig_and_name = (self.orig, self.name) self.orig_and_operation = (self.orig, self.operation)
def __repr__(self): def __repr__(self):
return "OriginalCommand(%r, %r)" % (self.redir, self.name) return "OriginalCommand(%r, %r)" % (self.redir, self.operation)
def __call__(self, *args): def __call__(self, *args):
return self.tk_call(self.orig_and_name + args) return self.tk_call(self.orig_and_operation + args)
def main(): def main():
root = Tk() root = Tk()
root.wm_protocol("WM_DELETE_WINDOW", root.quit)
text = Text() text = Text()
text.pack() text.pack()
text.focus_set() text.focus_set()
redir = WidgetRedirector(text) redir = WidgetRedirector(text)
global orig_insert global previous_tcl_fcn
def my_insert(*args): def my_insert(*args):
print("insert", args) print("insert", args)
orig_insert(*args) previous_tcl_fcn(*args)
orig_insert = redir.register("insert", my_insert) previous_tcl_fcn = redir.register("insert", my_insert)
root.mainloop()
redir.unregister("insert") # runs after first 'close window'
redir.close()
root.mainloop() root.mainloop()
root.destroy()
if __name__ == "__main__": if __name__ == "__main__":
main() main()
...@@ -111,45 +111,31 @@ class AboutDialog(Toplevel): ...@@ -111,45 +111,31 @@ class AboutDialog(Toplevel):
idle_credits_b.pack(side=LEFT, padx=10, pady=10) idle_credits_b.pack(side=LEFT, padx=10, pady=10)
def ShowLicense(self): def ShowLicense(self):
self.display_printer_text(license, 'About - License') self.display_printer_text('About - License', license)
def ShowCopyright(self): def ShowCopyright(self):
self.display_printer_text(copyright, 'About - Copyright') self.display_printer_text('About - Copyright', copyright)
def ShowPythonCredits(self): def ShowPythonCredits(self):
self.display_printer_text(credits, 'About - Python Credits') self.display_printer_text('About - Python Credits', credits)
def ShowIDLECredits(self): def ShowIDLECredits(self):
self.ViewFile('About - Credits','CREDITS.txt') self.display_file_text('About - Credits', 'CREDITS.txt', 'iso-8859-1')
def ShowIDLEAbout(self): def ShowIDLEAbout(self):
self.ViewFile('About - Readme', 'README.txt') self.display_file_text('About - Readme', 'README.txt')
def ShowIDLENEWS(self): def ShowIDLENEWS(self):
self.ViewFile('About - NEWS', 'NEWS.txt') self.display_file_text('About - NEWS', 'NEWS.txt')
def display_printer_text(self, printer, title): def display_printer_text(self, title, printer):
printer._Printer__setup() printer._Printer__setup()
data = '\n'.join(printer._Printer__lines) text = '\n'.join(printer._Printer__lines)
textView.TextViewer(self, title, None, data) textView.view_text(self, title, text)
def ViewFile(self, viewTitle, viewFile, encoding=None): def display_file_text(self, title, filename, encoding=None):
fn = os.path.join(os.path.abspath(os.path.dirname(__file__)), viewFile) fn = os.path.join(os.path.abspath(os.path.dirname(__file__)), filename)
if encoding: textView.view_file(self, title, fn, encoding)
import codecs
try:
textFile = codecs.open(fn, 'r')
except IOError:
import tkMessageBox
tkMessageBox.showerror(title='File Load Error',
message='Unable to load file %r .' % (fn,),
parent=self)
return
else:
data = textFile.read()
else:
data = None
textView.TextViewer(self, viewTitle, fn, data=data)
def Ok(self, event=None): def Ok(self, event=None):
self.destroy() self.destroy()
......
This diff is collapsed.
...@@ -38,10 +38,11 @@ else: ...@@ -38,10 +38,11 @@ else:
# Thread shared globals: Establish a queue between a subthread (which handles # Thread shared globals: Establish a queue between a subthread (which handles
# the socket) and the main thread (which runs user code), plus global # the socket) and the main thread (which runs user code), plus global
# completion and exit flags: # completion, exit and interruptable (the main thread) flags:
exit_now = False exit_now = False
quitting = False quitting = False
interruptable = False
def main(del_exitfunc=False): def main(del_exitfunc=False):
"""Start the Python execution server in a subprocess """Start the Python execution server in a subprocess
...@@ -278,9 +279,14 @@ class Executive(object): ...@@ -278,9 +279,14 @@ class Executive(object):
self.autocomplete = AutoComplete.AutoComplete() self.autocomplete = AutoComplete.AutoComplete()
def runcode(self, code): def runcode(self, code):
global interruptable
try: try:
self.usr_exc_info = None self.usr_exc_info = None
exec(code, self.locals) interruptable = True
try:
exec(code, self.locals)
finally:
interruptable = False
except: except:
self.usr_exc_info = sys.exc_info() self.usr_exc_info = sys.exc_info()
if quitting: if quitting:
...@@ -294,7 +300,8 @@ class Executive(object): ...@@ -294,7 +300,8 @@ class Executive(object):
flush_stdout() flush_stdout()
def interrupt_the_server(self): def interrupt_the_server(self):
thread.interrupt_main() if interruptable:
thread.interrupt_main()
def start_the_debugger(self, gui_adap_oid): def start_the_debugger(self, gui_adap_oid):
return RemoteDebugger.start_debugger(self.rpchandler, gui_adap_oid) return RemoteDebugger.start_debugger(self.rpchandler, gui_adap_oid)
......
This diff is collapsed.
...@@ -6,13 +6,12 @@ from Tkinter import * ...@@ -6,13 +6,12 @@ from Tkinter import *
import tkMessageBox import tkMessageBox
class TextViewer(Toplevel): class TextViewer(Toplevel):
"""A simple text viewer dialog for IDLE
""" """
simple text viewer dialog for idle def __init__(self, parent, title, text):
""" """Show the given text in a scrollable window with a 'close' button
def __init__(self, parent, title, fileName, data=None):
"""If data exists, load it into viewer, otherwise try to load file.
fileName - string, should be an absoulute filename
""" """
Toplevel.__init__(self, parent) Toplevel.__init__(self, parent)
self.configure(borderwidth=5) self.configure(borderwidth=5)
...@@ -33,23 +32,10 @@ class TextViewer(Toplevel): ...@@ -33,23 +32,10 @@ class TextViewer(Toplevel):
#key bindings for this dialog #key bindings for this dialog
self.bind('<Return>',self.Ok) #dismiss dialog self.bind('<Return>',self.Ok) #dismiss dialog
self.bind('<Escape>',self.Ok) #dismiss dialog self.bind('<Escape>',self.Ok) #dismiss dialog
if data: self.textView.insert(0.0, text)
self.textView.insert(0.0, data)
else:
self.LoadTextFile(fileName)
self.textView.config(state=DISABLED) self.textView.config(state=DISABLED)
self.wait_window() self.wait_window()
def LoadTextFile(self, fileName):
textFile = None
try:
textFile = open(fileName, 'r')
except IOError:
tkMessageBox.showerror(title='File Load Error',
message='Unable to load file %r .' % (fileName,))
else:
self.textView.insert(0.0,textFile.read())
def CreateWidgets(self): def CreateWidgets(self):
frameText = Frame(self, relief=SUNKEN, height=700) frameText = Frame(self, relief=SUNKEN, height=700)
frameButtons = Frame(self) frameButtons = Frame(self)
...@@ -70,9 +56,38 @@ class TextViewer(Toplevel): ...@@ -70,9 +56,38 @@ class TextViewer(Toplevel):
def Ok(self, event=None): def Ok(self, event=None):
self.destroy() self.destroy()
def view_text(parent, title, text):
TextViewer(parent, title, text)
def view_file(parent, title, filename, encoding=None):
try:
if encoding:
import codecs
textFile = codecs.open(filename, 'r')
else:
textFile = open(filename, 'r')
except IOError:
import tkMessageBox
tkMessageBox.showerror(title='File Load Error',
message='Unable to load file %r .' % filename,
parent=parent)
else:
return view_text(parent, title, textFile.read())
if __name__ == '__main__': if __name__ == '__main__':
#test the dialog #test the dialog
root=Tk() root=Tk()
Button(root,text='View', root.title('textView test')
command=lambda:TextViewer(root,'Text','./textView.py')).pack() filename = './textView.py'
text = file(filename, 'r').read()
btn1 = Button(root, text='view_text',
command=lambda:view_text(root, 'view_text', text))
btn1.pack(side=LEFT)
btn2 = Button(root, text='view_file',
command=lambda:view_file(root, 'view_file', filename))
btn2.pack(side=LEFT)
close = Button(root, text='Close', command=root.destroy)
close.pack(side=RIGHT)
root.mainloop() root.mainloop()
...@@ -41,8 +41,8 @@ except ImportError: ...@@ -41,8 +41,8 @@ except ImportError:
__author__ = "Vinay Sajip <vinay_sajip@red-dove.com>" __author__ = "Vinay Sajip <vinay_sajip@red-dove.com>"
__status__ = "production" __status__ = "production"
__version__ = "0.5.0.2" __version__ = "0.5.0.3"
__date__ = "16 February 2007" __date__ = "26 September 2007"
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Miscellaneous module data # Miscellaneous module data
...@@ -236,7 +236,7 @@ class LogRecord: ...@@ -236,7 +236,7 @@ class LogRecord:
# 'Value is %d' instead of 'Value is 0'. # 'Value is %d' instead of 'Value is 0'.
# For the use case of passing a dictionary, this should not be a # For the use case of passing a dictionary, this should not be a
# problem. # problem.
if args and (len(args) == 1) and args[0] and isinstance(args[0], dict): if args and len(args) == 1 and isinstance(args[0], dict) and args[0]:
args = args[0] args = args[0]
self.args = args self.args = args
self.levelname = getLevelName(level) self.levelname = getLevelName(level)
...@@ -730,7 +730,8 @@ class StreamHandler(Handler): ...@@ -730,7 +730,8 @@ class StreamHandler(Handler):
""" """
Flushes the stream. Flushes the stream.
""" """
self.stream.flush() if self.stream:
self.stream.flush()
def emit(self, record): def emit(self, record):
""" """
...@@ -780,9 +781,11 @@ class FileHandler(StreamHandler): ...@@ -780,9 +781,11 @@ class FileHandler(StreamHandler):
""" """
Closes the stream. Closes the stream.
""" """
self.flush() if self.stream:
self.stream.close() self.flush()
StreamHandler.close(self) self.stream.close()
StreamHandler.close(self)
self.stream = None
def _open(self): def _open(self):
""" """
...@@ -1245,7 +1248,7 @@ def basicConfig(**kwargs): ...@@ -1245,7 +1248,7 @@ def basicConfig(**kwargs):
hdlr.setFormatter(fmt) hdlr.setFormatter(fmt)
root.addHandler(hdlr) root.addHandler(hdlr)
level = kwargs.get("level") level = kwargs.get("level")
if level: if level is not None:
root.setLevel(level) root.setLevel(level)
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
......
...@@ -231,11 +231,11 @@ class TimedRotatingFileHandler(BaseRotatingHandler): ...@@ -231,11 +231,11 @@ class TimedRotatingFileHandler(BaseRotatingHandler):
# of days in the next week until the rollover day (3). # of days in the next week until the rollover day (3).
if when.startswith('W'): if when.startswith('W'):
day = t[6] # 0 is Monday day = t[6] # 0 is Monday
if day > self.dayOfWeek: if day != self.dayOfWeek:
daysToWait = (day - self.dayOfWeek) - 1 if day < self.dayOfWeek:
self.rolloverAt = self.rolloverAt + (daysToWait * (60 * 60 * 24)) daysToWait = self.dayOfWeek - day - 1
if day < self.dayOfWeek: else:
daysToWait = (6 - self.dayOfWeek) + day daysToWait = 6 - day + self.dayOfWeek
self.rolloverAt = self.rolloverAt + (daysToWait * (60 * 60 * 24)) self.rolloverAt = self.rolloverAt + (daysToWait * (60 * 60 * 24))
#print "Will rollover at %d, %d seconds from now" % (self.rolloverAt, self.rolloverAt - currentTime) #print "Will rollover at %d, %d seconds from now" % (self.rolloverAt, self.rolloverAt - currentTime)
......
...@@ -393,6 +393,7 @@ def _default_mime_types(): ...@@ -393,6 +393,7 @@ def _default_mime_types():
'.movie' : 'video/x-sgi-movie', '.movie' : 'video/x-sgi-movie',
'.mp2' : 'audio/mpeg', '.mp2' : 'audio/mpeg',
'.mp3' : 'audio/mpeg', '.mp3' : 'audio/mpeg',
'.mp4' : 'video/mp4',
'.mpa' : 'video/mpeg', '.mpa' : 'video/mpeg',
'.mpe' : 'video/mpeg', '.mpe' : 'video/mpeg',
'.mpeg' : 'video/mpeg', '.mpeg' : 'video/mpeg',
......
# Generated by h2py from /usr/include/netinet/in.h # Generated by h2py from /usr/include/netinet/in.h
# Included from sys/cdefs.h # Included from sys/cdefs.h
__GNUCLIKE_ASM = 3
__GNUCLIKE_ASM = 2
__GNUCLIKE___TYPEOF = 1
__GNUCLIKE___OFFSETOF = 1
__GNUCLIKE___SECTION = 1
__GNUCLIKE_ATTRIBUTE_MODE_DI = 1
__GNUCLIKE_CTOR_SECTION_HANDLING = 1
__GNUCLIKE_BUILTIN_CONSTANT_P = 1
__GNUCLIKE_BUILTIN_VARARGS = 1
__GNUCLIKE_BUILTIN_STDARG = 1
__GNUCLIKE_BUILTIN_VAALIST = 1
__GNUC_VA_LIST_COMPATIBILITY = 1
__GNUCLIKE_BUILTIN_NEXT_ARG = 1
__GNUCLIKE_BUILTIN_MEMCPY = 1
__CC_SUPPORTS_INLINE = 1
__CC_SUPPORTS___INLINE = 1
__CC_SUPPORTS___INLINE__ = 1
__CC_SUPPORTS___FUNC__ = 1
__CC_SUPPORTS_WARNING = 1
__CC_SUPPORTS_VARADIC_XXX = 1
__CC_SUPPORTS_DYNAMIC_ARRAY_INIT = 1
__CC_INT_IS_32BIT = 1
def __P(protos): return protos def __P(protos): return protos
def __STRING(x): return #x def __STRING(x): return #x
...@@ -29,6 +51,8 @@ def __predict_true(exp): return (exp) ...@@ -29,6 +51,8 @@ def __predict_true(exp): return (exp)
def __predict_false(exp): return (exp) def __predict_false(exp): return (exp)
def __format_arg(fmtarg): return __attribute__((__format_arg__ (fmtarg)))
def __FBSDID(s): return __IDSTRING(__CONCAT(__rcsid_,__LINE__),s) def __FBSDID(s): return __IDSTRING(__CONCAT(__rcsid_,__LINE__),s)
def __RCSID(s): return __IDSTRING(__CONCAT(__rcsid_,__LINE__),s) def __RCSID(s): return __IDSTRING(__CONCAT(__rcsid_,__LINE__),s)
...@@ -86,8 +110,6 @@ LITTLE_ENDIAN = _LITTLE_ENDIAN ...@@ -86,8 +110,6 @@ LITTLE_ENDIAN = _LITTLE_ENDIAN
BIG_ENDIAN = _BIG_ENDIAN BIG_ENDIAN = _BIG_ENDIAN
PDP_ENDIAN = _PDP_ENDIAN PDP_ENDIAN = _PDP_ENDIAN
BYTE_ORDER = _BYTE_ORDER BYTE_ORDER = _BYTE_ORDER
__INTEL_COMPILER_with_FreeBSD_endian = 1
__INTEL_COMPILER_with_FreeBSD_endian = 1
def __word_swap_int_var(x): return \ def __word_swap_int_var(x): return \
def __word_swap_int_const(x): return \ def __word_swap_int_const(x): return \
...@@ -96,12 +118,16 @@ def __word_swap_int(x): return __word_swap_int_var(x) ...@@ -96,12 +118,16 @@ def __word_swap_int(x): return __word_swap_int_var(x)
def __byte_swap_int_var(x): return \ def __byte_swap_int_var(x): return \
def __byte_swap_int_var(x): return \
def __byte_swap_int_const(x): return \ def __byte_swap_int_const(x): return \
def __byte_swap_int(x): return __byte_swap_int_var(x) def __byte_swap_int(x): return __byte_swap_int_var(x)
def __byte_swap_long_var(x): return \
def __byte_swap_long_const(x): return \
def __byte_swap_long(x): return __byte_swap_long_var(x)
def __byte_swap_word_var(x): return \ def __byte_swap_word_var(x): return \
def __byte_swap_word_const(x): return \ def __byte_swap_word_const(x): return \
...@@ -229,47 +255,50 @@ IPPROTO_ENCAP = 98 ...@@ -229,47 +255,50 @@ IPPROTO_ENCAP = 98
IPPROTO_APES = 99 IPPROTO_APES = 99
IPPROTO_GMTP = 100 IPPROTO_GMTP = 100
IPPROTO_IPCOMP = 108 IPPROTO_IPCOMP = 108
IPPROTO_SCTP = 132
IPPROTO_PIM = 103 IPPROTO_PIM = 103
IPPROTO_CARP = 112
IPPROTO_PGM = 113 IPPROTO_PGM = 113
IPPROTO_PFSYNC = 240 IPPROTO_PFSYNC = 240
IPPROTO_OLD_DIVERT = 254 IPPROTO_OLD_DIVERT = 254
IPPROTO_MAX = 256 IPPROTO_MAX = 256
IPPROTO_DONE = 257 IPPROTO_DONE = 257
IPPROTO_DIVERT = 258 IPPROTO_DIVERT = 258
IPPROTO_SPACER = 32767
IPPORT_RESERVED = 1024 IPPORT_RESERVED = 1024
IPPORT_HIFIRSTAUTO = 49152 IPPORT_HIFIRSTAUTO = 49152
IPPORT_HILASTAUTO = 65535 IPPORT_HILASTAUTO = 65535
IPPORT_RESERVEDSTART = 600 IPPORT_RESERVEDSTART = 600
IPPORT_MAX = 65535 IPPORT_MAX = 65535
def IN_CLASSA(i): return (((u_int32_t)(i) & (-2147483648)) == 0) def IN_CLASSA(i): return (((u_int32_t)(i) & 0x80000000) == 0)
IN_CLASSA_NET = (-16777216) IN_CLASSA_NET = 0xff000000
IN_CLASSA_NSHIFT = 24 IN_CLASSA_NSHIFT = 24
IN_CLASSA_HOST = 0x00ffffff IN_CLASSA_HOST = 0x00ffffff
IN_CLASSA_MAX = 128 IN_CLASSA_MAX = 128
def IN_CLASSB(i): return (((u_int32_t)(i) & (-1073741824)) == (-2147483648)) def IN_CLASSB(i): return (((u_int32_t)(i) & 0xc0000000) == 0x80000000)
IN_CLASSB_NET = (-65536) IN_CLASSB_NET = 0xffff0000
IN_CLASSB_NSHIFT = 16 IN_CLASSB_NSHIFT = 16
IN_CLASSB_HOST = 0x0000ffff IN_CLASSB_HOST = 0x0000ffff
IN_CLASSB_MAX = 65536 IN_CLASSB_MAX = 65536
def IN_CLASSC(i): return (((u_int32_t)(i) & (-536870912)) == (-1073741824)) def IN_CLASSC(i): return (((u_int32_t)(i) & 0xe0000000) == 0xc0000000)
IN_CLASSC_NET = (-256) IN_CLASSC_NET = 0xffffff00
IN_CLASSC_NSHIFT = 8 IN_CLASSC_NSHIFT = 8
IN_CLASSC_HOST = 0x000000ff IN_CLASSC_HOST = 0x000000ff
def IN_CLASSD(i): return (((u_int32_t)(i) & (-268435456)) == (-536870912)) def IN_CLASSD(i): return (((u_int32_t)(i) & 0xf0000000) == 0xe0000000)
IN_CLASSD_NET = (-268435456) IN_CLASSD_NET = 0xf0000000
IN_CLASSD_NSHIFT = 28 IN_CLASSD_NSHIFT = 28
IN_CLASSD_HOST = 0x0fffffff IN_CLASSD_HOST = 0x0fffffff
def IN_MULTICAST(i): return IN_CLASSD(i) def IN_MULTICAST(i): return IN_CLASSD(i)
def IN_EXPERIMENTAL(i): return (((u_int32_t)(i) & (-268435456)) == (-268435456)) def IN_EXPERIMENTAL(i): return (((u_int32_t)(i) & 0xf0000000) == 0xf0000000)
def IN_BADCLASS(i): return (((u_int32_t)(i) & (-268435456)) == (-268435456)) def IN_BADCLASS(i): return (((u_int32_t)(i) & 0xf0000000) == 0xf0000000)
INADDR_NONE = (-1) INADDR_NONE = 0xffffffff
IN_LOOPBACKNET = 127 IN_LOOPBACKNET = 127
IP_OPTIONS = 1 IP_OPTIONS = 1
IP_HDRINCL = 2 IP_HDRINCL = 2
...@@ -311,6 +340,8 @@ IP_DUMMYNET_DEL = 61 ...@@ -311,6 +340,8 @@ IP_DUMMYNET_DEL = 61
IP_DUMMYNET_FLUSH = 62 IP_DUMMYNET_FLUSH = 62
IP_DUMMYNET_GET = 64 IP_DUMMYNET_GET = 64
IP_RECVTTL = 65 IP_RECVTTL = 65
IP_MINTTL = 66
IP_DONTFRAG = 67
IP_DEFAULT_MULTICAST_TTL = 1 IP_DEFAULT_MULTICAST_TTL = 1
IP_DEFAULT_MULTICAST_LOOP = 1 IP_DEFAULT_MULTICAST_LOOP = 1
IP_MAX_MEMBERSHIPS = 20 IP_MAX_MEMBERSHIPS = 20
...@@ -339,7 +370,7 @@ def in_nullhost(x): return ((x).s_addr == INADDR_ANY) ...@@ -339,7 +370,7 @@ def in_nullhost(x): return ((x).s_addr == INADDR_ANY)
# Included from netinet6/in6.h # Included from netinet6/in6.h
__KAME_VERSION = "20010528/FreeBSD" __KAME_VERSION = "FreeBSD"
IPV6PORT_RESERVED = 1024 IPV6PORT_RESERVED = 1024
IPV6PORT_ANONMIN = 49152 IPV6PORT_ANONMIN = 49152
IPV6PORT_ANONMAX = 65535 IPV6PORT_ANONMAX = 65535
...@@ -348,8 +379,8 @@ IPV6PORT_RESERVEDMAX = (IPV6PORT_RESERVED-1) ...@@ -348,8 +379,8 @@ IPV6PORT_RESERVEDMAX = (IPV6PORT_RESERVED-1)
INET6_ADDRSTRLEN = 46 INET6_ADDRSTRLEN = 46
IPV6_ADDR_INT32_ONE = 1 IPV6_ADDR_INT32_ONE = 1
IPV6_ADDR_INT32_TWO = 2 IPV6_ADDR_INT32_TWO = 2
IPV6_ADDR_INT32_MNL = (-16711680) IPV6_ADDR_INT32_MNL = 0xff010000
IPV6_ADDR_INT32_MLL = (-16646144) IPV6_ADDR_INT32_MLL = 0xff020000
IPV6_ADDR_INT32_SMP = 0x0000ffff IPV6_ADDR_INT32_SMP = 0x0000ffff
IPV6_ADDR_INT16_ULL = 0xfe80 IPV6_ADDR_INT16_ULL = 0xfe80
IPV6_ADDR_INT16_USL = 0xfec0 IPV6_ADDR_INT16_USL = 0xfec0
...@@ -358,7 +389,7 @@ IPV6_ADDR_INT32_ONE = 0x01000000 ...@@ -358,7 +389,7 @@ IPV6_ADDR_INT32_ONE = 0x01000000
IPV6_ADDR_INT32_TWO = 0x02000000 IPV6_ADDR_INT32_TWO = 0x02000000
IPV6_ADDR_INT32_MNL = 0x000001ff IPV6_ADDR_INT32_MNL = 0x000001ff
IPV6_ADDR_INT32_MLL = 0x000002ff IPV6_ADDR_INT32_MLL = 0x000002ff
IPV6_ADDR_INT32_SMP = (-65536) IPV6_ADDR_INT32_SMP = 0xffff0000
IPV6_ADDR_INT16_ULL = 0x80fe IPV6_ADDR_INT16_ULL = 0x80fe
IPV6_ADDR_INT16_USL = 0xc0fe IPV6_ADDR_INT16_USL = 0xc0fe
IPV6_ADDR_INT16_MLL = 0x02ff IPV6_ADDR_INT16_MLL = 0x02ff
...@@ -511,5 +542,10 @@ IPV6CTL_AUTO_LINKLOCAL = 35 ...@@ -511,5 +542,10 @@ IPV6CTL_AUTO_LINKLOCAL = 35
IPV6CTL_RIP6STATS = 36 IPV6CTL_RIP6STATS = 36
IPV6CTL_PREFER_TEMPADDR = 37 IPV6CTL_PREFER_TEMPADDR = 37
IPV6CTL_ADDRCTLPOLICY = 38 IPV6CTL_ADDRCTLPOLICY = 38
IPV6CTL_USE_DEFAULTZONE = 39
IPV6CTL_MAXFRAGS = 41 IPV6CTL_MAXFRAGS = 41
IPV6CTL_MAXID = 42 IPV6CTL_IFQ = 42
IPV6CTL_ISATAPRTR = 43
IPV6CTL_MCAST_PMTU = 44
IPV6CTL_STEALTH = 45
IPV6CTL_MAXID = 46
...@@ -10,9 +10,9 @@ __GNUCLIKE_ATTRIBUTE_MODE_DI = 1 ...@@ -10,9 +10,9 @@ __GNUCLIKE_ATTRIBUTE_MODE_DI = 1
__GNUCLIKE_CTOR_SECTION_HANDLING = 1 __GNUCLIKE_CTOR_SECTION_HANDLING = 1
__GNUCLIKE_BUILTIN_CONSTANT_P = 1 __GNUCLIKE_BUILTIN_CONSTANT_P = 1
__GNUCLIKE_BUILTIN_VARARGS = 1 __GNUCLIKE_BUILTIN_VARARGS = 1
__GNUCLIKE_BUILTIN_STDARG = 1
__GNUCLIKE_BUILTIN_VAALIST = 1 __GNUCLIKE_BUILTIN_VAALIST = 1
__GNUC_VA_LIST_COMPATIBILITY = 1 __GNUC_VA_LIST_COMPATIBILITY = 1
__GNUCLIKE_BUILTIN_STDARG = 1
__GNUCLIKE_BUILTIN_NEXT_ARG = 1 __GNUCLIKE_BUILTIN_NEXT_ARG = 1
__GNUCLIKE_BUILTIN_MEMCPY = 1 __GNUCLIKE_BUILTIN_MEMCPY = 1
__CC_SUPPORTS_INLINE = 1 __CC_SUPPORTS_INLINE = 1
...@@ -51,6 +51,8 @@ def __predict_true(exp): return (exp) ...@@ -51,6 +51,8 @@ def __predict_true(exp): return (exp)
def __predict_false(exp): return (exp) def __predict_false(exp): return (exp)
def __format_arg(fmtarg): return __attribute__((__format_arg__ (fmtarg)))
def __FBSDID(s): return __IDSTRING(__CONCAT(__rcsid_,__LINE__),s) def __FBSDID(s): return __IDSTRING(__CONCAT(__rcsid_,__LINE__),s)
def __RCSID(s): return __IDSTRING(__CONCAT(__rcsid_,__LINE__),s) def __RCSID(s): return __IDSTRING(__CONCAT(__rcsid_,__LINE__),s)
...@@ -247,6 +249,7 @@ IPPROTO_ENCAP = 98 ...@@ -247,6 +249,7 @@ IPPROTO_ENCAP = 98
IPPROTO_APES = 99 IPPROTO_APES = 99
IPPROTO_GMTP = 100 IPPROTO_GMTP = 100
IPPROTO_IPCOMP = 108 IPPROTO_IPCOMP = 108
IPPROTO_SCTP = 132
IPPROTO_PIM = 103 IPPROTO_PIM = 103
IPPROTO_CARP = 112 IPPROTO_CARP = 112
IPPROTO_PGM = 113 IPPROTO_PGM = 113
...@@ -289,6 +292,10 @@ def IN_EXPERIMENTAL(i): return (((u_int32_t)(i) & (-268435456)) == (-268435456)) ...@@ -289,6 +292,10 @@ def IN_EXPERIMENTAL(i): return (((u_int32_t)(i) & (-268435456)) == (-268435456))
def IN_BADCLASS(i): return (((u_int32_t)(i) & (-268435456)) == (-268435456)) def IN_BADCLASS(i): return (((u_int32_t)(i) & (-268435456)) == (-268435456))
def IN_LINKLOCAL(i): return (((u_int32_t)(i) & (-65536)) == (-1442971648))
def IN_LOCAL_GROUP(i): return (((u_int32_t)(i) & (-256)) == (-536870912))
INADDR_NONE = (-1) INADDR_NONE = (-1)
IN_LOOPBACKNET = 127 IN_LOOPBACKNET = 127
IP_OPTIONS = 1 IP_OPTIONS = 1
...@@ -326,14 +333,35 @@ IP_FW_FLUSH = 52 ...@@ -326,14 +333,35 @@ IP_FW_FLUSH = 52
IP_FW_ZERO = 53 IP_FW_ZERO = 53
IP_FW_GET = 54 IP_FW_GET = 54
IP_FW_RESETLOG = 55 IP_FW_RESETLOG = 55
IP_FW_NAT_CFG = 56
IP_FW_NAT_DEL = 57
IP_FW_NAT_GET_CONFIG = 58
IP_FW_NAT_GET_LOG = 59
IP_DUMMYNET_CONFIGURE = 60 IP_DUMMYNET_CONFIGURE = 60
IP_DUMMYNET_DEL = 61 IP_DUMMYNET_DEL = 61
IP_DUMMYNET_FLUSH = 62 IP_DUMMYNET_FLUSH = 62
IP_DUMMYNET_GET = 64 IP_DUMMYNET_GET = 64
IP_RECVTTL = 65 IP_RECVTTL = 65
IP_MINTTL = 66
IP_DONTFRAG = 67
IP_ADD_SOURCE_MEMBERSHIP = 70
IP_DROP_SOURCE_MEMBERSHIP = 71
IP_BLOCK_SOURCE = 72
IP_UNBLOCK_SOURCE = 73
IP_MSFILTER = 74
MCAST_JOIN_GROUP = 80
MCAST_LEAVE_GROUP = 81
MCAST_JOIN_SOURCE_GROUP = 82
MCAST_LEAVE_SOURCE_GROUP = 83
MCAST_BLOCK_SOURCE = 84
MCAST_UNBLOCK_SOURCE = 85
IP_DEFAULT_MULTICAST_TTL = 1 IP_DEFAULT_MULTICAST_TTL = 1
IP_DEFAULT_MULTICAST_LOOP = 1 IP_DEFAULT_MULTICAST_LOOP = 1
IP_MAX_MEMBERSHIPS = 20 IP_MIN_MEMBERSHIPS = 31
IP_MAX_MEMBERSHIPS = 4095
IP_MAX_SOURCE_FILTER = 1024
MCAST_INCLUDE = 1
MCAST_EXCLUDE = 2
IP_PORTRANGE_DEFAULT = 0 IP_PORTRANGE_DEFAULT = 0
IP_PORTRANGE_HIGH = 1 IP_PORTRANGE_HIGH = 1
IP_PORTRANGE_LOW = 2 IP_PORTRANGE_LOW = 2
...@@ -359,7 +387,7 @@ def in_nullhost(x): return ((x).s_addr == INADDR_ANY) ...@@ -359,7 +387,7 @@ def in_nullhost(x): return ((x).s_addr == INADDR_ANY)
# Included from netinet6/in6.h # Included from netinet6/in6.h
__KAME_VERSION = "20010528/FreeBSD" __KAME_VERSION = "FreeBSD"
IPV6PORT_RESERVED = 1024 IPV6PORT_RESERVED = 1024
IPV6PORT_ANONMIN = 49152 IPV6PORT_ANONMIN = 49152
IPV6PORT_ANONMAX = 65535 IPV6PORT_ANONMAX = 65535
...@@ -430,6 +458,8 @@ def IN6_IS_ADDR_MC_GLOBAL(a): return \ ...@@ -430,6 +458,8 @@ def IN6_IS_ADDR_MC_GLOBAL(a): return \
def IN6_IS_SCOPE_LINKLOCAL(a): return \ def IN6_IS_SCOPE_LINKLOCAL(a): return \
def IN6_IS_SCOPE_EMBED(a): return \
def IFA6_IS_DEPRECATED(a): return \ def IFA6_IS_DEPRECATED(a): return \
def IFA6_IS_INVALID(a): return \ def IFA6_IS_INVALID(a): return \
...@@ -488,6 +518,7 @@ IPV6_AUTOFLOWLABEL = 59 ...@@ -488,6 +518,7 @@ IPV6_AUTOFLOWLABEL = 59
IPV6_TCLASS = 61 IPV6_TCLASS = 61
IPV6_DONTFRAG = 62 IPV6_DONTFRAG = 62
IPV6_PREFER_TEMPADDR = 63 IPV6_PREFER_TEMPADDR = 63
IPV6_MSFILTER = 74
IPV6_RTHDR_LOOSE = 0 IPV6_RTHDR_LOOSE = 0
IPV6_RTHDR_STRICT = 1 IPV6_RTHDR_STRICT = 1
IPV6_RTHDR_TYPE_0 = 0 IPV6_RTHDR_TYPE_0 = 0
...@@ -531,5 +562,10 @@ IPV6CTL_AUTO_LINKLOCAL = 35 ...@@ -531,5 +562,10 @@ IPV6CTL_AUTO_LINKLOCAL = 35
IPV6CTL_RIP6STATS = 36 IPV6CTL_RIP6STATS = 36
IPV6CTL_PREFER_TEMPADDR = 37 IPV6CTL_PREFER_TEMPADDR = 37
IPV6CTL_ADDRCTLPOLICY = 38 IPV6CTL_ADDRCTLPOLICY = 38
IPV6CTL_USE_DEFAULTZONE = 39
IPV6CTL_MAXFRAGS = 41 IPV6CTL_MAXFRAGS = 41
IPV6CTL_MAXID = 42 IPV6CTL_IFQ = 42
IPV6CTL_ISATAPRTR = 43
IPV6CTL_MCAST_PMTU = 44
IPV6CTL_STEALTH = 45
IPV6CTL_MAXID = 46
This diff is collapsed.
#! /bin/sh
set -v
python ../../Tools/scripts/h2py.py -i '(u_long)' /usr/include/netinet/in.h
...@@ -16,11 +16,11 @@ integers or floating point numbers, as long as it is consistent. ...@@ -16,11 +16,11 @@ integers or floating point numbers, as long as it is consistent.
Events are specified by tuples (time, priority, action, argument). Events are specified by tuples (time, priority, action, argument).
As in UNIX, lower priority numbers mean higher priority; in this As in UNIX, lower priority numbers mean higher priority; in this
way the queue can be maintained as a priority queue. Execution of the way the queue can be maintained as a priority queue. Execution of the
event means calling the action function, passing it the argument. event means calling the action function, passing it the argument
Remember that in Python, multiple function arguments can be packed sequence in "argument" (remember that in Python, multiple function
in a tuple. The action function may be an instance method so it arguments are be packed in a sequence).
The action function may be an instance method so it
has another way to reference private data (besides global variables). has another way to reference private data (besides global variables).
Parameterless functions or methods cannot be used, however.
""" """
# XXX The timefunc and delayfunc should have been defined as methods # XXX The timefunc and delayfunc should have been defined as methods
...@@ -89,7 +89,7 @@ class scheduler: ...@@ -89,7 +89,7 @@ class scheduler:
exceptions are not caught but the scheduler's state remains exceptions are not caught but the scheduler's state remains
well-defined so run() may be called again. well-defined so run() may be called again.
A questionably hack is added to allow other threads to run: A questionable hack is added to allow other threads to run:
just after an event is executed, a delay of 0 is executed, to just after an event is executed, a delay of 0 is executed, to
avoid monopolizing the CPU when other threads are also avoid monopolizing the CPU when other threads are also
runnable. runnable.
...@@ -111,7 +111,7 @@ class scheduler: ...@@ -111,7 +111,7 @@ class scheduler:
# Verify that the event was not removed or altered # Verify that the event was not removed or altered
# by another thread after we last looked at q[0]. # by another thread after we last looked at q[0].
if event is checked_event: if event is checked_event:
void = action(*argument) action(*argument)
delayfunc(0) # Let other threads run delayfunc(0) # Let other threads run
else: else:
heapq.heappush(event) heapq.heappush(event)
...@@ -221,7 +221,7 @@ class SMTPChannel(asynchat.async_chat): ...@@ -221,7 +221,7 @@ class SMTPChannel(asynchat.async_chat):
def smtp_MAIL(self, arg): def smtp_MAIL(self, arg):
print('===> MAIL', arg, file=DEBUGSTREAM) print('===> MAIL', arg, file=DEBUGSTREAM)
address = self.__getaddr('FROM:', arg) address = self.__getaddr('FROM:', arg) if arg else None
if not address: if not address:
self.push('501 Syntax: MAIL FROM:<address>') self.push('501 Syntax: MAIL FROM:<address>')
return return
...@@ -237,7 +237,7 @@ class SMTPChannel(asynchat.async_chat): ...@@ -237,7 +237,7 @@ class SMTPChannel(asynchat.async_chat):
if not self.__mailfrom: if not self.__mailfrom:
self.push('503 Error: need MAIL command') self.push('503 Error: need MAIL command')
return return
address = self.__getaddr('TO:', arg) address = self.__getaddr('TO:', arg) if arg else None
if not address: if not address:
self.push('501 Syntax: RCPT TO: <address>') self.push('501 Syntax: RCPT TO: <address>')
return return
......
# An example for http://bugs.python.org/issue815646
import thread
while 1:
f = open("/tmp/dupa", "w")
thread.start_new_thread(f.close, ())
f.close()
# f.close() is not thread-safe: calling it at the same time as another
# operation (or another close) on the same file, but done from another
# thread, causes crashes. The issue is more complicated than it seems,
# witness the discussions in:
#
# http://bugs.python.org/issue595601
# http://bugs.python.org/issue815646
import thread
while 1:
f = open("multithreaded_close.tmp", "w")
thread.start_new_thread(f.close, ())
f.close()
This diff is collapsed.
...@@ -1105,6 +1105,7 @@ _expectations = { ...@@ -1105,6 +1105,7 @@ _expectations = {
_expectations['freebsd5'] = _expectations['freebsd4'] _expectations['freebsd5'] = _expectations['freebsd4']
_expectations['freebsd6'] = _expectations['freebsd4'] _expectations['freebsd6'] = _expectations['freebsd4']
_expectations['freebsd7'] = _expectations['freebsd4'] _expectations['freebsd7'] = _expectations['freebsd4']
_expectations['freebsd8'] = _expectations['freebsd4']
class _ExpectedSkips: class _ExpectedSkips:
def __init__(self): def __init__(self):
......
...@@ -13,6 +13,9 @@ class BufferSizeTest(unittest.TestCase): ...@@ -13,6 +13,9 @@ class BufferSizeTest(unittest.TestCase):
# Write s + "\n" + s to file, then open it and ensure that successive # Write s + "\n" + s to file, then open it and ensure that successive
# .readline()s deliver what we wrote. # .readline()s deliver what we wrote.
# Ensure we can open TESTFN for writing.
test_support.unlink(test_support.TESTFN)
# Since C doesn't guarantee we can write/read arbitrary bytes in text # Since C doesn't guarantee we can write/read arbitrary bytes in text
# files, use binary mode. # files, use binary mode.
f = open(test_support.TESTFN, "wb") f = open(test_support.TESTFN, "wb")
...@@ -31,11 +34,7 @@ class BufferSizeTest(unittest.TestCase): ...@@ -31,11 +34,7 @@ class BufferSizeTest(unittest.TestCase):
self.assert_(not line) # Must be at EOF self.assert_(not line) # Must be at EOF
f.close() f.close()
finally: finally:
try: test_support.unlink(test_support.TESTFN)
import os
os.unlink(test_support.TESTFN)
except:
pass
def drive_one(self, pattern): def drive_one(self, pattern):
for length in lengths: for length in lengths:
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
import unittest import unittest
from test import test_support from test import test_support
from collections import NamedTuple from collections import namedtuple
from collections import Hashable, Iterable, Iterator from collections import Hashable, Iterable, Iterator
from collections import Sized, Container, Callable from collections import Sized, Container, Callable
from collections import Set, MutableSet from collections import Set, MutableSet
...@@ -13,18 +13,27 @@ from collections import Sequence, MutableSequence ...@@ -13,18 +13,27 @@ from collections import Sequence, MutableSequence
class TestNamedTuple(unittest.TestCase): class TestNamedTuple(unittest.TestCase):
def test_factory(self): def test_factory(self):
Point = NamedTuple('Point', 'x y') Point = namedtuple('Point', 'x y')
self.assertEqual(Point.__name__, 'Point') self.assertEqual(Point.__name__, 'Point')
self.assertEqual(Point.__doc__, 'Point(x, y)') self.assertEqual(Point.__doc__, 'Point(x, y)')
self.assertEqual(Point.__slots__, ()) self.assertEqual(Point.__slots__, ())
self.assertEqual(Point.__module__, __name__) self.assertEqual(Point.__module__, __name__)
self.assertEqual(Point.__getitem__, tuple.__getitem__) self.assertEqual(Point.__getitem__, tuple.__getitem__)
self.assertRaises(ValueError, NamedTuple, 'abc%', 'def ghi')
self.assertRaises(ValueError, NamedTuple, 'abc', 'def g%hi') self.assertRaises(ValueError, namedtuple, 'abc%', 'efg ghi') # type has non-alpha char
NamedTuple('Point0', 'x1 y2') # Verify that numbers are allowed in names self.assertRaises(ValueError, namedtuple, 'class', 'efg ghi') # type has keyword
self.assertRaises(ValueError, namedtuple, '9abc', 'efg ghi') # type starts with digit
self.assertRaises(ValueError, namedtuple, 'abc', 'efg g%hi') # field with non-alpha char
self.assertRaises(ValueError, namedtuple, 'abc', 'abc class') # field has keyword
self.assertRaises(ValueError, namedtuple, 'abc', '8efg 9ghi') # field starts with digit
self.assertRaises(ValueError, namedtuple, 'abc', '__efg__ ghi') # field with double underscores
self.assertRaises(ValueError, namedtuple, 'abc', 'efg efg ghi') # duplicate field
namedtuple('Point0', 'x1 y2') # Verify that numbers are allowed in names
def test_instance(self): def test_instance(self):
Point = NamedTuple('Point', 'x y') Point = namedtuple('Point', 'x y')
p = Point(11, 22) p = Point(11, 22)
self.assertEqual(p, Point(x=11, y=22)) self.assertEqual(p, Point(x=11, y=22))
self.assertEqual(p, Point(11, y=22)) self.assertEqual(p, Point(11, y=22))
...@@ -40,14 +49,20 @@ class TestNamedTuple(unittest.TestCase): ...@@ -40,14 +49,20 @@ class TestNamedTuple(unittest.TestCase):
self.assert_('__weakref__' not in dir(p)) self.assert_('__weakref__' not in dir(p))
self.assertEqual(p.__fields__, ('x', 'y')) # test __fields__ attribute self.assertEqual(p.__fields__, ('x', 'y')) # test __fields__ attribute
self.assertEqual(p.__replace__('x', 1), (1, 22)) # test __replace__ method self.assertEqual(p.__replace__('x', 1), (1, 22)) # test __replace__ method
self.assertEqual(p.__asdict__(), dict(x=11, y=22)) # test __dict__ method
# verify that field string can have commas # verify that field string can have commas
Point = NamedTuple('Point', 'x, y') Point = namedtuple('Point', 'x, y')
p = Point(x=11, y=22)
self.assertEqual(repr(p), 'Point(x=11, y=22)')
# verify that fieldspec can be a non-string sequence
Point = namedtuple('Point', ('x', 'y'))
p = Point(x=11, y=22) p = Point(x=11, y=22)
self.assertEqual(repr(p), 'Point(x=11, y=22)') self.assertEqual(repr(p), 'Point(x=11, y=22)')
def test_tupleness(self): def test_tupleness(self):
Point = NamedTuple('Point', 'x y') Point = namedtuple('Point', 'x y')
p = Point(11, 22) p = Point(11, 22)
self.assert_(isinstance(p, tuple)) self.assert_(isinstance(p, tuple))
...@@ -66,9 +81,9 @@ class TestNamedTuple(unittest.TestCase): ...@@ -66,9 +81,9 @@ class TestNamedTuple(unittest.TestCase):
self.assertRaises(AttributeError, eval, 'p.z', locals()) self.assertRaises(AttributeError, eval, 'p.z', locals())
def test_odd_sizes(self): def test_odd_sizes(self):
Zero = NamedTuple('Zero', '') Zero = namedtuple('Zero', '')
self.assertEqual(Zero(), ()) self.assertEqual(Zero(), ())
Dot = NamedTuple('Dot', 'd') Dot = namedtuple('Dot', 'd')
self.assertEqual(Dot(1), (1,)) self.assertEqual(Dot(1), (1,))
......
...@@ -95,35 +95,61 @@ RoundingDict = {'ceiling' : ROUND_CEILING, #Maps test-case names to roundings. ...@@ -95,35 +95,61 @@ RoundingDict = {'ceiling' : ROUND_CEILING, #Maps test-case names to roundings.
# Name adapter to be able to change the Decimal and Context # Name adapter to be able to change the Decimal and Context
# interface without changing the test files from Cowlishaw # interface without changing the test files from Cowlishaw
nameAdapter = {'toeng':'to_eng_string', nameAdapter = {'and':'logical_and',
'tosci':'to_sci_string',
'samequantum':'same_quantum',
'tointegral':'to_integral_value',
'tointegralx':'to_integral_exact',
'remaindernear':'remainder_near',
'divideint':'divide_int',
'squareroot':'sqrt',
'apply':'_apply', 'apply':'_apply',
'class':'number_class', 'class':'number_class',
'comparesig':'compare_signal', 'comparesig':'compare_signal',
'comparetotal':'compare_total', 'comparetotal':'compare_total',
'comparetotmag':'compare_total_mag', 'comparetotmag':'compare_total_mag',
'copyabs':'copy_abs',
'copy':'copy_decimal', 'copy':'copy_decimal',
'copyabs':'copy_abs',
'copynegate':'copy_negate', 'copynegate':'copy_negate',
'copysign':'copy_sign', 'copysign':'copy_sign',
'and':'logical_and', 'divideint':'divide_int',
'or':'logical_or',
'xor':'logical_xor',
'invert':'logical_invert', 'invert':'logical_invert',
'iscanonical':'is_canonical',
'isfinite':'is_finite',
'isinfinite':'is_infinite',
'isnan':'is_nan',
'isnormal':'is_normal',
'isqnan':'is_qnan',
'issigned':'is_signed',
'issnan':'is_snan',
'issubnormal':'is_subnormal',
'iszero':'is_zero',
'maxmag':'max_mag', 'maxmag':'max_mag',
'minmag':'min_mag', 'minmag':'min_mag',
'nextminus':'next_minus', 'nextminus':'next_minus',
'nextplus':'next_plus', 'nextplus':'next_plus',
'nexttoward':'next_toward', 'nexttoward':'next_toward',
'or':'logical_or',
'reduce':'normalize', 'reduce':'normalize',
'remaindernear':'remainder_near',
'samequantum':'same_quantum',
'squareroot':'sqrt',
'toeng':'to_eng_string',
'tointegral':'to_integral_value',
'tointegralx':'to_integral_exact',
'tosci':'to_sci_string',
'xor':'logical_xor',
} }
# The following functions return True/False rather than a Decimal instance
LOGICAL_FUNCTIONS = (
'is_canonical',
'is_finite',
'is_infinite',
'is_nan',
'is_normal',
'is_qnan',
'is_signed',
'is_snan',
'is_subnormal',
'is_zero',
'same_quantum',
)
# For some operations (currently exp, ln, log10, power), the decNumber # For some operations (currently exp, ln, log10, power), the decNumber
# reference implementation imposes additional restrictions on the # reference implementation imposes additional restrictions on the
# context and operands. These restrictions are not part of the # context and operands. These restrictions are not part of the
...@@ -321,7 +347,7 @@ class DecimalTest(unittest.TestCase): ...@@ -321,7 +347,7 @@ class DecimalTest(unittest.TestCase):
print("--", self.context) print("--", self.context)
try: try:
result = str(funct(*vals)) result = str(funct(*vals))
if fname == 'same_quantum': if fname in LOGICAL_FUNCTIONS:
result = str(int(eval(result))) # 'True', 'False' -> '1', '0' result = str(int(eval(result))) # 'True', 'False' -> '1', '0'
except Signals as error: except Signals as error:
self.fail("Raised %s in %s" % (error, s)) self.fail("Raised %s in %s" % (error, s))
...@@ -426,13 +452,18 @@ class DecimalExplicitConstructionTest(unittest.TestCase): ...@@ -426,13 +452,18 @@ class DecimalExplicitConstructionTest(unittest.TestCase):
#bad sign #bad sign
self.assertRaises(ValueError, Decimal, (8, (4, 3, 4, 9, 1), 2) ) self.assertRaises(ValueError, Decimal, (8, (4, 3, 4, 9, 1), 2) )
self.assertRaises(ValueError, Decimal, (0., (4, 3, 4, 9, 1), 2) )
self.assertRaises(ValueError, Decimal, (Decimal(1), (4, 3, 4, 9, 1), 2))
#bad exp #bad exp
self.assertRaises(ValueError, Decimal, (1, (4, 3, 4, 9, 1), 'wrong!') ) self.assertRaises(ValueError, Decimal, (1, (4, 3, 4, 9, 1), 'wrong!') )
self.assertRaises(ValueError, Decimal, (1, (4, 3, 4, 9, 1), 0.) )
self.assertRaises(ValueError, Decimal, (1, (4, 3, 4, 9, 1), '1') )
#bad coefficients #bad coefficients
self.assertRaises(ValueError, Decimal, (1, (4, 3, 4, None, 1), 2) ) self.assertRaises(ValueError, Decimal, (1, (4, 3, 4, None, 1), 2) )
self.assertRaises(ValueError, Decimal, (1, (4, -3, 4, 9, 1), 2) ) self.assertRaises(ValueError, Decimal, (1, (4, -3, 4, 9, 1), 2) )
self.assertRaises(ValueError, Decimal, (1, (4, 10, 4, 9, 1), 2) )
def test_explicit_from_Decimal(self): def test_explicit_from_Decimal(self):
...@@ -1025,6 +1056,28 @@ class DecimalUsabilityTest(unittest.TestCase): ...@@ -1025,6 +1056,28 @@ class DecimalUsabilityTest(unittest.TestCase):
d = Decimal("Infinity") d = Decimal("Infinity")
self.assertEqual(d.as_tuple(), (0, (0,), 'F') ) self.assertEqual(d.as_tuple(), (0, (0,), 'F') )
#leading zeros in coefficient should be stripped
d = Decimal( (0, (0, 0, 4, 0, 5, 3, 4), -2) )
self.assertEqual(d.as_tuple(), (0, (4, 0, 5, 3, 4), -2) )
d = Decimal( (1, (0, 0, 0), 37) )
self.assertEqual(d.as_tuple(), (1, (0,), 37))
d = Decimal( (1, (), 37) )
self.assertEqual(d.as_tuple(), (1, (0,), 37))
#leading zeros in NaN diagnostic info should be stripped
d = Decimal( (0, (0, 0, 4, 0, 5, 3, 4), 'n') )
self.assertEqual(d.as_tuple(), (0, (4, 0, 5, 3, 4), 'n') )
d = Decimal( (1, (0, 0, 0), 'N') )
self.assertEqual(d.as_tuple(), (1, (), 'N') )
d = Decimal( (1, (), 'n') )
self.assertEqual(d.as_tuple(), (1, (), 'n') )
#coefficient in infinity should be ignored
d = Decimal( (0, (4, 5, 3, 4), 'F') )
self.assertEqual(d.as_tuple(), (0, (0,), 'F'))
d = Decimal( (1, (0, 2, 7, 1), 'F') )
self.assertEqual(d.as_tuple(), (1, (0,), 'F'))
def test_immutability_operations(self): def test_immutability_operations(self):
# Do operations and check that it didn't change change internal objects. # Do operations and check that it didn't change change internal objects.
......
...@@ -47,6 +47,26 @@ class TestBasic(unittest.TestCase): ...@@ -47,6 +47,26 @@ class TestBasic(unittest.TestCase):
self.assertEqual(right, list(range(150, 400))) self.assertEqual(right, list(range(150, 400)))
self.assertEqual(list(d), list(range(50, 150))) self.assertEqual(list(d), list(range(50, 150)))
def test_maxlen(self):
self.assertRaises(ValueError, deque, 'abc', -1)
self.assertRaises(ValueError, deque, 'abc', -2)
d = deque(range(10), maxlen=3)
self.assertEqual(repr(d), 'deque([7, 8, 9], maxlen=3)')
self.assertEqual(list(d), [7, 8, 9])
self.assertEqual(d, deque(range(10), 3))
d.append(10)
self.assertEqual(list(d), [8, 9, 10])
d.appendleft(7)
self.assertEqual(list(d), [7, 8, 9])
d.extend([10, 11])
self.assertEqual(list(d), [9, 10, 11])
d.extendleft([8, 7])
self.assertEqual(list(d), [7, 8, 9])
d = deque(range(200), maxlen=10)
d.append(d)
d = deque(range(10), maxlen=None)
self.assertEqual(repr(d), 'deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])')
def test_comparisons(self): def test_comparisons(self):
d = deque('xabc'); d.popleft() d = deque('xabc'); d.popleft()
for e in [d, deque('abc'), deque('ab'), deque(), list(d)]: for e in [d, deque('abc'), deque('ab'), deque(), list(d)]:
...@@ -254,7 +274,7 @@ class TestBasic(unittest.TestCase): ...@@ -254,7 +274,7 @@ class TestBasic(unittest.TestCase):
os.remove(test_support.TESTFN) os.remove(test_support.TESTFN)
def test_init(self): def test_init(self):
self.assertRaises(TypeError, deque, 'abc', 2); self.assertRaises(TypeError, deque, 'abc', 2, 3);
self.assertRaises(TypeError, deque, 1); self.assertRaises(TypeError, deque, 1);
def test_hash(self): def test_hash(self):
...@@ -340,13 +360,13 @@ class TestBasic(unittest.TestCase): ...@@ -340,13 +360,13 @@ class TestBasic(unittest.TestCase):
self.assertNotEqual(id(d), id(e)) self.assertNotEqual(id(d), id(e))
self.assertEqual(list(d), list(e)) self.assertEqual(list(d), list(e))
def test_pickle_recursive(self): ## def test_pickle_recursive(self):
d = deque('abc') ## d = deque('abc')
d.append(d) ## d.append(d)
for i in (0, 1, 2): ## for i in (0, 1, 2):
e = pickle.loads(pickle.dumps(d, i)) ## e = pickle.loads(pickle.dumps(d, i))
self.assertNotEqual(id(d), id(e)) ## self.assertNotEqual(id(d), id(e))
self.assertEqual(id(e), id(e[-1])) ## self.assertEqual(id(e), id(e[-1]))
def test_deepcopy(self): def test_deepcopy(self):
mut = [10] mut = [10]
...@@ -452,24 +472,40 @@ class TestSubclass(unittest.TestCase): ...@@ -452,24 +472,40 @@ class TestSubclass(unittest.TestCase):
self.assertEqual(type(d), type(e)) self.assertEqual(type(d), type(e))
self.assertEqual(list(d), list(e)) self.assertEqual(list(d), list(e))
def test_pickle(self): d = Deque('abcde', maxlen=4)
d = Deque('abc')
d.append(d)
e = pickle.loads(pickle.dumps(d)) e = d.__copy__()
self.assertNotEqual(id(d), id(e))
self.assertEqual(type(d), type(e)) self.assertEqual(type(d), type(e))
dd = d.pop() self.assertEqual(list(d), list(e))
ee = e.pop()
self.assertEqual(id(e), id(ee)) e = Deque(d)
self.assertEqual(d, e) self.assertEqual(type(d), type(e))
self.assertEqual(list(d), list(e))
d.x = d s = pickle.dumps(d)
e = pickle.loads(pickle.dumps(d)) e = pickle.loads(s)
self.assertEqual(id(e), id(e.x)) self.assertNotEqual(id(d), id(e))
self.assertEqual(type(d), type(e))
self.assertEqual(list(d), list(e))
d = DequeWithBadIter('abc') ## def test_pickle(self):
self.assertRaises(TypeError, pickle.dumps, d) ## d = Deque('abc')
## d.append(d)
##
## e = pickle.loads(pickle.dumps(d))
## self.assertNotEqual(id(d), id(e))
## self.assertEqual(type(d), type(e))
## dd = d.pop()
## ee = e.pop()
## self.assertEqual(id(e), id(ee))
## self.assertEqual(d, e)
##
## d.x = d
## e = pickle.loads(pickle.dumps(d))
## self.assertEqual(id(e), id(e.x))
##
## d = DequeWithBadIter('abc')
## self.assertRaises(TypeError, pickle.dumps, d)
def test_weakref(self): def test_weakref(self):
d = deque('gallahad') d = deque('gallahad')
......
...@@ -23,7 +23,7 @@ if sys.platform.startswith('atheos'): ...@@ -23,7 +23,7 @@ if sys.platform.startswith('atheos'):
if sys.platform in ('netbsd1', 'netbsd2', 'netbsd3', if sys.platform in ('netbsd1', 'netbsd2', 'netbsd3',
'Darwin1.2', 'darwin', 'Darwin1.2', 'darwin',
'freebsd2', 'freebsd3', 'freebsd4', 'freebsd5', 'freebsd2', 'freebsd3', 'freebsd4', 'freebsd5',
'freebsd6', 'freebsd7', 'freebsd6', 'freebsd7', 'freebsd8',
'bsdos2', 'bsdos3', 'bsdos4', 'bsdos2', 'bsdos3', 'bsdos4',
'openbsd', 'openbsd2', 'openbsd3', 'openbsd4'): 'openbsd', 'openbsd2', 'openbsd3', 'openbsd4'):
if struct.calcsize('l') == 8: if struct.calcsize('l') == 8:
......
...@@ -83,13 +83,25 @@ class BasicTest(TestCase): ...@@ -83,13 +83,25 @@ class BasicTest(TestCase):
resp = httplib.HTTPResponse(sock) resp = httplib.HTTPResponse(sock)
resp.begin() resp.begin()
self.assertEqual(resp.read(), b"Text") self.assertEqual(resp.read(), b"Text")
resp.close() self.assertTrue(resp.isclosed())
body = "HTTP/1.1 400.100 Not Ok\r\n\r\nText" body = "HTTP/1.1 400.100 Not Ok\r\n\r\nText"
sock = FakeSocket(body) sock = FakeSocket(body)
resp = httplib.HTTPResponse(sock) resp = httplib.HTTPResponse(sock)
self.assertRaises(httplib.BadStatusLine, resp.begin) self.assertRaises(httplib.BadStatusLine, resp.begin)
def test_partial_reads(self):
# if we have a lenght, the system knows when to close itself
# same behaviour than when we read the whole thing with read()
body = "HTTP/1.1 200 Ok\r\nContent-Length: 4\r\n\r\nText"
sock = FakeSocket(body)
resp = httplib.HTTPResponse(sock)
resp.begin()
self.assertEqual(resp.read(2), b'Te')
self.assertFalse(resp.isclosed())
self.assertEqual(resp.read(2), b'xt')
self.assertTrue(resp.isclosed())
def test_host_port(self): def test_host_port(self):
# Check invalid host_port # Check invalid host_port
...@@ -135,7 +147,6 @@ class BasicTest(TestCase): ...@@ -135,7 +147,6 @@ class BasicTest(TestCase):
resp.begin() resp.begin()
if resp.read(): if resp.read():
self.fail("Did not expect response from HEAD request") self.fail("Did not expect response from HEAD request")
resp.close()
def test_send_file(self): def test_send_file(self):
expected = (b'GET /foo HTTP/1.1\r\nHost: example.com\r\n' expected = (b'GET /foo HTTP/1.1\r\nHost: example.com\r\n'
......
...@@ -55,9 +55,14 @@ class TestBasicOps(unittest.TestCase): ...@@ -55,9 +55,14 @@ class TestBasicOps(unittest.TestCase):
self.assertEqual(lzip('abc',count()), [('a', 0), ('b', 1), ('c', 2)]) self.assertEqual(lzip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
self.assertEqual(lzip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)]) self.assertEqual(lzip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
self.assertEqual(take(2, lzip('abc',count(3))), [('a', 3), ('b', 4)]) self.assertEqual(take(2, lzip('abc',count(3))), [('a', 3), ('b', 4)])
self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
self.assertRaises(TypeError, count, 2, 3) self.assertRaises(TypeError, count, 2, 3)
self.assertRaises(TypeError, count, 'a') self.assertRaises(TypeError, count, 'a')
self.assertRaises(OverflowError, list, islice(count(maxsize-5), 10)) self.assertEqual(list(islice(count(maxsize-5), 10)),
list(range(maxsize-5, maxsize+5)))
self.assertEqual(list(islice(count(-maxsize-5), 10)),
list(range(-maxsize-5, -maxsize+5)))
c = count(3) c = count(3)
self.assertEqual(repr(c), 'count(3)') self.assertEqual(repr(c), 'count(3)')
next(c) next(c)
...@@ -66,6 +71,11 @@ class TestBasicOps(unittest.TestCase): ...@@ -66,6 +71,11 @@ class TestBasicOps(unittest.TestCase):
self.assertEqual(repr(c), 'count(-9)') self.assertEqual(repr(c), 'count(-9)')
next(c) next(c)
self.assertEqual(next(c), -8) self.assertEqual(next(c), -8)
for i in (-sys.maxint-5, -sys.maxint+5 ,-10, -1, 0, 10, sys.maxint-5, sys.maxint+5):
# Test repr (ignoring the L in longs)
r1 = repr(count(i)).replace('L', '')
r2 = 'count(%r)'.__mod__(i).replace('L', '')
self.assertEqual(r1, r2)
def test_cycle(self): def test_cycle(self):
self.assertEqual(take(10, cycle('abc')), list('abcabcabca')) self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
......
import unittest import unittest
import sys
from test import test_support, list_tests from test import test_support, list_tests
class ListTest(list_tests.CommonTest): class ListTest(list_tests.CommonTest):
...@@ -18,6 +19,14 @@ class ListTest(list_tests.CommonTest): ...@@ -18,6 +19,14 @@ class ListTest(list_tests.CommonTest):
self.assertEqual(len([0]), 1) self.assertEqual(len([0]), 1)
self.assertEqual(len([0, 1, 2]), 3) self.assertEqual(len([0, 1, 2]), 3)
def test_overflow(self):
lst = [4, 5, 6, 7]
n = int((sys.maxint*2+2) // len(lst))
def mul(a, b): return a * b
def imul(a, b): a *= b
self.assertRaises((MemoryError, OverflowError), mul, lst, n)
self.assertRaises((MemoryError, OverflowError), imul, lst, n)
def test_main(verbose=None): def test_main(verbose=None):
test_support.run_unittest(ListTest) test_support.run_unittest(ListTest)
......
...@@ -339,6 +339,50 @@ class MmapTests(unittest.TestCase): ...@@ -339,6 +339,50 @@ class MmapTests(unittest.TestCase):
m[start:stop:step] = data m[start:stop:step] = data
self.assertEquals(m[:], bytes(L)) self.assertEquals(m[:], bytes(L))
def make_mmap_file (self, f, halfsize):
# Write 2 pages worth of data to the file
f.write (b'\0' * halfsize)
f.write (b'foo')
f.write (b'\0' * (halfsize - 3))
f.flush ()
return mmap.mmap (f.fileno(), 0)
def test_offset (self):
f = open (TESTFN, 'w+b')
try: # unlink TESTFN no matter what
halfsize = mmap.ALLOCATIONGRANULARITY
m = self.make_mmap_file (f, halfsize)
m.close ()
f.close ()
mapsize = halfsize * 2
# Try invalid offset
f = open(TESTFN, "r+b")
for offset in [-2, -1, None]:
try:
m = mmap.mmap(f.fileno(), mapsize, offset=offset)
self.assertEqual(0, 1)
except (ValueError, TypeError, OverflowError):
pass
else:
self.assertEqual(0, 0)
f.close()
# Try valid offset, hopefully 8192 works on all OSes
f = open(TESTFN, "r+b")
m = mmap.mmap(f.fileno(), mapsize - halfsize, offset=halfsize)
self.assertEqual(m[0:3], b'foo')
f.close()
m.close()
finally:
f.close()
try:
os.unlink(TESTFN)
except OSError:
pass
def test_main(): def test_main():
run_unittest(MmapTests) run_unittest(MmapTests)
......
...@@ -338,7 +338,7 @@ class GeneralModuleTests(unittest.TestCase): ...@@ -338,7 +338,7 @@ class GeneralModuleTests(unittest.TestCase):
# I've ordered this by protocols that have both a tcp and udp # I've ordered this by protocols that have both a tcp and udp
# protocol, at least for modern Linuxes. # protocol, at least for modern Linuxes.
if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
'freebsd7', 'darwin'): 'freebsd7', 'freebsd8', 'darwin'):
# avoid the 'echo' service on this platform, as there is an # avoid the 'echo' service on this platform, as there is an
# assumption breaking non-standard port/protocol entry # assumption breaking non-standard port/protocol entry
services = ('daytime', 'qotd', 'domain') services = ('daytime', 'qotd', 'domain')
......
...@@ -100,10 +100,19 @@ def bind_port(sock, host='', preferred_port=54321): ...@@ -100,10 +100,19 @@ def bind_port(sock, host='', preferred_port=54321):
tests and we don't try multiple ports, the test can fails. This tests and we don't try multiple ports, the test can fails. This
makes the test more robust.""" makes the test more robust."""
# some random ports that hopefully no one is listening on. # Find some random ports that hopefully no one is listening on.
for port in [preferred_port, 9907, 10243, 32999]: # Ideally each test would clean up after itself and not continue listening
# on any ports. However, this isn't the case. The last port (0) is
# a stop-gap that asks the O/S to assign a port. Whenever the warning
# message below is printed, the test that is listening on the port should
# be fixed to close the socket at the end of the test.
# Another reason why we can't use a port is another process (possibly
# another instance of the test suite) is using the same port.
for port in [preferred_port, 9907, 10243, 32999, 0]:
try: try:
sock.bind((host, port)) sock.bind((host, port))
if port == 0:
port = sock.getsockname()[1]
return port return port
except socket.error as e: except socket.error as e:
(err, msg) = e.args (err, msg) = e.args
...@@ -519,8 +528,7 @@ def _run_suite(suite): ...@@ -519,8 +528,7 @@ def _run_suite(suite):
elif len(result.failures) == 1 and not result.errors: elif len(result.failures) == 1 and not result.errors:
err = result.failures[0][1] err = result.failures[0][1]
else: else:
msg = "errors occurred; run in verbose mode for details" err = "errors occurred; run in verbose mode for details"
raise TestFailed(msg)
raise TestFailed(err) raise TestFailed(err)
......
...@@ -93,6 +93,13 @@ class TestCRLFNewlines(TestGenericUnivNewlines): ...@@ -93,6 +93,13 @@ class TestCRLFNewlines(TestGenericUnivNewlines):
NEWLINE = '\r\n' NEWLINE = '\r\n'
DATA = DATA_CRLF DATA = DATA_CRLF
def test_tell(self):
fp = open(test_support.TESTFN, self.READMODE)
self.assertEqual(repr(fp.newlines), repr(None))
data = fp.readline()
pos = fp.tell()
self.assertEqual(repr(fp.newlines), repr(self.NEWLINE))
class TestMixedNewlines(TestGenericUnivNewlines): class TestMixedNewlines(TestGenericUnivNewlines):
NEWLINE = ('\r', '\n') NEWLINE = ('\r', '\n')
DATA = DATA_MIXED DATA = DATA_MIXED
......
...@@ -42,14 +42,18 @@ class ChecksumTestCase(unittest.TestCase): ...@@ -42,14 +42,18 @@ class ChecksumTestCase(unittest.TestCase):
class ExceptionTestCase(unittest.TestCase): class ExceptionTestCase(unittest.TestCase):
# make sure we generate some expected errors # make sure we generate some expected errors
def test_bigbits(self): def test_badlevel(self):
# specifying total bits too large causes an error # specifying compression level out of range causes an error
self.assertRaises(zlib.error, # (but -1 is Z_DEFAULT_COMPRESSION and apparently the zlib
zlib.compress, 'ERROR', zlib.MAX_WBITS + 1) # accepts 0 too)
self.assertRaises(zlib.error, zlib.compress, 'ERROR', 10)
def test_badcompressobj(self): def test_badcompressobj(self):
# verify failure on building compress object with bad params # verify failure on building compress object with bad params
self.assertRaises(ValueError, zlib.compressobj, 1, zlib.DEFLATED, 0) self.assertRaises(ValueError, zlib.compressobj, 1, zlib.DEFLATED, 0)
# specifying total bits too large causes an error
self.assertRaises(ValueError,
zlib.compressobj, 1, zlib.DEFLATED, zlib.MAX_WBITS + 1)
def test_baddecompressobj(self): def test_baddecompressobj(self):
# verify failure on building decompress object with bad params # verify failure on building decompress object with bad params
......
...@@ -960,7 +960,7 @@ class CharacterData(Childless, Node): ...@@ -960,7 +960,7 @@ class CharacterData(Childless, Node):
dotdotdot = "..." dotdotdot = "..."
else: else:
dotdotdot = "" dotdotdot = ""
return "<DOM %s node \"%s%s\">" % ( return '<DOM %s node "%r%s">' % (
self.__class__.__name__, data[0:10], dotdotdot) self.__class__.__name__, data[0:10], dotdotdot)
def substringData(self, offset, count): def substringData(self, offset, count):
......
...@@ -336,7 +336,8 @@ LIBRARY_OBJS= \ ...@@ -336,7 +336,8 @@ LIBRARY_OBJS= \
# Rules # Rules
# Default target # Default target
all: $(BUILDPYTHON) oldsharedmods sharedmods all: build_all
build_all: $(BUILDPYTHON) oldsharedmods sharedmods
# Build the interpreter # Build the interpreter
$(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY) $(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY)
...@@ -476,7 +477,7 @@ Modules/python.o: $(srcdir)/Modules/python.c ...@@ -476,7 +477,7 @@ Modules/python.o: $(srcdir)/Modules/python.c
$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)
-@ mkdir Include -@$(INSTALL) -d Include
-$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C) -$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
$(PGEN): $(PGENOBJS) $(PGEN): $(PGENOBJS)
...@@ -758,7 +759,7 @@ LIBSUBDIRS= lib-tk site-packages test test/output test/data \ ...@@ -758,7 +759,7 @@ LIBSUBDIRS= lib-tk site-packages test test/output test/data \
distutils distutils/command distutils/tests $(XMLLIBSUBDIRS) \ distutils distutils/command distutils/tests $(XMLLIBSUBDIRS) \
setuptools setuptools/command setuptools/tests setuptools.egg-info \ setuptools setuptools/command setuptools/tests setuptools.egg-info \
curses $(MACHDEPS) curses $(MACHDEPS)
libinstall: $(BUILDPYTHON) $(srcdir)/Lib/$(PLATDIR) libinstall: build_all $(srcdir)/Lib/$(PLATDIR)
@for i in $(SCRIPTDIR) $(LIBDEST); \ @for i in $(SCRIPTDIR) $(LIBDEST); \
do \ do \
if test ! -d $(DESTDIR)$$i; then \ if test ! -d $(DESTDIR)$$i; then \
...@@ -1126,7 +1127,7 @@ funny: ...@@ -1126,7 +1127,7 @@ funny:
Python/thread.o: @THREADHEADERS@ Python/thread.o: @THREADHEADERS@
# Declare targets that aren't real files # Declare targets that aren't real files
.PHONY: all sharedmods oldsharedmods test quicktest memtest .PHONY: all build_all sharedmods oldsharedmods test quicktest memtest
.PHONY: install altinstall oldsharedinstall bininstall altbininstall .PHONY: install altinstall oldsharedinstall bininstall altbininstall
.PHONY: maninstall libinstall inclinstall libainstall sharedinstall .PHONY: maninstall libinstall inclinstall libainstall sharedinstall
.PHONY: frameworkinstall frameworkinstallframework frameworkinstallstructure .PHONY: frameworkinstall frameworkinstallframework frameworkinstallstructure
......
...@@ -17,6 +17,12 @@ the format to accommodate documentation needs as they arise. ...@@ -17,6 +17,12 @@ the format to accommodate documentation needs as they arise.
Permissions History Permissions History
------------------- -------------------
- Christian Heimes was given SVN access on 31 October 2007 by MvL,
for general contributions to Python.
- Chris Monson was given SVN access on 20 October 2007 by NCN,
for his work on editing PEPs.
- Bill Janssen was given SVN access on 28 August 2007 by NCN, - Bill Janssen was given SVN access on 28 August 2007 by NCN,
for his work on the SSL module and other things related to (SSL) sockets. for his work on the SSL module and other things related to (SSL) sockets.
......
This diff is collapsed.
...@@ -83,10 +83,27 @@ typedef struct { ...@@ -83,10 +83,27 @@ typedef struct {
int leftindex; /* in range(BLOCKLEN) */ int leftindex; /* in range(BLOCKLEN) */
int rightindex; /* in range(BLOCKLEN) */ int rightindex; /* in range(BLOCKLEN) */
int len; int len;
int maxlen;
long state; /* incremented whenever the indices move */ long state; /* incremented whenever the indices move */
PyObject *weakreflist; /* List of weak references */ PyObject *weakreflist; /* List of weak references */
} dequeobject; } dequeobject;
/* The deque's size limit is d.maxlen. The limit can be zero or positive.
* If there is no limit, then d.maxlen == -1.
*
* After an item is added to a deque, we check to see if the size has grown past
* the limit. If it has, we get the size back down to the limit by popping an
* item off of the opposite end. The methods that can trigger this are append(),
* appendleft(), extend(), and extendleft().
*/
#define TRIM(d, popfunction) \
if (d->maxlen != -1 && d->len > d->maxlen) { \
PyObject *rv = popfunction(d, NULL); \
assert(rv != NULL && d->len <= d->maxlen); \
Py_DECREF(rv); \
}
static PyTypeObject deque_type; static PyTypeObject deque_type;
static PyObject * static PyObject *
...@@ -95,9 +112,6 @@ deque_new(PyTypeObject *type, PyObject *args, PyObject *kwds) ...@@ -95,9 +112,6 @@ deque_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
dequeobject *deque; dequeobject *deque;
block *b; block *b;
if (type == &deque_type && !_PyArg_NoKeywords("deque()", kwds))
return NULL;
/* create dequeobject structure */ /* create dequeobject structure */
deque = (dequeobject *)type->tp_alloc(type, 0); deque = (dequeobject *)type->tp_alloc(type, 0);
if (deque == NULL) if (deque == NULL)
...@@ -117,54 +131,11 @@ deque_new(PyTypeObject *type, PyObject *args, PyObject *kwds) ...@@ -117,54 +131,11 @@ deque_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
deque->len = 0; deque->len = 0;
deque->state = 0; deque->state = 0;
deque->weakreflist = NULL; deque->weakreflist = NULL;
deque->maxlen = -1;
return (PyObject *)deque; return (PyObject *)deque;
} }
static PyObject *
deque_append(dequeobject *deque, PyObject *item)
{
deque->state++;
if (deque->rightindex == BLOCKLEN-1) {
block *b = newblock(deque->rightblock, NULL, deque->len);
if (b == NULL)
return NULL;
assert(deque->rightblock->rightlink == NULL);
deque->rightblock->rightlink = b;
deque->rightblock = b;
deque->rightindex = -1;
}
Py_INCREF(item);
deque->len++;
deque->rightindex++;
deque->rightblock->data[deque->rightindex] = item;
Py_RETURN_NONE;
}
PyDoc_STRVAR(append_doc, "Add an element to the right side of the deque.");
static PyObject *
deque_appendleft(dequeobject *deque, PyObject *item)
{
deque->state++;
if (deque->leftindex == 0) {
block *b = newblock(NULL, deque->leftblock, deque->len);
if (b == NULL)
return NULL;
assert(deque->leftblock->leftlink == NULL);
deque->leftblock->leftlink = b;
deque->leftblock = b;
deque->leftindex = BLOCKLEN;
}
Py_INCREF(item);
deque->len++;
deque->leftindex--;
deque->leftblock->data[deque->leftindex] = item;
Py_RETURN_NONE;
}
PyDoc_STRVAR(appendleft_doc, "Add an element to the left side of the deque.");
static PyObject * static PyObject *
deque_pop(dequeobject *deque, PyObject *unused) deque_pop(dequeobject *deque, PyObject *unused)
{ {
...@@ -239,6 +210,52 @@ deque_popleft(dequeobject *deque, PyObject *unused) ...@@ -239,6 +210,52 @@ deque_popleft(dequeobject *deque, PyObject *unused)
PyDoc_STRVAR(popleft_doc, "Remove and return the leftmost element."); PyDoc_STRVAR(popleft_doc, "Remove and return the leftmost element.");
static PyObject *
deque_append(dequeobject *deque, PyObject *item)
{
deque->state++;
if (deque->rightindex == BLOCKLEN-1) {
block *b = newblock(deque->rightblock, NULL, deque->len);
if (b == NULL)
return NULL;
assert(deque->rightblock->rightlink == NULL);
deque->rightblock->rightlink = b;
deque->rightblock = b;
deque->rightindex = -1;
}
Py_INCREF(item);
deque->len++;
deque->rightindex++;
deque->rightblock->data[deque->rightindex] = item;
TRIM(deque, deque_popleft);
Py_RETURN_NONE;
}
PyDoc_STRVAR(append_doc, "Add an element to the right side of the deque.");
static PyObject *
deque_appendleft(dequeobject *deque, PyObject *item)
{
deque->state++;
if (deque->leftindex == 0) {
block *b = newblock(NULL, deque->leftblock, deque->len);
if (b == NULL)
return NULL;
assert(deque->leftblock->leftlink == NULL);
deque->leftblock->leftlink = b;
deque->leftblock = b;
deque->leftindex = BLOCKLEN;
}
Py_INCREF(item);
deque->len++;
deque->leftindex--;
deque->leftblock->data[deque->leftindex] = item;
TRIM(deque, deque_pop);
Py_RETURN_NONE;
}
PyDoc_STRVAR(appendleft_doc, "Add an element to the left side of the deque.");
static PyObject * static PyObject *
deque_extend(dequeobject *deque, PyObject *iterable) deque_extend(dequeobject *deque, PyObject *iterable)
{ {
...@@ -266,6 +283,7 @@ deque_extend(dequeobject *deque, PyObject *iterable) ...@@ -266,6 +283,7 @@ deque_extend(dequeobject *deque, PyObject *iterable)
deque->len++; deque->len++;
deque->rightindex++; deque->rightindex++;
deque->rightblock->data[deque->rightindex] = item; deque->rightblock->data[deque->rightindex] = item;
TRIM(deque, deque_popleft);
} }
Py_DECREF(it); Py_DECREF(it);
if (PyErr_Occurred()) if (PyErr_Occurred())
...@@ -303,6 +321,7 @@ deque_extendleft(dequeobject *deque, PyObject *iterable) ...@@ -303,6 +321,7 @@ deque_extendleft(dequeobject *deque, PyObject *iterable)
deque->len++; deque->len++;
deque->leftindex--; deque->leftindex--;
deque->leftblock->data[deque->leftindex] = item; deque->leftblock->data[deque->leftindex] = item;
TRIM(deque, deque_pop);
} }
Py_DECREF(it); Py_DECREF(it);
if (PyErr_Occurred()) if (PyErr_Occurred())
...@@ -579,8 +598,11 @@ deque_nohash(PyObject *self) ...@@ -579,8 +598,11 @@ deque_nohash(PyObject *self)
static PyObject * static PyObject *
deque_copy(PyObject *deque) deque_copy(PyObject *deque)
{ {
return PyObject_CallFunctionObjArgs((PyObject *)(Py_Type(deque)), if (((dequeobject *)deque)->maxlen == -1)
deque, NULL); return PyObject_CallFunction((PyObject *)(Py_Type(deque)), "O", deque, NULL);
else
return PyObject_CallFunction((PyObject *)(Py_Type(deque)), "Oi",
deque, ((dequeobject *)deque)->maxlen, NULL);
} }
PyDoc_STRVAR(copy_doc, "Return a shallow copy of a deque."); PyDoc_STRVAR(copy_doc, "Return a shallow copy of a deque.");
...@@ -588,21 +610,29 @@ PyDoc_STRVAR(copy_doc, "Return a shallow copy of a deque."); ...@@ -588,21 +610,29 @@ PyDoc_STRVAR(copy_doc, "Return a shallow copy of a deque.");
static PyObject * static PyObject *
deque_reduce(dequeobject *deque) deque_reduce(dequeobject *deque)
{ {
PyObject *dict, *result, *it; PyObject *dict, *result, *aslist;
dict = PyObject_GetAttrString((PyObject *)deque, "__dict__"); dict = PyObject_GetAttrString((PyObject *)deque, "__dict__");
if (dict == NULL) { if (dict == NULL)
PyErr_Clear(); PyErr_Clear();
dict = Py_None; aslist = PySequence_List((PyObject *)deque);
Py_INCREF(dict); if (aslist == NULL) {
} Py_XDECREF(dict);
it = PyObject_GetIter((PyObject *)deque);
if (it == NULL) {
Py_DECREF(dict);
return NULL; return NULL;
} }
result = Py_BuildValue("O()ON", Py_Type(deque), dict, it); if (dict == NULL) {
Py_DECREF(dict); if (deque->maxlen == -1)
result = Py_BuildValue("O(O)", Py_Type(deque), aslist);
else
result = Py_BuildValue("O(Oi)", Py_Type(deque), aslist, deque->maxlen);
} else {
if (deque->maxlen == -1)
result = Py_BuildValue("O(OO)O", Py_Type(deque), aslist, Py_None, dict);
else
result = Py_BuildValue("O(Oi)O", Py_Type(deque), aslist, deque->maxlen, dict);
}
Py_XDECREF(dict);
Py_DECREF(aslist);
return result; return result;
} }
...@@ -626,8 +656,11 @@ deque_repr(PyObject *deque) ...@@ -626,8 +656,11 @@ deque_repr(PyObject *deque)
Py_ReprLeave(deque); Py_ReprLeave(deque);
return NULL; return NULL;
} }
if (((dequeobject *)deque)->maxlen != -1)
result = PyUnicode_FromFormat("deque(%R)", aslist); result = PyUnicode_FromFormat("deque(%R, maxlen=%i)", aslist,
((dequeobject *)deque)->maxlen);
else
result = PyUnicode_FromFormat("deque(%R)", aslist);
Py_DECREF(aslist); Py_DECREF(aslist);
Py_ReprLeave(deque); Py_ReprLeave(deque);
return result; return result;
...@@ -712,13 +745,25 @@ done: ...@@ -712,13 +745,25 @@ done:
} }
static int static int
deque_init(dequeobject *deque, PyObject *args, PyObject *kwds) deque_init(dequeobject *deque, PyObject *args, PyObject *kwdargs)
{ {
PyObject *iterable = NULL; PyObject *iterable = NULL;
PyObject *maxlenobj = NULL;
int maxlen = -1;
char *kwlist[] = {"iterable", "maxlen", 0};
if (!PyArg_UnpackTuple(args, "deque", 0, 1, &iterable)) if (!PyArg_ParseTupleAndKeywords(args, kwdargs, "|OO:deque", kwlist, &iterable, &maxlenobj))
return -1; return -1;
if (maxlenobj != NULL && maxlenobj != Py_None) {
maxlen = PyInt_AsLong(maxlenobj);
if (maxlen == -1 && PyErr_Occurred())
return -1;
if (maxlen < 0) {
PyErr_SetString(PyExc_ValueError, "maxlen must be non-negative");
return -1;
}
}
deque->maxlen = maxlen;
if (iterable != NULL) { if (iterable != NULL) {
PyObject *rv = deque_extend(deque, iterable); PyObject *rv = deque_extend(deque, iterable);
if (rv == NULL) if (rv == NULL)
...@@ -773,7 +818,7 @@ static PyMethodDef deque_methods[] = { ...@@ -773,7 +818,7 @@ static PyMethodDef deque_methods[] = {
}; };
PyDoc_STRVAR(deque_doc, PyDoc_STRVAR(deque_doc,
"deque(iterable) --> deque object\n\ "deque(iterable[, maxlen]) --> deque object\n\
\n\ \n\
Build an ordered collection accessible from endpoints only."); Build an ordered collection accessible from endpoints only.");
...@@ -1063,7 +1108,7 @@ defdict_copy(defdictobject *dd) ...@@ -1063,7 +1108,7 @@ defdict_copy(defdictobject *dd)
whose class constructor has the same signature. Subclasses that whose class constructor has the same signature. Subclasses that
define a different constructor signature must override copy(). define a different constructor signature must override copy().
*/ */
return PyObject_CallFunctionObjArgs((PyObject *)Py_Type(dd), return PyObject_CallFunctionObjArgs((PyObject*)Py_Type(dd),
dd->default_factory, dd, NULL); dd->default_factory, dd, NULL);
} }
......
...@@ -1631,17 +1631,21 @@ static struct fielddesc formattable[] = { ...@@ -1631,17 +1631,21 @@ static struct fielddesc formattable[] = {
/* XXX Hm, sizeof(int) == sizeof(long) doesn't hold on every platform */ /* XXX Hm, sizeof(int) == sizeof(long) doesn't hold on every platform */
/* As soon as we can get rid of the type codes, this is no longer a problem */ /* As soon as we can get rid of the type codes, this is no longer a problem */
#if SIZEOF_LONG == 4 #if SIZEOF_LONG == 4
{ 'l', l_set, l_get, &ffi_type_sint, l_set_sw, l_get_sw}, { 'l', l_set, l_get, &ffi_type_sint32, l_set_sw, l_get_sw},
{ 'L', L_set, L_get, &ffi_type_uint, L_set_sw, L_get_sw}, { 'L', L_set, L_get, &ffi_type_uint32, L_set_sw, L_get_sw},
#elif SIZEOF_LONG == 8 #elif SIZEOF_LONG == 8
{ 'l', l_set, l_get, &ffi_type_slong, l_set_sw, l_get_sw}, { 'l', l_set, l_get, &ffi_type_sint64, l_set_sw, l_get_sw},
{ 'L', L_set, L_get, &ffi_type_ulong, L_set_sw, L_get_sw}, { 'L', L_set, L_get, &ffi_type_uint64, L_set_sw, L_get_sw},
#else #else
# error # error
#endif #endif
#ifdef HAVE_LONG_LONG #ifdef HAVE_LONG_LONG
{ 'q', q_set, q_get, &ffi_type_slong, q_set_sw, q_get_sw}, #if SIZEOF_LONG_LONG == 8
{ 'Q', Q_set, Q_get, &ffi_type_ulong, Q_set_sw, Q_get_sw}, { 'q', q_set, q_get, &ffi_type_sint64, q_set_sw, q_get_sw},
{ 'Q', Q_set, Q_get, &ffi_type_uint64, Q_set_sw, Q_get_sw},
#else
# error
#endif
#endif #endif
{ 'P', P_set, P_get, &ffi_type_pointer}, { 'P', P_set, P_get, &ffi_type_pointer},
{ 'z', z_set, z_get, &ffi_type_pointer}, { 'z', z_set, z_get, &ffi_type_pointer},
...@@ -1764,11 +1768,13 @@ ffi_type ffi_type_sint64 = { 8, LONG_LONG_ALIGN, FFI_TYPE_SINT64 }; ...@@ -1764,11 +1768,13 @@ ffi_type ffi_type_sint64 = { 8, LONG_LONG_ALIGN, FFI_TYPE_SINT64 };
ffi_type ffi_type_float = { sizeof(float), FLOAT_ALIGN, FFI_TYPE_FLOAT }; ffi_type ffi_type_float = { sizeof(float), FLOAT_ALIGN, FFI_TYPE_FLOAT };
ffi_type ffi_type_double = { sizeof(double), DOUBLE_ALIGN, FFI_TYPE_DOUBLE }; ffi_type ffi_type_double = { sizeof(double), DOUBLE_ALIGN, FFI_TYPE_DOUBLE };
#ifdef ffi_type_longdouble
#undef ffi_type_longdouble
#endif
ffi_type ffi_type_longdouble = { sizeof(long double), LONGDOUBLE_ALIGN, ffi_type ffi_type_longdouble = { sizeof(long double), LONGDOUBLE_ALIGN,
FFI_TYPE_LONGDOUBLE }; FFI_TYPE_LONGDOUBLE };
/* ffi_type ffi_type_longdouble */
ffi_type ffi_type_pointer = { sizeof(void *), VOID_P_ALIGN, FFI_TYPE_POINTER }; ffi_type ffi_type_pointer = { sizeof(void *), VOID_P_ALIGN, FFI_TYPE_POINTER };
/*---------------- EOF ----------------*/ /*---------------- EOF ----------------*/
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
#include <stdlib.h> #include <stdlib.h>
extern void ffi_call_osf(void *, unsigned long, unsigned, void *, void (*)()); extern void ffi_call_osf(void *, unsigned long, unsigned, void *, void (*)(void));
extern void ffi_closure_osf(void); extern void ffi_closure_osf(void);
...@@ -58,7 +58,7 @@ ffi_prep_cif_machdep(ffi_cif *cif) ...@@ -58,7 +58,7 @@ ffi_prep_cif_machdep(ffi_cif *cif)
} }
void void
ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue) ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
{ {
unsigned long *stack, *argp; unsigned long *stack, *argp;
long i, avn; long i, avn;
......
...@@ -259,10 +259,10 @@ ffi_prep_cif_machdep(ffi_cif *cif) ...@@ -259,10 +259,10 @@ ffi_prep_cif_machdep(ffi_cif *cif)
return FFI_OK; return FFI_OK;
} }
extern int ffi_call_unix (struct ia64_args *, PTR64, void (*)(), UINT64); extern int ffi_call_unix (struct ia64_args *, PTR64, void (*)(void), UINT64);
void void
ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue) ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
{ {
struct ia64_args *stack; struct ia64_args *stack;
long i, avn, gpcount, fpcount; long i, avn, gpcount, fpcount;
...@@ -387,7 +387,7 @@ ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue) ...@@ -387,7 +387,7 @@ ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue)
gp pointer to the closure. This allows the function entry code to gp pointer to the closure. This allows the function entry code to
both retrieve the user data, and to restire the correct gp pointer. */ both retrieve the user data, and to restire the correct gp pointer. */
extern void ffi_closure_unix (); extern void ffi_closure_unix (void);
ffi_status ffi_status
ffi_prep_closure (ffi_closure* closure, ffi_prep_closure (ffi_closure* closure,
......
...@@ -445,14 +445,14 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif) ...@@ -445,14 +445,14 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
/* Low level routine for calling O32 functions */ /* Low level routine for calling O32 functions */
extern int ffi_call_O32(void (*)(char *, extended_cif *, int, int), extern int ffi_call_O32(void (*)(char *, extended_cif *, int, int),
extended_cif *, unsigned, extended_cif *, unsigned,
unsigned, unsigned *, void (*)()); unsigned, unsigned *, void (*)(void));
/* Low level routine for calling N32 functions */ /* Low level routine for calling N32 functions */
extern int ffi_call_N32(void (*)(char *, extended_cif *, int, int), extern int ffi_call_N32(void (*)(char *, extended_cif *, int, int),
extended_cif *, unsigned, extended_cif *, unsigned,
unsigned, unsigned *, void (*)()); unsigned, unsigned *, void (*)(void));
void ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue) void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
{ {
extended_cif ecif; extended_cif ecif;
......
...@@ -345,12 +345,12 @@ extern void ffi_call_LINUX(void (*)(UINT32 *, extended_cif *, unsigned), ...@@ -345,12 +345,12 @@ extern void ffi_call_LINUX(void (*)(UINT32 *, extended_cif *, unsigned),
/*@out@*/ extended_cif *, /*@out@*/ extended_cif *,
unsigned, unsigned, unsigned, unsigned,
/*@out@*/ unsigned *, /*@out@*/ unsigned *,
void (*fn)()); void (*fn)(void));
/*@=declundef@*/ /*@=declundef@*/
/*@=exportheader@*/ /*@=exportheader@*/
void ffi_call(/*@dependent@*/ ffi_cif *cif, void ffi_call(/*@dependent@*/ ffi_cif *cif,
void (*fn)(), void (*fn)(void),
/*@out@*/ void *rvalue, /*@out@*/ void *rvalue,
/*@dependent@*/ void **avalue) /*@dependent@*/ void **avalue)
{ {
......
...@@ -756,17 +756,17 @@ ffi_prep_cif_machdep (ffi_cif *cif) ...@@ -756,17 +756,17 @@ ffi_prep_cif_machdep (ffi_cif *cif)
extern void ffi_call_SYSV(/*@out@*/ extended_cif *, extern void ffi_call_SYSV(/*@out@*/ extended_cif *,
unsigned, unsigned, unsigned, unsigned,
/*@out@*/ unsigned *, /*@out@*/ unsigned *,
void (*fn)()); void (*fn)(void));
extern void FFI_HIDDEN ffi_call_LINUX64(/*@out@*/ extended_cif *, extern void FFI_HIDDEN ffi_call_LINUX64(/*@out@*/ extended_cif *,
unsigned long, unsigned long, unsigned long, unsigned long,
/*@out@*/ unsigned long *, /*@out@*/ unsigned long *,
void (*fn)()); void (*fn)(void));
/*@=declundef@*/ /*@=declundef@*/
/*@=exportheader@*/ /*@=exportheader@*/
void void
ffi_call(/*@dependent@*/ ffi_cif *cif, ffi_call(/*@dependent@*/ ffi_cif *cif,
void (*fn)(), void (*fn)(void),
/*@out@*/ void *rvalue, /*@out@*/ void *rvalue,
/*@dependent@*/ void **avalue) /*@dependent@*/ void **avalue)
{ {
......
...@@ -88,7 +88,7 @@ extern void ffi_call_SYSV(unsigned, ...@@ -88,7 +88,7 @@ extern void ffi_call_SYSV(unsigned,
void (*)(unsigned char *, extended_cif *), void (*)(unsigned char *, extended_cif *),
unsigned, unsigned,
void *, void *,
void (*fn)()); void (*fn)(void));
extern void ffi_closure_SYSV(void); extern void ffi_closure_SYSV(void);
...@@ -480,7 +480,7 @@ ffi_prep_cif_machdep(ffi_cif *cif) ...@@ -480,7 +480,7 @@ ffi_prep_cif_machdep(ffi_cif *cif)
void void
ffi_call(ffi_cif *cif, ffi_call(ffi_cif *cif,
void (*fn)(), void (*fn)(void),
void *rvalue, void *rvalue,
void **avalue) void **avalue)
{ {
......
...@@ -358,13 +358,13 @@ int ffi_v9_layout_struct(ffi_type *arg, int off, char *ret, char *intg, char *fl ...@@ -358,13 +358,13 @@ int ffi_v9_layout_struct(ffi_type *arg, int off, char *ret, char *intg, char *fl
#ifdef SPARC64 #ifdef SPARC64
extern int ffi_call_v9(void *, extended_cif *, unsigned, extern int ffi_call_v9(void *, extended_cif *, unsigned,
unsigned, unsigned *, void (*fn)()); unsigned, unsigned *, void (*fn)(void));
#else #else
extern int ffi_call_v8(void *, extended_cif *, unsigned, extern int ffi_call_v8(void *, extended_cif *, unsigned,
unsigned, unsigned *, void (*fn)()); unsigned, unsigned *, void (*fn)(void));
#endif #endif
void ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue) void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
{ {
extended_cif ecif; extended_cif ecif;
void *rval = rvalue; void *rval = rvalue;
......
/*----------------------------------------------------------------------
Copyright (c) 1999-2001, Digital Creations, Fredericksburg, VA, USA
and Andrew Kuchling. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
o Redistributions of source code must retain the above copyright
notice, this list of conditions, and the disclaimer that follows.
o 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.
o Neither the name of Digital Creations nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS AND CONTRIBUTORS *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 DIGITAL
CREATIONS OR CONTRIBUTORS 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.
------------------------------------------------------------------------*/
/*
* Handwritten code to wrap version 3.x of the Berkeley DB library,
* written to replace a SWIG-generated file. It has since been updated
* to compile with BerkeleyDB versions 3.2 through 4.2.
*
* This module was started by Andrew Kuchling to remove the dependency
* on SWIG in a package by Gregory P. Smith who based his work on a
* similar package by Robin Dunn <robin@alldunn.com> which wrapped
* Berkeley DB 2.7.x.
*
* Development of this module then returned full circle back to Robin Dunn
* who worked on behalf of Digital Creations to complete the wrapping of
* the DB 3.x API and to build a solid unit test suite. Robin has
* since gone onto other projects (wxPython).
*
* Gregory P. Smith <greg@krypto.org> is once again the maintainer.
*
* Use the pybsddb-users@lists.sf.net mailing list for all questions.
* Things can change faster than the header of this file is updated. This
* file is shared with the PyBSDDB project at SourceForge:
*
* http://pybsddb.sf.net
*
* This file should remain backward compatible with Python 2.1, but see PEP
* 291 for the most current backward compatibility requirements:
*
* http://www.python.org/peps/pep-0291.html
*
* This module contains 6 types:
*
* DB (Database)
* DBCursor (Database Cursor)
* DBEnv (database environment)
* DBTxn (An explicit database transaction)
* DBLock (A lock handle)
* DBSequence (Sequence)
*
*/
/* --------------------------------------------------------------------- */
/*
* Portions of this module, associated unit tests and build scripts are the
* result of a contract with The Written Word (http://thewrittenword.com/)
* Many thanks go out to them for causing me to raise the bar on quality and
* functionality, resulting in a better bsddb3 package for all of us to use.
*
* --Robin
*/
/* --------------------------------------------------------------------- */
/*
* Work to split it up into a separate header and to add a C API was
* contributed by Duncan Grisby <duncan@tideway.com>. See here:
* http://sourceforge.net/tracker/index.php?func=detail&aid=1551895&group_id=13900&atid=313900
*/
/* --------------------------------------------------------------------- */
#ifndef _BSDDB_H_
#define _BSDDB_H_
#include <db.h>
/* 40 = 4.0, 33 = 3.3; this will break if the minor revision is > 9 */
#define DBVER (DB_VERSION_MAJOR * 10 + DB_VERSION_MINOR)
#if DB_VERSION_MINOR > 9
#error "eek! DBVER can't handle minor versions > 9"
#endif
#define PY_BSDDB_VERSION "4.6.0"
/* Python object definitions */
struct behaviourFlags {
/* What is the default behaviour when DB->get or DBCursor->get returns a
DB_NOTFOUND || DB_KEYEMPTY error? Return None or raise an exception? */
unsigned int getReturnsNone : 1;
/* What is the default behaviour for DBCursor.set* methods when DBCursor->get
* returns a DB_NOTFOUND || DB_KEYEMPTY error? Return None or raise? */
unsigned int cursorSetReturnsNone : 1;
};
typedef struct {
PyObject_HEAD
DB_ENV* db_env;
u_int32_t flags; /* saved flags from open() */
int closed;
struct behaviourFlags moduleFlags;
PyObject *in_weakreflist; /* List of weak references */
} DBEnvObject;
typedef struct {
PyObject_HEAD
DB* db;
DBEnvObject* myenvobj; /* PyObject containing the DB_ENV */
u_int32_t flags; /* saved flags from open() */
u_int32_t setflags; /* saved flags from set_flags() */
int haveStat;
struct behaviourFlags moduleFlags;
#if (DBVER >= 33)
PyObject* associateCallback;
PyObject* btCompareCallback;
int primaryDBType;
#endif
PyObject *in_weakreflist; /* List of weak references */
} DBObject;
typedef struct {
PyObject_HEAD
DBC* dbc;
DBObject* mydb;
PyObject *in_weakreflist; /* List of weak references */
} DBCursorObject;
typedef struct {
PyObject_HEAD
DB_TXN* txn;
PyObject *env;
PyObject *in_weakreflist; /* List of weak references */
} DBTxnObject;
typedef struct {
PyObject_HEAD
DB_LOCK lock;
PyObject *in_weakreflist; /* List of weak references */
} DBLockObject;
#if (DBVER >= 43)
typedef struct {
PyObject_HEAD
DB_SEQUENCE* sequence;
DBObject* mydb;
PyObject *in_weakreflist; /* List of weak references */
} DBSequenceObject;
static PyTypeObject DBSequence_Type;
#endif
/* API structure for use by C code */
/* To access the structure from an external module, use code like the
following (error checking missed out for clarity):
BSDDB_api* bsddb_api;
PyObject* mod;
PyObject* cobj;
mod = PyImport_ImportModule("bsddb._bsddb");
// Use "bsddb3._pybsddb" if you're using the standalone pybsddb add-on.
cobj = PyObject_GetAttrString(mod, "api");
api = (BSDDB_api*)PyCObject_AsVoidPtr(cobj);
Py_DECREF(cobj);
Py_DECREF(mod);
The structure's members must not be changed.
*/
typedef struct {
/* Type objects */
PyTypeObject* db_type;
PyTypeObject* dbcursor_type;
PyTypeObject* dbenv_type;
PyTypeObject* dbtxn_type;
PyTypeObject* dblock_type;
#if (DBVER >= 43)
PyTypeObject* dbsequence_type;
#endif
/* Functions */
int (*makeDBError)(int err);
} BSDDB_api;
#ifndef COMPILING_BSDDB_C
/* If not inside _bsddb.c, define type check macros that use the api
structure. The calling code must have a value named bsddb_api
pointing to the api structure.
*/
#define DBObject_Check(v) ((v)->ob_type == bsddb_api->db_type)
#define DBCursorObject_Check(v) ((v)->ob_type == bsddb_api->dbcursor_type)
#define DBEnvObject_Check(v) ((v)->ob_type == bsddb_api->dbenv_type)
#define DBTxnObject_Check(v) ((v)->ob_type == bsddb_api->dbtxn_type)
#define DBLockObject_Check(v) ((v)->ob_type == bsddb_api->dblock_type)
#if (DBVER >= 43)
#define DBSequenceObject_Check(v) ((v)->ob_type == bsddb_api->dbsequence_type)
#endif
#endif // COMPILING_BSDDB_C
#endif // _BSDDB_H_
This diff is collapsed.
...@@ -367,6 +367,7 @@ Py_Main(int argc, char **argv) ...@@ -367,6 +367,7 @@ Py_Main(int argc, char **argv)
if (fstat(fileno(fp), &sb) == 0 && if (fstat(fileno(fp), &sb) == 0 &&
S_ISDIR(sb.st_mode)) { S_ISDIR(sb.st_mode)) {
fprintf(stderr, "%s: '%s' is a directory, cannot continue\n", argv[0], filename); fprintf(stderr, "%s: '%s' is a directory, cannot continue\n", argv[0], filename);
fclose(fp);
return 1; return 1;
} }
} }
......
This diff is collapsed.
This diff is collapsed.
...@@ -7,6 +7,7 @@ typedef struct { ...@@ -7,6 +7,7 @@ typedef struct {
long en_index; /* current index of enumeration */ long en_index; /* current index of enumeration */
PyObject* en_sit; /* secondary iterator of enumeration */ PyObject* en_sit; /* secondary iterator of enumeration */
PyObject* en_result; /* result tuple */ PyObject* en_result; /* result tuple */
PyObject* en_longindex; /* index for sequences >= LONG_MAX */
} enumobject; } enumobject;
static PyObject * static PyObject *
...@@ -25,6 +26,7 @@ enum_new(PyTypeObject *type, PyObject *args, PyObject *kwds) ...@@ -25,6 +26,7 @@ enum_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return NULL; return NULL;
en->en_index = 0; en->en_index = 0;
en->en_sit = PyObject_GetIter(seq); en->en_sit = PyObject_GetIter(seq);
en->en_longindex = NULL;
if (en->en_sit == NULL) { if (en->en_sit == NULL) {
Py_DECREF(en); Py_DECREF(en);
return NULL; return NULL;
...@@ -43,6 +45,7 @@ enum_dealloc(enumobject *en) ...@@ -43,6 +45,7 @@ enum_dealloc(enumobject *en)
PyObject_GC_UnTrack(en); PyObject_GC_UnTrack(en);
Py_XDECREF(en->en_sit); Py_XDECREF(en->en_sit);
Py_XDECREF(en->en_result); Py_XDECREF(en->en_result);
Py_XDECREF(en->en_longindex);
Py_Type(en)->tp_free(en); Py_Type(en)->tp_free(en);
} }
...@@ -51,9 +54,52 @@ enum_traverse(enumobject *en, visitproc visit, void *arg) ...@@ -51,9 +54,52 @@ enum_traverse(enumobject *en, visitproc visit, void *arg)
{ {
Py_VISIT(en->en_sit); Py_VISIT(en->en_sit);
Py_VISIT(en->en_result); Py_VISIT(en->en_result);
Py_VISIT(en->en_longindex);
return 0; return 0;
} }
static PyObject *
enum_next_long(enumobject *en, PyObject* next_item)
{
static PyObject *one = NULL;
PyObject *result = en->en_result;
PyObject *next_index;
PyObject *stepped_up;
if (en->en_longindex == NULL) {
en->en_longindex = PyInt_FromLong(LONG_MAX);
if (en->en_longindex == NULL)
return NULL;
}
if (one == NULL) {
one = PyInt_FromLong(1);
if (one == NULL)
return NULL;
}
next_index = en->en_longindex;
assert(next_index != NULL);
stepped_up = PyNumber_Add(next_index, one);
if (stepped_up == NULL)
return NULL;
en->en_longindex = stepped_up;
if (result->ob_refcnt == 1) {
Py_INCREF(result);
Py_DECREF(PyTuple_GET_ITEM(result, 0));
Py_DECREF(PyTuple_GET_ITEM(result, 1));
} else {
result = PyTuple_New(2);
if (result == NULL) {
Py_DECREF(next_index);
Py_DECREF(next_item);
return NULL;
}
}
PyTuple_SET_ITEM(result, 0, next_index);
PyTuple_SET_ITEM(result, 1, next_item);
return result;
}
static PyObject * static PyObject *
enum_next(enumobject *en) enum_next(enumobject *en)
{ {
...@@ -62,16 +108,13 @@ enum_next(enumobject *en) ...@@ -62,16 +108,13 @@ enum_next(enumobject *en)
PyObject *result = en->en_result; PyObject *result = en->en_result;
PyObject *it = en->en_sit; PyObject *it = en->en_sit;
if (en->en_index == LONG_MAX) {
PyErr_SetString(PyExc_OverflowError,
"enumerate() is limited to LONG_MAX items");
return NULL;
}
next_item = (*Py_Type(it)->tp_iternext)(it); next_item = (*Py_Type(it)->tp_iternext)(it);
if (next_item == NULL) if (next_item == NULL)
return NULL; return NULL;
if (en->en_index == LONG_MAX)
return enum_next_long(en, next_item);
next_index = PyInt_FromLong(en->en_index); next_index = PyInt_FromLong(en->en_index);
if (next_index == NULL) { if (next_index == NULL) {
Py_DECREF(next_item); Py_DECREF(next_item);
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -1539,7 +1539,7 @@ ast_for_binop(struct compiling *c, const node *n) ...@@ -1539,7 +1539,7 @@ ast_for_binop(struct compiling *c, const node *n)
tmp_result = BinOp(result, newoperator, tmp, tmp_result = BinOp(result, newoperator, tmp,
LINENO(next_oper), next_oper->n_col_offset, LINENO(next_oper), next_oper->n_col_offset,
c->c_arena); c->c_arena);
if (!tmp) if (!tmp_result)
return NULL; return NULL;
result = tmp_result; result = tmp_result;
} }
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment