forked from bartvdbraak/blender
avoid string -> unicode conversion when registering classes, also avoid unlikely but possible crash if the py-class returns new instances of PyObjects it doesnt own when registering the class.
This commit is contained in:
parent
762016c746
commit
93ad97c131
@ -38,6 +38,8 @@ 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___name__;
|
||||
PyObject *bpy_intern_str___doc__;
|
||||
|
||||
void bpy_intern_string_init(void)
|
||||
{
|
||||
@ -47,6 +49,8 @@ void bpy_intern_string_init(void)
|
||||
bpy_intern_str_order = PyUnicode_FromString("order");
|
||||
bpy_intern_str_attr = PyUnicode_FromString("attr");
|
||||
bpy_intern_str___slots__ = PyUnicode_FromString("__slots__");
|
||||
bpy_intern_str___name__ = PyUnicode_FromString("__name__");
|
||||
bpy_intern_str___doc__ = PyUnicode_FromString("__doc__");
|
||||
}
|
||||
|
||||
void bpy_intern_string_exit(void)
|
||||
@ -57,4 +61,6 @@ void bpy_intern_string_exit(void)
|
||||
Py_DECREF(bpy_intern_str_order);
|
||||
Py_DECREF(bpy_intern_str_attr);
|
||||
Py_DECREF(bpy_intern_str___slots__);
|
||||
Py_DECREF(bpy_intern_str___name__);
|
||||
Py_DECREF(bpy_intern_str___doc__);
|
||||
}
|
||||
|
@ -33,3 +33,5 @@ extern PyObject *bpy_intern_str_bl_rna;
|
||||
extern PyObject *bpy_intern_str_order;
|
||||
extern PyObject *bpy_intern_str_attr;
|
||||
extern PyObject *bpy_intern_str___slots__;
|
||||
extern PyObject *bpy_intern_str___name__;
|
||||
extern PyObject *bpy_intern_str___doc__;
|
||||
|
@ -6883,8 +6883,8 @@ static int bpy_class_validate_recursive(PointerRNA *dummyptr, StructRNA *srna, v
|
||||
/* Sneaky workaround to use the class name as the bl_idname */
|
||||
|
||||
#define BPY_REPLACEMENT_STRING(rna_attr, py_attr) \
|
||||
if (strcmp(identifier, rna_attr) == 0) { \
|
||||
item = PyObject_GetAttrString(py_class, py_attr); \
|
||||
(strcmp(identifier, rna_attr) == 0) { \
|
||||
item = PyObject_GetAttr(py_class, py_attr); \
|
||||
if (item && item != Py_None) { \
|
||||
if (pyrna_py_to_prop(dummyptr, prop, NULL, \
|
||||
item, "validating class:") != 0) \
|
||||
@ -6894,11 +6894,10 @@ static int bpy_class_validate_recursive(PointerRNA *dummyptr, StructRNA *srna, v
|
||||
} \
|
||||
} \
|
||||
Py_XDECREF(item); \
|
||||
} (void)0
|
||||
} /* intendionally allow else here */
|
||||
|
||||
|
||||
BPY_REPLACEMENT_STRING("bl_idname", "__name__");
|
||||
BPY_REPLACEMENT_STRING("bl_description", "__doc__");
|
||||
if BPY_REPLACEMENT_STRING("bl_idname", bpy_intern_str___name__)
|
||||
else if BPY_REPLACEMENT_STRING("bl_description", bpy_intern_str___doc__)
|
||||
|
||||
#undef BPY_REPLACEMENT_STRING
|
||||
|
||||
@ -6912,10 +6911,11 @@ static int bpy_class_validate_recursive(PointerRNA *dummyptr, StructRNA *srna, v
|
||||
PyErr_Clear();
|
||||
}
|
||||
else {
|
||||
Py_DECREF(item); /* no need to keep a ref, the class owns it */
|
||||
|
||||
if (pyrna_py_to_prop(dummyptr, prop, NULL, item, "validating class:") != 0)
|
||||
if (pyrna_py_to_prop(dummyptr, prop, NULL, item, "validating class:") != 0) {
|
||||
Py_DECREF(item);
|
||||
return -1;
|
||||
}
|
||||
Py_DECREF(item);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user