diff options
Diffstat (limited to 'source/blender/python/intern/bpy_util.c')
-rw-r--r-- | source/blender/python/intern/bpy_util.c | 127 |
1 files changed, 26 insertions, 101 deletions
diff --git a/source/blender/python/intern/bpy_util.c b/source/blender/python/intern/bpy_util.c index fb5b2a0d399..6e321015bc6 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,13 @@ * ***** END GPL LICENSE BLOCK ***** */ +/** \file blender/python/intern/bpy_util.c + * \ingroup pythonintern + */ + + +#include <Python.h> + #include "bpy_util.h" #include "BLI_dynstr.h" #include "MEM_guardedalloc.h" @@ -30,98 +37,10 @@ #include "../generic/py_capi_utils.h" -bContext* __py_context = NULL; +static 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; -} - - - char *BPy_enum_as_string(EnumPropertyItem *item) { DynStr *dynstr= BLI_dynstr_new(); @@ -133,12 +52,12 @@ char *BPy_enum_as_string(EnumPropertyItem *item) BLI_dynstr_appendf(dynstr, (e==item)?"'%s'":", '%s'", item->identifier); } - cstring = BLI_dynstr_get_cstring(dynstr); + cstring= BLI_dynstr_get_cstring(dynstr); BLI_dynstr_free(dynstr); return cstring; } -short BPy_reports_to_error(ReportList *reports, const short clear) +short BPy_reports_to_error(ReportList *reports, PyObject *exception, const short clear) { char *report_str; @@ -149,11 +68,11 @@ short BPy_reports_to_error(ReportList *reports, const short clear) } if(report_str) { - PyErr_SetString(PyExc_SystemError, report_str); + PyErr_SetString(exception, report_str); MEM_freeN(report_str); } - return (report_str != NULL); + return (report_str == NULL) ? 0 : -1; } @@ -179,7 +98,7 @@ short BPy_errors_to_report(ReportList *reports) pystring= PyC_ExceptionBuffer(); if(pystring==NULL) { - BKE_report(reports, RPT_ERROR, "unknown py-exception, could not convert"); + BKE_report(reports, RPT_ERROR, "unknown py-exception, couldn't convert"); return 0; } @@ -219,7 +138,9 @@ int PyC_AsArray(void *array, PyObject *value, int length, PyTypeObject *type, co if(value_len != length) { Py_DECREF(value); - PyErr_Format(PyExc_TypeError, "%.200s: 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; } @@ -227,31 +148,35 @@ int PyC_AsArray(void *array, PyObject *value, int length, PyTypeObject *type, co if(type == &PyFloat_Type) { float *array_float= array; for(i=0; i<length; i++) { - array_float[i] = PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value_fast, i)); + array_float[i]= PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value_fast, i)); } } else if(type == &PyLong_Type) { int *array_int= array; for(i=0; i<length; i++) { - array_int[i] = PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value_fast, i)); + array_int[i]= PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value_fast, i)); } } else if(type == &PyBool_Type) { int *array_bool= array; for(i=0; i<length; i++) { - array_bool[i] = (PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value_fast, i)) != 0); + array_bool[i]= (PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value_fast, i)) != 0); } } 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; } |