| #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); |
| } |
| |