diff options
Diffstat (limited to 'source/blender/python/intern/bpy_util.c')
-rw-r--r-- | source/blender/python/intern/bpy_util.c | 116 |
1 files changed, 17 insertions, 99 deletions
diff --git a/source/blender/python/intern/bpy_util.c b/source/blender/python/intern/bpy_util.c index 1a2d7b297b6..95d2f3bba9f 100644 --- a/source/blender/python/intern/bpy_util.c +++ b/source/blender/python/intern/bpy_util.c @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -22,6 +22,8 @@ * ***** END GPL LICENSE BLOCK ***** */ +#include <Python.h> + #include "bpy_util.h" #include "BLI_dynstr.h" #include "MEM_guardedalloc.h" @@ -30,97 +32,9 @@ #include "../generic/py_capi_utils.h" -bContext* __py_context = NULL; -bContext* BPy_GetContext(void) { return __py_context; }; -void BPy_SetContext(bContext *C) { __py_context= C; }; - -int BPY_class_validate(const char *class_type, PyObject *class, PyObject *base_class, BPY_class_attr_check* class_attrs, PyObject **py_class_attrs) -{ - PyObject *item, *fitem; - PyObject *py_arg_count; - int i, arg_count; - - if (base_class) { - if (!PyObject_IsSubclass(class, base_class)) { - PyObject *name= PyObject_GetAttrString(base_class, "__name__"); - PyErr_Format( PyExc_AttributeError, "expected %s subclass of class \"%s\"", class_type, name ? _PyUnicode_AsString(name):"<UNKNOWN>"); - Py_XDECREF(name); - return -1; - } - } - - for(i= 0;class_attrs->name; class_attrs++, i++) { - item = PyObject_GetAttrString(class, class_attrs->name); - - if (py_class_attrs) - py_class_attrs[i]= item; - - if (item==NULL) { - if ((class_attrs->flag & BPY_CLASS_ATTR_OPTIONAL)==0) { - PyErr_Format( PyExc_AttributeError, "expected %s class to have an \"%s\" attribute", class_type, class_attrs->name); - return -1; - } - - PyErr_Clear(); - } - else { - Py_DECREF(item); /* no need to keep a ref, the class owns it */ - - if((item==Py_None) && (class_attrs->flag & BPY_CLASS_ATTR_NONE_OK)) { - /* dont do anything, this is ok, dont bother checking other types */ - } - else { - switch(class_attrs->type) { - case 's': - if (PyUnicode_Check(item)==0) { - PyErr_Format( PyExc_AttributeError, "expected %s class \"%s\" attribute to be a string", class_type, class_attrs->name); - return -1; - } - if(class_attrs->len != -1 && class_attrs->len < PyUnicode_GetSize(item)) { - PyErr_Format( PyExc_AttributeError, "expected %s class \"%s\" attribute string to be shorter then %d", class_type, class_attrs->name, class_attrs->len); - return -1; - } - - break; - case 'l': - if (PyList_Check(item)==0) { - PyErr_Format( PyExc_AttributeError, "expected %s class \"%s\" attribute to be a list", class_type, class_attrs->name); - return -1; - } - if(class_attrs->len != -1 && class_attrs->len < PyList_GET_SIZE(item)) { - PyErr_Format( PyExc_AttributeError, "expected %s class \"%s\" attribute list to be shorter then %d", class_type, class_attrs->name, class_attrs->len); - return -1; - } - break; - case 'f': - if (PyMethod_Check(item)) - fitem= PyMethod_Function(item); /* py 2.x */ - else - fitem= item; /* py 3.x */ - - if (PyFunction_Check(fitem)==0) { - PyErr_Format( PyExc_AttributeError, "expected %s class \"%s\" attribute to be a function", class_type, class_attrs->name); - return -1; - } - if (class_attrs->arg_count >= 0) { /* -1 if we dont care*/ - py_arg_count = PyObject_GetAttrString(PyFunction_GET_CODE(fitem), "co_argcount"); - arg_count = PyLong_AsSsize_t(py_arg_count); - Py_DECREF(py_arg_count); - - if (arg_count != class_attrs->arg_count) { - PyErr_Format( PyExc_AttributeError, "expected %s class \"%s\" function to have %d args", class_type, class_attrs->name, class_attrs->arg_count); - return -1; - } - } - break; - } - } - } - } - return 0; -} - - +static bContext* __py_context = NULL; +bContext* BPy_GetContext(void) { return __py_context; } +void BPy_SetContext(bContext *C) { __py_context= C; } char *BPy_enum_as_string(EnumPropertyItem *item) { @@ -138,14 +52,18 @@ char *BPy_enum_as_string(EnumPropertyItem *item) return cstring; } -int BPy_reports_to_error(ReportList *reports) +short BPy_reports_to_error(ReportList *reports, const short clear) { char *report_str; report_str= BKE_reports_string(reports, RPT_ERROR); + if(clear) { + BKE_reports_clear(reports); + } + if(report_str) { - PyErr_SetString(PyExc_SystemError, report_str); + PyErr_SetString(PyExc_RuntimeError, report_str); MEM_freeN(report_str); } @@ -153,7 +71,7 @@ int BPy_reports_to_error(ReportList *reports) } -int BPy_errors_to_report(ReportList *reports) +short BPy_errors_to_report(ReportList *reports) { PyObject *pystring; PyObject *pystring_format= NULL; // workaround, see below @@ -201,7 +119,7 @@ int BPy_errors_to_report(ReportList *reports) } /* array utility function */ -int PyC_AsArray(void *array, PyObject *value, int length, PyTypeObject *type, char *error_prefix) +int PyC_AsArray(void *array, PyObject *value, int length, PyTypeObject *type, const char *error_prefix) { PyObject *value_fast; int value_len; @@ -215,7 +133,7 @@ int PyC_AsArray(void *array, PyObject *value, int length, PyTypeObject *type, ch if(value_len != length) { Py_DECREF(value); - PyErr_Format(PyExc_TypeError, "%s: invalid sequence length. expected %d, got %d.", error_prefix, length, value_len); + PyErr_Format(PyExc_TypeError, "%.200s: invalid sequence length. expected %d, got %d", error_prefix, length, value_len); return -1; } @@ -240,14 +158,14 @@ int PyC_AsArray(void *array, PyObject *value, int length, PyTypeObject *type, ch } else { Py_DECREF(value_fast); - PyErr_Format(PyExc_TypeError, "%s: internal error %s is invalid.", error_prefix, type->tp_name); + PyErr_Format(PyExc_TypeError, "%s: internal error %s is invalid", error_prefix, type->tp_name); return -1; } Py_DECREF(value_fast); if(PyErr_Occurred()) { - PyErr_Format(PyExc_TypeError, "%s: one or more items could not be used as a %s.", error_prefix, type->tp_name); + PyErr_Format(PyExc_TypeError, "%s: one or more items could not be used as a %s", error_prefix, type->tp_name); return -1; } |