[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52470] trunk/blender/source/blender/ python/intern: 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 .
Campbell Barton
ideasman42 at gmail.com
Thu Nov 22 09:45:33 CET 2012
Revision: 52470
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52470
Author: campbellbarton
Date: 2012-11-22 08:45:32 +0000 (Thu, 22 Nov 2012)
Log Message:
-----------
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.
Modified Paths:
--------------
trunk/blender/source/blender/python/intern/bpy_intern_string.c
trunk/blender/source/blender/python/intern/bpy_intern_string.h
trunk/blender/source/blender/python/intern/bpy_rna.c
Modified: trunk/blender/source/blender/python/intern/bpy_intern_string.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_intern_string.c 2012-11-22 08:30:54 UTC (rev 52469)
+++ trunk/blender/source/blender/python/intern/bpy_intern_string.c 2012-11-22 08:45:32 UTC (rev 52470)
@@ -38,6 +38,8 @@
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 @@
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 @@
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__);
}
Modified: trunk/blender/source/blender/python/intern/bpy_intern_string.h
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_intern_string.h 2012-11-22 08:30:54 UTC (rev 52469)
+++ trunk/blender/source/blender/python/intern/bpy_intern_string.h 2012-11-22 08:45:32 UTC (rev 52470)
@@ -33,3 +33,5 @@
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__;
Modified: trunk/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_rna.c 2012-11-22 08:30:54 UTC (rev 52469)
+++ trunk/blender/source/blender/python/intern/bpy_rna.c 2012-11-22 08:45:32 UTC (rev 52470)
@@ -6883,8 +6883,8 @@
/* 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,12 +6894,11 @@
} \
} \
Py_XDECREF(item); \
- } (void)0
+ } /* intendionally allow else here */
+ if BPY_REPLACEMENT_STRING("bl_idname", bpy_intern_str___name__)
+ else if BPY_REPLACEMENT_STRING("bl_description", bpy_intern_str___doc__)
- BPY_REPLACEMENT_STRING("bl_idname", "__name__");
- BPY_REPLACEMENT_STRING("bl_description", "__doc__");
-
#undef BPY_REPLACEMENT_STRING
if (item == NULL && (((flag & PROP_REGISTER_OPTIONAL) != PROP_REGISTER_OPTIONAL))) {
@@ -6912,10 +6911,11 @@
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);
}
}
More information about the Bf-blender-cvs
mailing list