Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2011-02-22 10:57:18 +0300
committerCampbell Barton <ideasman42@gmail.com>2011-02-22 10:57:18 +0300
commit1e120098fc7e668a28d7eed6a082f5a8b134e39c (patch)
tree39a838b39efe3c26b6a4a316db69b222e4ad1279 /source/blender/python/generic
parent91357ae2ea11894adf1519eb149ac3dd48bc26f8 (diff)
pyapi, use direct access to the frame rather then python attributes.
Diffstat (limited to 'source/blender/python/generic')
-rw-r--r--source/blender/python/generic/py_capi_utils.c45
1 files changed, 9 insertions, 36 deletions
diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c
index e8618883874..8e8da87b85f 100644
--- a/source/blender/python/generic/py_capi_utils.c
+++ b/source/blender/python/generic/py_capi_utils.c
@@ -21,6 +21,7 @@
*/
#include <Python.h>
+#include <frameobject.h>
#include "py_capi_utils.h"
@@ -56,37 +57,20 @@ void PyC_LineSpit(void) {
void PyC_FileAndNum(const char **filename, int *lineno)
{
- PyObject *getframe, *frame;
- PyObject *f_lineno= NULL, *co_filename= NULL;
+ PyFrameObject *frame;
if (filename) *filename= NULL;
if (lineno) *lineno = -1;
-
- getframe = PySys_GetObject("_getframe"); // borrowed
- if (getframe==NULL) {
- PyErr_Clear();
- return;
- }
-
- frame = PyObject_CallObject(getframe, NULL);
- if (frame==NULL) {
- PyErr_Clear();
+
+ if (!(frame= PyThreadState_GET()->frame)) {
return;
}
-
+
/* when executing a script */
if (filename) {
- co_filename= PyC_Object_GetAttrStringArgs(frame, 2, "f_code", "co_filename");
- if (co_filename==NULL) {
- PyErr_SetString(PyExc_RuntimeError, "Could not access sys._getframe().f_code.co_filename");
- Py_DECREF(frame);
- return;
- }
-
- *filename = _PyUnicode_AsString(co_filename);
- Py_DECREF(co_filename);
+ *filename = _PyUnicode_AsString(frame->f_code->co_filename);
}
-
+
/* when executing a module */
if(filename && *filename == NULL) {
/* try an alternative method to get the filename - module based
@@ -104,21 +88,10 @@ void PyC_FileAndNum(const char **filename, int *lineno)
}
}
}
-
-
+
if (lineno) {
- f_lineno= PyObject_GetAttrString(frame, "f_lineno");
- if (f_lineno==NULL) {
- PyErr_SetString(PyExc_RuntimeError, "Could not access sys._getframe().f_lineno");
- Py_DECREF(frame);
- return;
- }
-
- *lineno = (int)PyLong_AsSsize_t(f_lineno);
- Py_DECREF(f_lineno);
+ *lineno = PyFrame_GetLineNumber(frame);
}
-
- Py_DECREF(frame);
}
/* Would be nice if python had this built in */