[Python-checkins] r60138 - in python/trunk: Doc/library/sys.rst Lib/test/test_profilehooks.py Lib/test/test_trace.py Misc/NEWS Python/sysmodule.c
georg.brandl
python-checkins at python.org
Sun Jan 20 14:59:47 CET 2008
Author: georg.brandl
Date: Sun Jan 20 14:59:46 2008
New Revision: 60138
Modified:
python/trunk/Doc/library/sys.rst
python/trunk/Lib/test/test_profilehooks.py
python/trunk/Lib/test/test_trace.py
python/trunk/Misc/NEWS
python/trunk/Python/sysmodule.c
Log:
#1648: add sys.gettrace() and sys.getprofile().
Modified: python/trunk/Doc/library/sys.rst
==============================================================================
--- python/trunk/Doc/library/sys.rst (original)
+++ python/trunk/Doc/library/sys.rst Sun Jan 20 14:59:46 2008
@@ -392,6 +392,35 @@
This function should be used for internal and specialized purposes only.
+.. function:: getprofile()
+
+ .. index::
+ single: profile function
+ single: profiler
+
+ Get the profiler function as set by :func:`setprofile`.
+
+ .. versionadded:: 2.6
+
+
+.. function:: gettrace()
+
+ .. index::
+ single: trace function
+ single: debugger
+
+ Get the trace function as set by :func:`settrace`.
+
+ .. note::
+
+ The :func:`gettrace` function is intended only for implementing debuggers,
+ profilers, coverage tools and the like. Its behavior is part of the
+ implementation platform, rather than part of the language definition,
+ and thus may not be available in all Python implementations.
+
+ .. versionadded:: 2.6
+
+
.. function:: getwindowsversion()
Return a tuple containing five components, describing the Windows version
Modified: python/trunk/Lib/test/test_profilehooks.py
==============================================================================
--- python/trunk/Lib/test/test_profilehooks.py (original)
+++ python/trunk/Lib/test/test_profilehooks.py Sun Jan 20 14:59:46 2008
@@ -4,6 +4,22 @@
from test import test_support
+class TestGetProfile(unittest.TestCase):
+ def setUp(self):
+ sys.setprofile(None)
+
+ def tearDown(self):
+ sys.setprofile(None)
+
+ def test_empty(self):
+ assert sys.getprofile() == None
+
+ def test_setget(self):
+ def fn(*args):
+ pass
+
+ sys.setprofile(fn)
+ assert sys.getprofile() == fn
class HookWatcher:
def __init__(self):
@@ -359,6 +375,7 @@
def test_main():
test_support.run_unittest(
+ TestGetProfile,
ProfileHookTestCase,
ProfileSimulatorTestCase
)
Modified: python/trunk/Lib/test/test_trace.py
==============================================================================
--- python/trunk/Lib/test/test_trace.py (original)
+++ python/trunk/Lib/test/test_trace.py Sun Jan 20 14:59:46 2008
@@ -268,6 +268,20 @@
self.compare_events(func.func_code.co_firstlineno,
tracer.events, func.events)
+ def set_and_retrieve_none(self):
+ sys.settrace(None)
+ assert sys.gettrace() is None
+
+ def set_and_retrieve_func(self):
+ def fn(*args):
+ pass
+
+ sys.settrace(fn)
+ try:
+ assert sys.gettrace() is fn
+ finally:
+ sys.settrace(None)
+
def test_01_basic(self):
self.run_test(basic)
def test_02_arigo(self):
Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS (original)
+++ python/trunk/Misc/NEWS Sun Jan 20 14:59:46 2008
@@ -1042,6 +1042,8 @@
Extension Modules
-----------------
+- Patch #1648: added ``sys.getprofile()`` and ``sys.gettrace()``.
+
- Patch #1663329: added ``os.closerange()`` function to quickly close a range
of file descriptors without considering errors.
Modified: python/trunk/Python/sysmodule.c
==============================================================================
--- python/trunk/Python/sysmodule.c (original)
+++ python/trunk/Python/sysmodule.c Sun Jan 20 14:59:46 2008
@@ -398,6 +398,25 @@
);
static PyObject *
+sys_gettrace(PyObject *self, PyObject *args)
+{
+ PyThreadState *tstate = PyThreadState_GET();
+ PyObject *temp = tstate->c_traceobj;
+
+ if (temp == NULL)
+ temp = Py_None;
+ Py_INCREF(temp);
+ return temp;
+}
+
+PyDoc_STRVAR(gettrace_doc,
+"gettrace()\n\
+\n\
+Return the global debug tracing function set with sys.settrace.\n\
+See the debugger chapter in the library manual."
+);
+
+static PyObject *
sys_setprofile(PyObject *self, PyObject *args)
{
if (trace_init() == -1)
@@ -418,6 +437,25 @@
);
static PyObject *
+sys_getprofile(PyObject *self, PyObject *args)
+{
+ PyThreadState *tstate = PyThreadState_GET();
+ PyObject *temp = tstate->c_profileobj;
+
+ if (temp == NULL)
+ temp = Py_None;
+ Py_INCREF(temp);
+ return temp;
+}
+
+PyDoc_STRVAR(getprofile_doc,
+"getprofile()\n\
+\n\
+Return the profiling function set with sys.setprofile.\n\
+See the profiler chapter in the library manual."
+);
+
+static PyObject *
sys_setcheckinterval(PyObject *self, PyObject *args)
{
if (!PyArg_ParseTuple(args, "i:setcheckinterval", &_Py_CheckInterval))
@@ -793,12 +831,14 @@
setdlopenflags_doc},
#endif
{"setprofile", sys_setprofile, METH_O, setprofile_doc},
+ {"getprofile", sys_getprofile, METH_NOARGS, getprofile_doc},
{"setrecursionlimit", sys_setrecursionlimit, METH_VARARGS,
setrecursionlimit_doc},
#ifdef WITH_TSC
{"settscdump", sys_settscdump, METH_VARARGS, settscdump_doc},
#endif
{"settrace", sys_settrace, METH_O, settrace_doc},
+ {"gettrace", sys_gettrace, METH_NOARGS, gettrace_doc},
{"call_tracing", sys_call_tracing, METH_VARARGS, call_tracing_doc},
{NULL, NULL} /* sentinel */
};
@@ -941,8 +981,10 @@
exc_clear() -- clear the exception state for the current thread\n\
exit() -- exit the interpreter by raising SystemExit\n\
getdlopenflags() -- returns flags to be used for dlopen() calls\n\
+getprofile() -- get the global profiling function\n\
getrefcount() -- return the reference count for an object (plus one :-)\n\
getrecursionlimit() -- return the max recursion depth for the interpreter\n\
+gettrace() -- get the global debug tracing function\n\
setcheckinterval() -- control how often the interpreter checks for events\n\
setdlopenflags() -- set the flags to be used for dlopen() calls\n\
setprofile() -- set the global profiling function\n\
More information about the Python-checkins
mailing list