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);
                }
        }
 

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to