[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