| #include "parts.h" | |
| #include "util.h" | |
| #include "frameobject.h" // PyFrame_New() | |
| static PyObject * | |
| frame_getlocals(PyObject *self, PyObject *frame) | |
| { | |
| if (!PyFrame_Check(frame)) { | |
| PyErr_SetString(PyExc_TypeError, "argument must be a frame"); | |
| return NULL; | |
| } | |
| return PyFrame_GetLocals((PyFrameObject *)frame); | |
| } | |
| static PyObject * | |
| frame_getglobals(PyObject *self, PyObject *frame) | |
| { | |
| if (!PyFrame_Check(frame)) { | |
| PyErr_SetString(PyExc_TypeError, "argument must be a frame"); | |
| return NULL; | |
| } | |
| return PyFrame_GetGlobals((PyFrameObject *)frame); | |
| } | |
| static PyObject * | |
| frame_getgenerator(PyObject *self, PyObject *frame) | |
| { | |
| if (!PyFrame_Check(frame)) { | |
| PyErr_SetString(PyExc_TypeError, "argument must be a frame"); | |
| return NULL; | |
| } | |
| return PyFrame_GetGenerator((PyFrameObject *)frame); | |
| } | |
| static PyObject * | |
| frame_getbuiltins(PyObject *self, PyObject *frame) | |
| { | |
| if (!PyFrame_Check(frame)) { | |
| PyErr_SetString(PyExc_TypeError, "argument must be a frame"); | |
| return NULL; | |
| } | |
| return PyFrame_GetBuiltins((PyFrameObject *)frame); | |
| } | |
| static PyObject * | |
| frame_getlasti(PyObject *self, PyObject *frame) | |
| { | |
| if (!PyFrame_Check(frame)) { | |
| PyErr_SetString(PyExc_TypeError, "argument must be a frame"); | |
| return NULL; | |
| } | |
| int lasti = PyFrame_GetLasti((PyFrameObject *)frame); | |
| if (lasti < 0) { | |
| assert(lasti == -1); | |
| Py_RETURN_NONE; | |
| } | |
| return PyLong_FromLong(lasti); | |
| } | |
| static PyObject * | |
| frame_new(PyObject *self, PyObject *args) | |
| { | |
| PyObject *code, *globals, *locals; | |
| if (!PyArg_ParseTuple(args, "OOO", &code, &globals, &locals)) { | |
| return NULL; | |
| } | |
| if (!PyCode_Check(code)) { | |
| PyErr_SetString(PyExc_TypeError, "argument must be a code object"); | |
| return NULL; | |
| } | |
| PyThreadState *tstate = PyThreadState_Get(); | |
| return (PyObject *)PyFrame_New(tstate, (PyCodeObject *)code, globals, locals); | |
| } | |
| static PyObject * | |
| frame_getvar(PyObject *self, PyObject *args) | |
| { | |
| PyObject *frame, *name; | |
| if (!PyArg_ParseTuple(args, "OO", &frame, &name)) { | |
| return NULL; | |
| } | |
| if (!PyFrame_Check(frame)) { | |
| PyErr_SetString(PyExc_TypeError, "argument must be a frame"); | |
| return NULL; | |
| } | |
| return PyFrame_GetVar((PyFrameObject *)frame, name); | |
| } | |
| static PyObject * | |
| frame_getvarstring(PyObject *self, PyObject *args) | |
| { | |
| PyObject *frame; | |
| const char *name; | |
| if (!PyArg_ParseTuple(args, "Oy", &frame, &name)) { | |
| return NULL; | |
| } | |
| if (!PyFrame_Check(frame)) { | |
| PyErr_SetString(PyExc_TypeError, "argument must be a frame"); | |
| return NULL; | |
| } | |
| return PyFrame_GetVarString((PyFrameObject *)frame, name); | |
| } | |
| static PyMethodDef test_methods[] = { | |
| {"frame_getlocals", frame_getlocals, METH_O, NULL}, | |
| {"frame_getglobals", frame_getglobals, METH_O, NULL}, | |
| {"frame_getgenerator", frame_getgenerator, METH_O, NULL}, | |
| {"frame_getbuiltins", frame_getbuiltins, METH_O, NULL}, | |
| {"frame_getlasti", frame_getlasti, METH_O, NULL}, | |
| {"frame_new", frame_new, METH_VARARGS, NULL}, | |
| {"frame_getvar", frame_getvar, METH_VARARGS, NULL}, | |
| {"frame_getvarstring", frame_getvarstring, METH_VARARGS, NULL}, | |
| {NULL}, | |
| }; | |
| int | |
| _PyTestCapi_Init_Frame(PyObject *m) | |
| { | |
| return PyModule_AddFunctions(m, test_methods); | |
| } | |