Revision: 31789
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31789
Author:   campbellbarton
Date:     2010-09-06 17:54:08 +0200 (Mon, 06 Sep 2010)

Log Message:
-----------
bugfix [#23656] Problems retrieving properties from inside runtime-created 
PointerProperties

cant test if this fix solves the problem matt is having but it at least fixes 
an error caused by classes created in exec(),
when the properties pointers were copied the hash key still referred to the 
python object which could be freed. in most cases this wouldnt happen (would be 
kept in bytecode) but with exec() the property string is freed immediately. 

Modified Paths:
--------------
    trunk/blender/source/blender/makesrna/RNA_define.h
    trunk/blender/source/blender/makesrna/intern/rna_define.c
    trunk/blender/source/blender/python/intern/bpy_props.c

Modified: trunk/blender/source/blender/makesrna/RNA_define.h
===================================================================
--- trunk/blender/source/blender/makesrna/RNA_define.h  2010-09-06 13:28:57 UTC 
(rev 31788)
+++ trunk/blender/source/blender/makesrna/RNA_define.h  2010-09-06 15:54:08 UTC 
(rev 31789)
@@ -192,7 +192,7 @@
 void RNA_def_struct_free_pointers(StructRNA *srna);
 void RNA_def_func_duplicate_pointers(FunctionRNA *func);
 void RNA_def_func_free_pointers(FunctionRNA *func);
-void RNA_def_property_duplicate_pointers(PropertyRNA *prop);
+void RNA_def_property_duplicate_pointers(StructOrFunctionRNA *cont_, 
PropertyRNA *prop);
 void RNA_def_property_free_pointers(PropertyRNA *prop);
 int RNA_def_property_free_identifier(StructOrFunctionRNA *cont_, const char 
*identifier);
 

Modified: trunk/blender/source/blender/makesrna/intern/rna_define.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_define.c   2010-09-06 
13:28:57 UTC (rev 31788)
+++ trunk/blender/source/blender/makesrna/intern/rna_define.c   2010-09-06 
15:54:08 UTC (rev 31789)
@@ -2617,14 +2617,26 @@
        }
 }
 
-void RNA_def_property_duplicate_pointers(PropertyRNA *prop)
+void RNA_def_property_duplicate_pointers(StructOrFunctionRNA *cont_, 
PropertyRNA *prop)
 {
+       ContainerRNA *cont= cont_;
        EnumPropertyItem *earray;
        float *farray;
        int *iarray;
        int a;
 
-       if(prop->identifier) prop->identifier= BLI_strdup(prop->identifier);
+       /* annoying since we just added this to a hash, could make this add the 
correct key to the hash in the first place */
+       if(prop->identifier) {
+               if(cont->prophash) {
+                       BLI_ghash_remove(cont->prophash, 
(void*)prop->identifier, NULL, NULL);
+                       prop->identifier= BLI_strdup(prop->identifier);
+                       BLI_ghash_insert(cont->prophash, 
(void*)prop->identifier, prop);
+               }
+               else {
+                       prop->identifier= BLI_strdup(prop->identifier);
+               }
+       }
+
        if(prop->name) prop->name= BLI_strdup(prop->name);
        if(prop->description) prop->description= BLI_strdup(prop->description);
 

Modified: trunk/blender/source/blender/python/intern/bpy_props.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_props.c      2010-09-06 
13:28:57 UTC (rev 31788)
+++ trunk/blender/source/blender/python/intern/bpy_props.c      2010-09-06 
15:54:08 UTC (rev 31789)
@@ -160,7 +160,7 @@
                        if(opts & PROP_HIDDEN) RNA_def_property_flag(prop, 
PROP_HIDDEN);
                        if((opts & PROP_ANIMATABLE)==0) 
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
                }
-               RNA_def_property_duplicate_pointers(prop);
+               RNA_def_property_duplicate_pointers(srna, prop);
                Py_RETURN_NONE;
        }
        else { /* operators defer running this function */
@@ -236,7 +236,7 @@
                        if(opts & PROP_HIDDEN) RNA_def_property_flag(prop, 
PROP_HIDDEN);
                        if((opts & PROP_ANIMATABLE)==0) 
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
                }
-               RNA_def_property_duplicate_pointers(prop);
+               RNA_def_property_duplicate_pointers(srna, prop);
                Py_RETURN_NONE;
        }
        else { /* operators defer running this function */
@@ -302,7 +302,7 @@
                        if(opts & PROP_HIDDEN) RNA_def_property_flag(prop, 
PROP_HIDDEN);
                        if((opts & PROP_ANIMATABLE)==0) 
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
                }
-               RNA_def_property_duplicate_pointers(prop);
+               RNA_def_property_duplicate_pointers(srna, prop);
                Py_RETURN_NONE;
        }
        else { /* operators defer running this function */
@@ -379,7 +379,7 @@
                        if(opts & PROP_HIDDEN) RNA_def_property_flag(prop, 
PROP_HIDDEN);
                        if((opts & PROP_ANIMATABLE)==0) 
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
                }
-               RNA_def_property_duplicate_pointers(prop);
+               RNA_def_property_duplicate_pointers(srna, prop);
                Py_RETURN_NONE;
        }
        else { /* operators defer running this function */
@@ -456,7 +456,7 @@
                        if(opts & PROP_HIDDEN) RNA_def_property_flag(prop, 
PROP_HIDDEN);
                        if((opts & PROP_ANIMATABLE)==0) 
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
                }
-               RNA_def_property_duplicate_pointers(prop);
+               RNA_def_property_duplicate_pointers(srna, prop);
                Py_RETURN_NONE;
        }
        else { /* operators defer running this function */
@@ -533,7 +533,7 @@
                        if(opts & PROP_HIDDEN) RNA_def_property_flag(prop, 
PROP_HIDDEN);
                        if((opts & PROP_ANIMATABLE)==0) 
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
                }
-               RNA_def_property_duplicate_pointers(prop);
+               RNA_def_property_duplicate_pointers(srna, prop);
                Py_RETURN_NONE;
        }
        else { /* operators defer running this function */
@@ -598,7 +598,7 @@
                        if(opts & PROP_HIDDEN) RNA_def_property_flag(prop, 
PROP_HIDDEN);
                        if((opts & PROP_ANIMATABLE)==0) 
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
                }
-               RNA_def_property_duplicate_pointers(prop);
+               RNA_def_property_duplicate_pointers(srna, prop);
                Py_RETURN_NONE;
        }
        else { /* operators defer running this function */
@@ -704,7 +704,7 @@
                        if(opts & PROP_HIDDEN) RNA_def_property_flag(prop, 
PROP_HIDDEN);
                        if((opts & PROP_ANIMATABLE)==0) 
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
                }
-               RNA_def_property_duplicate_pointers(prop);
+               RNA_def_property_duplicate_pointers(srna, prop);
                MEM_freeN(eitems);
 
                Py_RETURN_NONE;
@@ -787,7 +787,7 @@
                        if(opts & PROP_HIDDEN) RNA_def_property_flag(prop, 
PROP_HIDDEN);
                        if((opts & PROP_ANIMATABLE)==0) 
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
                }
-               RNA_def_property_duplicate_pointers(prop);
+               RNA_def_property_duplicate_pointers(srna, prop);
                Py_RETURN_NONE;
        }
        else { /* operators defer running this function */
@@ -847,7 +847,7 @@
                        if(opts & PROP_HIDDEN) RNA_def_property_flag(prop, 
PROP_HIDDEN);
                        if((opts & PROP_ANIMATABLE)==0) 
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
                }
-               RNA_def_property_duplicate_pointers(prop);
+               RNA_def_property_duplicate_pointers(srna, prop);
                Py_RETURN_NONE;
        }
        else { /* operators defer running this function */


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to