Merged changes in the trunk up to revision 39759.
This commit is contained in:
@@ -28,13 +28,14 @@
|
||||
|
||||
#include <Python.h>
|
||||
|
||||
#include "bpy_intern_string.h"
|
||||
|
||||
PyObject *bpy_intern_str_register;
|
||||
PyObject *bpy_intern_str_unregister;
|
||||
PyObject *bpy_intern_str_bl_rna;
|
||||
PyObject *bpy_intern_str_order;
|
||||
PyObject *bpy_intern_str_attr;
|
||||
PyObject *bpy_intern_str___slots__;
|
||||
PyObject *bpy_intern_str___bases__;
|
||||
|
||||
void bpy_intern_string_init(void)
|
||||
{
|
||||
|
||||
@@ -117,7 +117,6 @@ static PyObject *pyop_poll(PyObject *UNUSED(self), PyObject *args)
|
||||
}
|
||||
|
||||
context_dict_back= CTX_py_dict_get(C);
|
||||
|
||||
CTX_py_dict_set(C, (void *)context_dict);
|
||||
Py_XINCREF(context_dict); /* so we done loose it */
|
||||
|
||||
@@ -293,7 +292,7 @@ static PyObject *pyop_call(PyObject *UNUSED(self), PyObject *args)
|
||||
* function corrects bpy.data (internal Main pointer) */
|
||||
BPY_modules_update(C);
|
||||
|
||||
/* needed for when WM_OT_read_factory_settings us called fro within a script */
|
||||
/* needed for when WM_OT_read_factory_settings us called from within a script */
|
||||
bpy_import_main_set(CTX_data_main(C));
|
||||
|
||||
/* return operator_ret as a bpy enum */
|
||||
|
||||
@@ -117,7 +117,7 @@ static PyObject *pymeth_PointerProperty= NULL;
|
||||
static PyObject *pymeth_CollectionProperty= NULL;
|
||||
static PyObject *pymeth_RemoveProperty= NULL;
|
||||
|
||||
PyObject *pyrna_struct_as_instance(PointerRNA *ptr)
|
||||
static PyObject *pyrna_struct_as_instance(PointerRNA *ptr)
|
||||
{
|
||||
PyObject *self= NULL;
|
||||
/* first get self */
|
||||
@@ -177,7 +177,7 @@ static PyObject *bpy_prop_deferred_return(PyObject *func, PyObject *kw)
|
||||
}
|
||||
|
||||
/* callbacks */
|
||||
void bpy_prop_update_cb(struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop)
|
||||
static void bpy_prop_update_cb(struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop)
|
||||
{
|
||||
PyGILState_STATE gilstate;
|
||||
PyObject **py_data= (PyObject **)RNA_property_py_data_get(prop);
|
||||
|
||||
@@ -1117,6 +1117,7 @@ static int pyrna_string_to_enum(PyObject *item, PointerRNA *ptr, PropertyRNA *pr
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* 'value' _must_ be a set type, error check before calling */
|
||||
int pyrna_set_to_enum_bitfield(EnumPropertyItem *items, PyObject *value, int *r_value, const char *error_prefix)
|
||||
{
|
||||
/* set of enum items, concatenate all values with OR */
|
||||
@@ -1138,8 +1139,10 @@ int pyrna_set_to_enum_bitfield(EnumPropertyItem *items, PyObject *value, int *r_
|
||||
error_prefix, Py_TYPE(key)->tp_name);
|
||||
return -1;
|
||||
}
|
||||
if(pyrna_enum_value_from_id(items, param, &ret, error_prefix) < 0)
|
||||
|
||||
if(pyrna_enum_value_from_id(items, param, &ret, error_prefix) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
flag |= ret;
|
||||
}
|
||||
@@ -1156,6 +1159,14 @@ static int pyrna_prop_to_enum_bitfield(PointerRNA *ptr, PropertyRNA *prop, PyObj
|
||||
|
||||
*r_value= 0;
|
||||
|
||||
if (!PyAnySet_Check(value)) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"%.200s, %.200s.%.200s expected a set, not a %.200s",
|
||||
error_prefix, RNA_struct_identifier(ptr->type),
|
||||
RNA_property_identifier(prop), Py_TYPE(value)->tp_name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
RNA_property_enum_items(BPy_GetContext(), ptr, prop, &item, NULL, &free);
|
||||
|
||||
if(item) {
|
||||
@@ -1529,33 +1540,18 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
|
||||
{
|
||||
int val= 0;
|
||||
|
||||
if (PyUnicode_Check(value)) {
|
||||
if (!pyrna_string_to_enum(value, ptr, prop, &val, error_prefix))
|
||||
return -1;
|
||||
}
|
||||
else if (PyAnySet_Check(value)) {
|
||||
if(RNA_property_flag(prop) & PROP_ENUM_FLAG) {
|
||||
/* set of enum items, concatenate all values with OR */
|
||||
if(pyrna_prop_to_enum_bitfield(ptr, prop, value, &val, error_prefix) < 0)
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"%.200s, %.200s.%.200s is not a bitflag enum type",
|
||||
error_prefix, RNA_struct_identifier(ptr->type),
|
||||
RNA_property_identifier(prop));
|
||||
/* type checkins is done by each function */
|
||||
if(RNA_property_flag(prop) & PROP_ENUM_FLAG) {
|
||||
/* set of enum items, concatenate all values with OR */
|
||||
if(pyrna_prop_to_enum_bitfield(ptr, prop, value, &val, error_prefix) < 0) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
const char *enum_str= pyrna_enum_as_string(ptr, prop);
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"%.200s %.200s.%.200s expected a string enum or a set of strings in (%.2000s), not %.200s",
|
||||
error_prefix, RNA_struct_identifier(ptr->type),
|
||||
RNA_property_identifier(prop), enum_str,
|
||||
Py_TYPE(value)->tp_name);
|
||||
MEM_freeN((void *)enum_str);
|
||||
return -1;
|
||||
/* simple enum string */
|
||||
if (!pyrna_string_to_enum(value, ptr, prop, &val, error_prefix) < 0) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if(data) *((int*)data)= val;
|
||||
@@ -4320,7 +4316,6 @@ static PyObject *small_dict_get_item_string(PyObject *dict, const char *key_look
|
||||
Py_ssize_t pos = 0;
|
||||
PyObject *value = NULL;
|
||||
|
||||
/* case not, search for it in the script's global dictionary */
|
||||
while (PyDict_Next(dict, &pos, &key, &value)) {
|
||||
if(PyUnicode_Check(key)) {
|
||||
if(strcmp(key_lookup, _PyUnicode_AsString(key))==0) {
|
||||
@@ -6422,7 +6417,21 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
|
||||
err= -1;
|
||||
}
|
||||
else if(ret_len==1) {
|
||||
err= pyrna_py_to_prop(&funcptr, pret_single, retdata_single, ret, "calling class function:");
|
||||
err= pyrna_py_to_prop(&funcptr, pret_single, retdata_single, ret, "");
|
||||
|
||||
/* when calling operator funcs only gives Function.result with
|
||||
* no line number since the func has finished calling on error,
|
||||
* re-raise the exception with more info since it would be slow to
|
||||
* create prefix on every call (when there are no errors) */
|
||||
if(err == -1 && PyErr_Occurred()) {
|
||||
PyObject *error_type, *error_value, *error_traceback;
|
||||
PyErr_Fetch(&error_type, &error_value, &error_traceback);
|
||||
|
||||
PyErr_Format(error_type,
|
||||
"class %.200s, function %.200s: incompatible return value%S",
|
||||
RNA_struct_identifier(ptr->type), RNA_function_identifier(func),
|
||||
error_value);
|
||||
}
|
||||
}
|
||||
else if (ret_len > 1) {
|
||||
|
||||
@@ -6582,9 +6591,9 @@ void pyrna_free_types(void)
|
||||
PyDoc_STRVAR(pyrna_register_class_doc,
|
||||
".. method:: register_class(cls)\n"
|
||||
"\n"
|
||||
" Register a subclass of a blender type in (:class:`Panel`,\n"
|
||||
" :class:`Menu`, :class:`Header`, :class:`Operator`,\n"
|
||||
" :class:`KeyingSetInfo`, :class:`RenderEngine`).\n"
|
||||
" Register a subclass of a blender type in (:class:`bpy.types.Panel`,\n"
|
||||
" :class:`bpy.types.Menu`, :class:`bpy.types.Header`, :class:`bpy.types.Operator`,\n"
|
||||
" :class:`bpy.types.KeyingSetInfo`, :class:`bpy.types.RenderEngine`).\n"
|
||||
"\n"
|
||||
" If the class has a *register* class method it will be called\n"
|
||||
" before registration.\n"
|
||||
|
||||
@@ -30,9 +30,9 @@
|
||||
|
||||
#include "bpy_traceback.h"
|
||||
|
||||
static const char *traceback_filepath(PyTracebackObject *tb)
|
||||
static const char *traceback_filepath(PyTracebackObject *tb, PyObject **coerce)
|
||||
{
|
||||
return _PyUnicode_AsString(tb->tb_frame->f_code->co_filename);
|
||||
return PyBytes_AS_STRING((*coerce= PyUnicode_EncodeFSDefault(tb->tb_frame->f_code->co_filename)));
|
||||
}
|
||||
|
||||
/* copied from pythonrun.c, 3.2.0 */
|
||||
@@ -146,7 +146,12 @@ void python_script_error_jump(const char *filepath, int *lineno, int *offset)
|
||||
PyErr_Print();
|
||||
|
||||
for(tb= (PyTracebackObject *)PySys_GetObject("last_traceback"); tb && (PyObject *)tb != Py_None; tb= tb->tb_next) {
|
||||
if(strcmp(traceback_filepath(tb), filepath) != 0) {
|
||||
PyObject *coerce;
|
||||
const char *tb_filepath= traceback_filepath(tb, &coerce);
|
||||
const int match= strcmp(tb_filepath, filepath) != 0;
|
||||
Py_DECREF(coerce);
|
||||
|
||||
if(match) {
|
||||
*lineno= tb->tb_lineno;
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user