Commit 5879d412 authored by Benjamin Peterson's avatar Benjamin Peterson

Merged revisions...

Merged revisions 70578,70599,70641-70642,70650,70660-70661,70674,70691,70697-70698,70700,70704 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r70578 | benjamin.peterson | 2009-03-23 22:24:56 -0500 (Mon, 23 Mar 2009) | 1 line

  this is better written using assertRaises
........
  r70599 | benjamin.peterson | 2009-03-25 16:42:51 -0500 (Wed, 25 Mar 2009) | 1 line

  this can be slightly less ugly
........
  r70641 | guilherme.polo | 2009-03-27 16:43:08 -0500 (Fri, 27 Mar 2009) | 3 lines

  Adjusted _tkinter to compile without warnings when WITH_THREAD is not
  defined (part of issue #5035)
........
  r70642 | georg.brandl | 2009-03-27 19:48:48 -0500 (Fri, 27 Mar 2009) | 1 line

  Fix typo.
........
  r70650 | benjamin.peterson | 2009-03-28 14:16:10 -0500 (Sat, 28 Mar 2009) | 1 line

  give os.symlink and os.link() better parameter names #5564
........
  r70660 | georg.brandl | 2009-03-28 14:52:58 -0500 (Sat, 28 Mar 2009) | 1 line

  Switch to fixed Sphinx version.
........
  r70661 | georg.brandl | 2009-03-28 14:57:36 -0500 (Sat, 28 Mar 2009) | 2 lines

  Add section numbering to some of the larger subdocuments.
........
  r70674 | guilherme.polo | 2009-03-29 05:19:05 -0500 (Sun, 29 Mar 2009) | 1 line

  Typo fix.
........
  r70691 | raymond.hettinger | 2009-03-29 13:51:11 -0500 (Sun, 29 Mar 2009) | 1 line

  Make life easier for non-CPython implementations.
........
  r70697 | benjamin.peterson | 2009-03-29 16:22:35 -0500 (Sun, 29 Mar 2009) | 1 line

  this has been fixed since 2.6 (I love removing these)
........
  r70698 | benjamin.peterson | 2009-03-29 16:31:05 -0500 (Sun, 29 Mar 2009) | 1 line

  thanks to guido's bytecode verifier, this is fixed
........
  r70700 | benjamin.peterson | 2009-03-29 16:50:14 -0500 (Sun, 29 Mar 2009) | 1 line

  use the awesome new status iterator
........
  r70704 | benjamin.peterson | 2009-03-29 21:49:32 -0500 (Sun, 29 Mar 2009) | 1 line

  there's actually three methods here #5600
........
parent 5550365f
...@@ -31,7 +31,7 @@ help: ...@@ -31,7 +31,7 @@ help:
checkout: checkout:
@if [ ! -d tools/sphinx ]; then \ @if [ ! -d tools/sphinx ]; then \
echo "Checking out Sphinx..."; \ echo "Checking out Sphinx..."; \
svn checkout $(SVNROOT)/doctools/trunk/sphinx tools/sphinx; \ svn checkout $(SVNROOT)/external/Sphinx-0.6.1/sphinx tools/sphinx; \
fi fi
@if [ ! -d tools/docutils ]; then \ @if [ ! -d tools/docutils ]; then \
echo "Checking out Docutils..."; \ echo "Checking out Docutils..."; \
......
...@@ -16,6 +16,7 @@ very little overhead for build/release/install mechanics. ...@@ -16,6 +16,7 @@ very little overhead for build/release/install mechanics.
.. toctree:: .. toctree::
:maxdepth: 2 :maxdepth: 2
:numbered:
introduction.rst introduction.rst
setupscript.rst setupscript.rst
......
...@@ -23,6 +23,7 @@ to write reStructuredText if you're not so inclined; plain text contributions ...@@ -23,6 +23,7 @@ to write reStructuredText if you're not so inclined; plain text contributions
are more than welcome as well. are more than welcome as well.
.. toctree:: .. toctree::
:numbered:
intro.rst intro.rst
style.rst style.rst
......
...@@ -26,6 +26,7 @@ For a detailed description of the whole Python/C API, see the separate ...@@ -26,6 +26,7 @@ For a detailed description of the whole Python/C API, see the separate
.. toctree:: .. toctree::
:maxdepth: 2 :maxdepth: 2
:numbered:
extending.rst extending.rst
newtypes.rst newtypes.rst
......
...@@ -38,6 +38,7 @@ the `Python Package Index <http://pypi.python.org/pypi>`_. ...@@ -38,6 +38,7 @@ the `Python Package Index <http://pypi.python.org/pypi>`_.
.. toctree:: .. toctree::
:maxdepth: 2 :maxdepth: 2
:numbered:
intro.rst intro.rst
functions.rst functions.rst
......
...@@ -796,9 +796,10 @@ Files and Directories ...@@ -796,9 +796,10 @@ Files and Directories
function will not follow symbolic links. Availability: Unix. function will not follow symbolic links. Availability: Unix.
.. function:: link(src, dst) .. function:: link(source, link_name)
Create a hard link pointing to *src* named *dst*. Availability: Unix. Create a hard link pointing to *source* named *link_name*. Availability:
Unix.
.. function:: listdir(path) .. function:: listdir(path)
...@@ -1078,9 +1079,10 @@ Files and Directories ...@@ -1078,9 +1079,10 @@ Files and Directories
:attr:`f_flag`, :attr:`f_namemax`. Availability: Unix. :attr:`f_flag`, :attr:`f_namemax`. Availability: Unix.
.. function:: symlink(src, dst) .. function:: symlink(source, link_name)
Create a symbolic link pointing to *src* named *dst*. Availability: Unix. Create a symbolic link pointing to *source* named *link_name*. Availability:
Unix.
.. function:: unlink(path) .. function:: unlink(path)
......
...@@ -218,6 +218,7 @@ does an index lookup using :func:`__getitem__`. ...@@ -218,6 +218,7 @@ does an index lookup using :func:`__getitem__`.
Some simple format string examples:: Some simple format string examples::
"First, thou shalt count to {0}" # References first positional argument "First, thou shalt count to {0}" # References first positional argument
"Bring me a {}" # Implicitly references the first positional argument
"My quest is {name}" # References keyword argument 'name' "My quest is {name}" # References keyword argument 'name'
"Weight in tons {0.weight}" # 'weight' attribute of first positional arg "Weight in tons {0.weight}" # 'weight' attribute of first positional arg
"Units destroyed: {players[0]}" # First element of keyword argument 'players'. "Units destroyed: {players[0]}" # First element of keyword argument 'players'.
......
...@@ -167,8 +167,8 @@ Here are some simple examples:: ...@@ -167,8 +167,8 @@ Here are some simple examples::
Browser Controller Objects Browser Controller Objects
-------------------------- --------------------------
Browser controllers provide these methods which parallel two of the module-level Browser controllers provide these methods which parallel three of the
convenience functions: module-level convenience functions:
.. method:: controller.open(url[, new[, autoraise=1]]) .. method:: controller.open(url[, new[, autoraise=1]])
......
...@@ -18,6 +18,7 @@ interfaces available to C/C++ programmers in detail. ...@@ -18,6 +18,7 @@ interfaces available to C/C++ programmers in detail.
.. toctree:: .. toctree::
:maxdepth: 2 :maxdepth: 2
:numbered:
introduction.rst introduction.rst
lexical_analysis.rst lexical_analysis.rst
......
...@@ -72,7 +72,9 @@ class PydocTopicsBuilder(Builder): ...@@ -72,7 +72,9 @@ class PydocTopicsBuilder(Builder):
def write(self, *ignored): def write(self, *ignored):
writer = TextWriter(self) writer = TextWriter(self)
for label in self.status_iterator(pydoc_topic_labels, 'building topics... '): for label in self.status_iterator(pydoc_topic_labels,
'building topics... ',
length=len(pydoc_topic_labels)):
if label not in self.env.labels: if label not in self.env.labels:
self.warn('label %r not in documentation' % label) self.warn('label %r not in documentation' % label)
continue continue
......
...@@ -44,6 +44,7 @@ various Python library modules described in the Python Library Reference. ...@@ -44,6 +44,7 @@ various Python library modules described in the Python Library Reference.
The :ref:`glossary` is also worth going through. The :ref:`glossary` is also worth going through.
.. toctree:: .. toctree::
:numbered:
appetite.rst appetite.rst
interpreter.rst interpreter.rst
......
...@@ -11,6 +11,7 @@ interpreter and things that make working with Python easier. ...@@ -11,6 +11,7 @@ interpreter and things that make working with Python easier.
.. toctree:: .. toctree::
:numbered:
cmdline.rst cmdline.rst
unix.rst unix.rst
......
...@@ -207,7 +207,7 @@ class StrictVersion (Version): ...@@ -207,7 +207,7 @@ class StrictVersion (Version):
# The rules according to Greg Stein: # The rules according to Greg Stein:
# 1) a version number has 1 or more numbers separate by a period or by # 1) a version number has 1 or more numbers separated by a period or by
# sequences of letters. If only periods, then these are compared # sequences of letters. If only periods, then these are compared
# left-to-right to determine an ordering. # left-to-right to determine an ordering.
# 2) sequences of letters are part of the tuple for comparison and are # 2) sequences of letters are part of the tuple for comparison and are
......
...@@ -246,7 +246,7 @@ class IdleConf: ...@@ -246,7 +246,7 @@ class IdleConf:
else: #returning default, print warning else: #returning default, print warning
if warn_on_default: if warn_on_default:
warning = ('\n Warning: configHandler.py - IdleConf.GetOption -\n' warning = ('\n Warning: configHandler.py - IdleConf.GetOption -\n'
' problem retrieving configration option %r\n' ' problem retrieving configuration option %r\n'
' from section %r.\n' ' from section %r.\n'
' returning default value: %r\n' % ' returning default value: %r\n' %
(option, section, default)) (option, section, default))
......
"""
The regular expression engine in '_sre' can segfault when interpreting
bogus bytecode.
It is unclear whether this is a real bug or a "won't fix" case like
bogus_code_obj.py, because it requires bytecode that is built by hand,
as opposed to compiled by 're' from a string-source regexp. The
difference with bogus_code_obj, though, is that the only existing regexp
compiler is written in Python, so that the C code has no choice but
accept arbitrary bytecode from Python-level.
The test below builds and runs random bytecodes until 'match' crashes
Python. I have not investigated why exactly segfaults occur nor how
hard they would be to fix. Here are a few examples of 'code' that
segfault for me:
[21, 50814, 8, 29, 16]
[21, 3967, 26, 10, 23, 54113]
[29, 23, 0, 2, 5]
[31, 64351, 0, 28, 3, 22281, 20, 4463, 9, 25, 59154, 15245, 2,
16343, 3, 11600, 24380, 10, 37556, 10, 31, 15, 31]
Here is also a 'code' that triggers an infinite uninterruptible loop:
[29, 1, 8, 21, 1, 43083, 6]
"""
import _sre, random
def pick():
n = random.randrange(-65536, 65536)
if n < 0:
n &= 31
return n
ss = ["", "world", "x" * 500]
while 1:
code = [pick() for i in range(random.randrange(5, 25))]
print(code)
pat = _sre.compile(None, 0, code)
for s in ss:
try:
pat.match(s)
except RuntimeError:
pass
# 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()
...@@ -732,6 +732,7 @@ Tkapp_New(char *screenName, char *className, ...@@ -732,6 +732,7 @@ Tkapp_New(char *screenName, char *className,
} }
#ifdef WITH_THREAD
static void static void
Tkapp_ThreadSend(TkappObject *self, Tcl_Event *ev, Tkapp_ThreadSend(TkappObject *self, Tcl_Event *ev,
Tcl_Condition *cond, Tcl_Mutex *mutex) Tcl_Condition *cond, Tcl_Mutex *mutex)
...@@ -744,6 +745,7 @@ Tkapp_ThreadSend(TkappObject *self, Tcl_Event *ev, ...@@ -744,6 +745,7 @@ Tkapp_ThreadSend(TkappObject *self, Tcl_Event *ev,
Tcl_MutexUnlock(mutex); Tcl_MutexUnlock(mutex);
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
} }
#endif
/** Tcl Eval **/ /** Tcl Eval **/
...@@ -1110,8 +1112,8 @@ FromObj(PyObject* tkapp, Tcl_Obj *value) ...@@ -1110,8 +1112,8 @@ FromObj(PyObject* tkapp, Tcl_Obj *value)
return newPyTclObject(value); return newPyTclObject(value);
} }
#ifdef WITH_THREAD
/* This mutex synchronizes inter-thread command calls. */ /* This mutex synchronizes inter-thread command calls. */
TCL_DECLARE_MUTEX(call_mutex) TCL_DECLARE_MUTEX(call_mutex)
typedef struct Tkapp_CallEvent { typedef struct Tkapp_CallEvent {
...@@ -1123,6 +1125,7 @@ typedef struct Tkapp_CallEvent { ...@@ -1123,6 +1125,7 @@ typedef struct Tkapp_CallEvent {
PyObject **exc_type, **exc_value, **exc_tb; PyObject **exc_type, **exc_value, **exc_tb;
Tcl_Condition *done; Tcl_Condition *done;
} Tkapp_CallEvent; } Tkapp_CallEvent;
#endif
void void
Tkapp_CallDeallocArgs(Tcl_Obj** objv, Tcl_Obj** objStore, int objc) Tkapp_CallDeallocArgs(Tcl_Obj** objv, Tcl_Obj** objStore, int objc)
...@@ -1210,6 +1213,8 @@ Tkapp_CallResult(TkappObject *self) ...@@ -1210,6 +1213,8 @@ Tkapp_CallResult(TkappObject *self)
return res; return res;
} }
#ifdef WITH_THREAD
/* Tkapp_CallProc is the event procedure that is executed in the context of /* Tkapp_CallProc is the event procedure that is executed in the context of
the Tcl interpreter thread. Initially, it holds the Tcl lock, and doesn't the Tcl interpreter thread. Initially, it holds the Tcl lock, and doesn't
hold the Python lock. */ hold the Python lock. */
...@@ -1254,6 +1259,8 @@ done: ...@@ -1254,6 +1259,8 @@ done:
return 1; return 1;
} }
#endif
/* This is the main entry point for calling a Tcl command. /* This is the main entry point for calling a Tcl command.
It supports three cases, with regard to threading: It supports three cases, with regard to threading:
1. Tcl is not threaded: Must have the Tcl lock, then can invoke command in 1. Tcl is not threaded: Must have the Tcl lock, then can invoke command in
...@@ -1483,9 +1490,11 @@ Tkapp_AddErrorInfo(PyObject *self, PyObject *args) ...@@ -1483,9 +1490,11 @@ Tkapp_AddErrorInfo(PyObject *self, PyObject *args)
/** Tcl Variable **/ /** Tcl Variable **/
typedef PyObject* (*EventFunc)(PyObject*, PyObject *args, int flags);
#ifdef WITH_THREAD
TCL_DECLARE_MUTEX(var_mutex) TCL_DECLARE_MUTEX(var_mutex)
typedef PyObject* (*EventFunc)(PyObject*, PyObject *args, int flags);
typedef struct VarEvent { typedef struct VarEvent {
Tcl_Event ev; /* must be first */ Tcl_Event ev; /* must be first */
PyObject *self; PyObject *self;
...@@ -1497,6 +1506,7 @@ typedef struct VarEvent { ...@@ -1497,6 +1506,7 @@ typedef struct VarEvent {
PyObject **exc_val; PyObject **exc_val;
Tcl_Condition *cond; Tcl_Condition *cond;
} VarEvent; } VarEvent;
#endif
static int static int
varname_converter(PyObject *in, void *_out) varname_converter(PyObject *in, void *_out)
...@@ -1518,6 +1528,8 @@ varname_converter(PyObject *in, void *_out) ...@@ -1518,6 +1528,8 @@ varname_converter(PyObject *in, void *_out)
return 0; return 0;
} }
#ifdef WITH_THREAD
static void static void
var_perform(VarEvent *ev) var_perform(VarEvent *ev)
{ {
...@@ -1545,11 +1557,13 @@ var_proc(VarEvent* ev, int flags) ...@@ -1545,11 +1557,13 @@ var_proc(VarEvent* ev, int flags)
return 1; return 1;
} }
#endif
static PyObject* static PyObject*
var_invoke(EventFunc func, PyObject *selfptr, PyObject *args, int flags) var_invoke(EventFunc func, PyObject *selfptr, PyObject *args, int flags)
{ {
TkappObject *self = (TkappObject*)selfptr;
#ifdef WITH_THREAD #ifdef WITH_THREAD
TkappObject *self = (TkappObject*)selfptr;
if (self->threaded && self->thread_id != Tcl_GetCurrentThread()) { if (self->threaded && self->thread_id != Tcl_GetCurrentThread()) {
TkappObject *self = (TkappObject*)selfptr; TkappObject *self = (TkappObject*)selfptr;
VarEvent *ev; VarEvent *ev;
...@@ -2052,6 +2066,7 @@ PythonCmdDelete(ClientData clientData) ...@@ -2052,6 +2066,7 @@ PythonCmdDelete(ClientData clientData)
#ifdef WITH_THREAD
TCL_DECLARE_MUTEX(command_mutex) TCL_DECLARE_MUTEX(command_mutex)
typedef struct CommandEvent{ typedef struct CommandEvent{
...@@ -2078,6 +2093,7 @@ Tkapp_CommandProc(CommandEvent *ev, int flags) ...@@ -2078,6 +2093,7 @@ Tkapp_CommandProc(CommandEvent *ev, int flags)
Tcl_MutexUnlock(&command_mutex); Tcl_MutexUnlock(&command_mutex);
return 1; return 1;
} }
#endif
static PyObject * static PyObject *
Tkapp_CreateCommand(PyObject *selfptr, PyObject *args) Tkapp_CreateCommand(PyObject *selfptr, PyObject *args)
...@@ -2108,7 +2124,7 @@ Tkapp_CreateCommand(PyObject *selfptr, PyObject *args) ...@@ -2108,7 +2124,7 @@ Tkapp_CreateCommand(PyObject *selfptr, PyObject *args)
Py_INCREF(func); Py_INCREF(func);
data->self = selfptr; data->self = selfptr;
data->func = func; data->func = func;
#ifdef WITH_THREAD
if (self->threaded && self->thread_id != Tcl_GetCurrentThread()) { if (self->threaded && self->thread_id != Tcl_GetCurrentThread()) {
Tcl_Condition cond = NULL; Tcl_Condition cond = NULL;
CommandEvent *ev = (CommandEvent*)ckalloc(sizeof(CommandEvent)); CommandEvent *ev = (CommandEvent*)ckalloc(sizeof(CommandEvent));
...@@ -2122,7 +2138,9 @@ Tkapp_CreateCommand(PyObject *selfptr, PyObject *args) ...@@ -2122,7 +2138,9 @@ Tkapp_CreateCommand(PyObject *selfptr, PyObject *args)
Tkapp_ThreadSend(self, (Tcl_Event*)ev, &cond, &command_mutex); Tkapp_ThreadSend(self, (Tcl_Event*)ev, &cond, &command_mutex);
Tcl_ConditionFinalize(&cond); Tcl_ConditionFinalize(&cond);
} }
else { else
#endif
{
ENTER_TCL ENTER_TCL
err = Tcl_CreateCommand( err = Tcl_CreateCommand(
Tkapp_Interp(self), cmdName, PythonCmd, Tkapp_Interp(self), cmdName, PythonCmd,
...@@ -2150,6 +2168,8 @@ Tkapp_DeleteCommand(PyObject *selfptr, PyObject *args) ...@@ -2150,6 +2168,8 @@ Tkapp_DeleteCommand(PyObject *selfptr, PyObject *args)
if (!PyArg_ParseTuple(args, "s:deletecommand", &cmdName)) if (!PyArg_ParseTuple(args, "s:deletecommand", &cmdName))
return NULL; return NULL;
#ifdef WITH_THREAD
if (self->threaded && self->thread_id != Tcl_GetCurrentThread()) { if (self->threaded && self->thread_id != Tcl_GetCurrentThread()) {
Tcl_Condition cond = NULL; Tcl_Condition cond = NULL;
CommandEvent *ev; CommandEvent *ev;
...@@ -2164,7 +2184,9 @@ Tkapp_DeleteCommand(PyObject *selfptr, PyObject *args) ...@@ -2164,7 +2184,9 @@ Tkapp_DeleteCommand(PyObject *selfptr, PyObject *args)
&command_mutex); &command_mutex);
Tcl_ConditionFinalize(&cond); Tcl_ConditionFinalize(&cond);
} }
else { else
#endif
{
ENTER_TCL ENTER_TCL
err = Tcl_DeleteCommand(self->interp, cmdName); err = Tcl_DeleteCommand(self->interp, cmdName);
LEAVE_TCL LEAVE_TCL
......
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