mirror of
https://github.com/python/cpython.git
synced 2025-09-27 02:39:58 +00:00
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 ........
This commit is contained in:
parent
5550365f4b
commit
5879d4122a
17 changed files with 50 additions and 77 deletions
|
@ -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.
|
||||||
|
|
||||||
.. 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
|
||||||
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
|
||||||
|
|
||||||
.. 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>`_.
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 2
|
:maxdepth: 2
|
||||||
|
:numbered:
|
||||||
|
|
||||||
intro.rst
|
intro.rst
|
||||||
functions.rst
|
functions.rst
|
||||||
|
|
|
@ -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
|
||||||
: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__`.
|
||||||
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::
|
||||||
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.
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 2
|
:maxdepth: 2
|
||||||
|
:numbered:
|
||||||
|
|
||||||
introduction.rst
|
introduction.rst
|
||||||
lexical_analysis.rst
|
lexical_analysis.rst
|
||||||
|
|
|
@ -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.
|
||||||
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.
|
||||||
|
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
|
:numbered:
|
||||||
|
|
||||||
cmdline.rst
|
cmdline.rst
|
||||||
unix.rst
|
unix.rst
|
||||||
|
|
|
@ -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:
|
||||||
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))
|
||||||
|
|
|
@ -1,47 +0,0 @@
|
||||||
"""
|
|
||||||
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
|
|
|
@ -1,14 +0,0 @@
|
||||||
# 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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#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,
|
||||||
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)
|
||||||
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 {
|
||||||
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)
|
||||||
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:
|
||||||
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)
|
||||||
|
|
||||||
/** 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 {
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
&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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue