pyapi, use direct access to the frame rather then python attributes.
This commit is contained in:
@@ -21,6 +21,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <Python.h>
|
#include <Python.h>
|
||||||
|
#include <frameobject.h>
|
||||||
|
|
||||||
#include "py_capi_utils.h"
|
#include "py_capi_utils.h"
|
||||||
|
|
||||||
@@ -56,37 +57,20 @@ void PyC_LineSpit(void) {
|
|||||||
|
|
||||||
void PyC_FileAndNum(const char **filename, int *lineno)
|
void PyC_FileAndNum(const char **filename, int *lineno)
|
||||||
{
|
{
|
||||||
PyObject *getframe, *frame;
|
PyFrameObject *frame;
|
||||||
PyObject *f_lineno= NULL, *co_filename= NULL;
|
|
||||||
|
|
||||||
if (filename) *filename= NULL;
|
if (filename) *filename= NULL;
|
||||||
if (lineno) *lineno = -1;
|
if (lineno) *lineno = -1;
|
||||||
|
|
||||||
getframe = PySys_GetObject("_getframe"); // borrowed
|
if (!(frame= PyThreadState_GET()->frame)) {
|
||||||
if (getframe==NULL) {
|
|
||||||
PyErr_Clear();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
frame = PyObject_CallObject(getframe, NULL);
|
|
||||||
if (frame==NULL) {
|
|
||||||
PyErr_Clear();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* when executing a script */
|
/* when executing a script */
|
||||||
if (filename) {
|
if (filename) {
|
||||||
co_filename= PyC_Object_GetAttrStringArgs(frame, 2, "f_code", "co_filename");
|
*filename = _PyUnicode_AsString(frame->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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* when executing a module */
|
/* when executing a module */
|
||||||
if(filename && *filename == NULL) {
|
if(filename && *filename == NULL) {
|
||||||
/* try an alternative method to get the filename - module based
|
/* 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
Py_DECREF(frame);
|
if (lineno) {
|
||||||
|
*lineno = PyFrame_GetLineNumber(frame);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Would be nice if python had this built in */
|
/* Would be nice if python had this built in */
|
||||||
|
@@ -3937,6 +3937,16 @@ static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* for testing */
|
||||||
|
/*
|
||||||
|
{
|
||||||
|
const char *fn;
|
||||||
|
int lineno;
|
||||||
|
PyC_FileAndNum(&fn, &lineno);
|
||||||
|
printf("pyrna_func_call > %.200s.%.200s : %.200s:%d\n", RNA_struct_identifier(self_ptr->type), RNA_function_identifier(self_func), fn, lineno);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
/* include the ID pointer for pyrna_param_to_py() so we can include the
|
/* include the ID pointer for pyrna_param_to_py() so we can include the
|
||||||
* ID pointer on return values, this only works when returned values have
|
* ID pointer on return values, this only works when returned values have
|
||||||
* the same ID as the functions. */
|
* the same ID as the functions. */
|
||||||
@@ -5415,7 +5425,7 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
|
|||||||
/* testing, for correctness, not operator and not draw function */
|
/* testing, for correctness, not operator and not draw function */
|
||||||
const short is_readonly= strstr("draw", func_id) || /*strstr("render", func_id) ||*/ !RNA_struct_is_a(ptr->type, &RNA_Operator);
|
const short is_readonly= strstr("draw", func_id) || /*strstr("render", func_id) ||*/ !RNA_struct_is_a(ptr->type, &RNA_Operator);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
py_class= RNA_struct_py_type_get(ptr->type);
|
py_class= RNA_struct_py_type_get(ptr->type);
|
||||||
|
|
||||||
/* rare case. can happen when registering subclasses */
|
/* rare case. can happen when registering subclasses */
|
||||||
|
Reference in New Issue
Block a user