bugfix [#23656] Problems retrieving properties from inside runtime-created PointerPro...
authorCampbell Barton <ideasman42@gmail.com>
Mon, 6 Sep 2010 15:54:08 +0000 (15:54 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 6 Sep 2010 15:54:08 +0000 (15:54 +0000)
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.

source/blender/makesrna/RNA_define.h
source/blender/makesrna/intern/rna_define.c
source/blender/python/intern/bpy_props.c

index 6422950b5e41814ba850374a7780468723b44abf..16ca718e335eefaa3ca74ca6df47486dde2a292c 100644 (file)
@@ -192,7 +192,7 @@ void RNA_def_struct_duplicate_pointers(StructRNA *srna);
 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);
 
index 750b1eef2a923cf26fcc52a3eaf4b511495f18c5..1fed1663952b9edb61b104d941c7ef4133737299 100644 (file)
@@ -2617,14 +2617,26 @@ 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)
 {
+       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);
 
index 9ae7507a72a066909e39ae1c149c9b4aec6eb089..129668190157ca9850a42668b360cdbfeb152b54 100644 (file)
@@ -160,7 +160,7 @@ PyObject *BPy_BoolProperty(PyObject *self, PyObject *args, PyObject *kw)
                        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 @@ PyObject *BPy_BoolVectorProperty(PyObject *self, PyObject *args, PyObject *kw)
                        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 @@ PyObject *BPy_IntProperty(PyObject *self, PyObject *args, PyObject *kw)
                        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 @@ PyObject *BPy_IntVectorProperty(PyObject *self, PyObject *args, PyObject *kw)
                        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 @@ PyObject *BPy_FloatProperty(PyObject *self, PyObject *args, PyObject *kw)
                        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 @@ PyObject *BPy_FloatVectorProperty(PyObject *self, PyObject *args, PyObject *kw)
                        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 @@ PyObject *BPy_StringProperty(PyObject *self, PyObject *args, PyObject *kw)
                        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 @@ PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw)
                        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 @@ PyObject *BPy_PointerProperty(PyObject *self, PyObject *args, PyObject *kw)
                        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 @@ PyObject *BPy_CollectionProperty(PyObject *self, PyObject *args, PyObject *kw)
                        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 */