diff options
author | Barry Warsaw <barry@python.org> | 2000-12-06 21:47:46 (GMT) |
---|---|---|
committer | Barry Warsaw <barry@python.org> | 2000-12-06 21:47:46 (GMT) |
commit | b6a54d2a2cd0537be8e013a96068a8ffeaee5847 (patch) | |
tree | d356dabe069c2497039ef541e3122fddff1b0e30 /Python/sysmodule.c | |
parent | e63544f872c4d1af8e76b42b32db79eef12c8902 (diff) | |
download | cpython-b6a54d2a2cd0537be8e013a96068a8ffeaee5847.zip cpython-b6a54d2a2cd0537be8e013a96068a8ffeaee5847.tar.gz cpython-b6a54d2a2cd0537be8e013a96068a8ffeaee5847.tar.bz2 |
_getframe(): New sys module function for getting at the stack frame.
Implements and closes SF patch #102106, with Guido's suggested
documentation changes.
Diffstat (limited to 'Python/sysmodule.c')
-rw-r--r-- | Python/sysmodule.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/Python/sysmodule.c b/Python/sysmodule.c index ade9063..b569a9a 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -15,6 +15,8 @@ Data members: */ #include "Python.h" +#include "compile.h" +#include "frameobject.h" #include "osdefs.h" @@ -284,6 +286,40 @@ sys_getcounts(PyObject *self, PyObject *args) } #endif +static char getframe_doc[] = +"_getframe([depth]) -> frameobject\n\ +\n\ +Return a frame object from the call stack. If optional integer depth is\n\ +given, return the frame object that many calls below the top of the stack.\n\ +If that is deeper than the call stack, ValueError is raised. The default\n\ +for depth is zero, returning the frame at the top of the call stack.\n\ +\n\ +This function should be used for internal and specialized\n\ +purposes only."; + +static PyObject * +sys_getframe(PyObject *self, PyObject *args) +{ + PyFrameObject *f = PyThreadState_Get()->frame; + int depth = -1; + + if (!PyArg_ParseTuple(args, "|i:_getframe", &depth)) + return NULL; + + while (depth > 0 && f != NULL) { + f = f->f_back; + --depth; + } + if (f == NULL) { + PyErr_SetString(PyExc_ValueError, + "call stack is not deep enough"); + return NULL; + } + Py_INCREF(f); + return (PyObject*)f; +} + + #ifdef Py_TRACE_REFS /* Defined in objects.c because it uses static globals if that file */ extern PyObject *_Py_GetObjects(PyObject *, PyObject *); @@ -313,6 +349,7 @@ static PyMethodDef sys_methods[] = { {"getrefcount", sys_getrefcount, 1, getrefcount_doc}, {"getrecursionlimit", sys_getrecursionlimit, 1, getrecursionlimit_doc}, + {"_getframe", sys_getframe, 1, getframe_doc}, #ifdef USE_MALLOPT {"mdebug", sys_mdebug, 1}, #endif |