Can't it unregister them the same way the rest (UI elements, operators, ...) is unregistered?
Not to belabor my point, but registering with the metaclass like my patch does simplifies that problems a lot. Even if you want to do it manually, you can still use the list built by the metaclass to check if some types are not unregistered properly. Martin --- On Wed, 2/17/10, Campbell Barton <[email protected]> wrote: > From: Campbell Barton <[email protected]> > Subject: [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26999] > trunk/blender/source/blender/ python/intern/bpy_props.c: mostly fixed > [#21172] Reloading scripts leaks memory (F8) > To: [email protected] > Received: Wednesday, February 17, 2010, 4:58 PM > Revision: 26999 > > http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26999 > Author: campbellbarton > Date: 2010-02-17 22:58:08 +0100 > (Wed, 17 Feb 2010) > > Log Message: > ----------- > mostly fixed [#21172] Reloading scripts leaks memory (F8) > the same properties were being registered many times with > built in structs. > > blender memory at least is not leaking, but it seems python > is still not freeing some memory. > > For the moment dont allow existing properties to be > registered again, will need to have a way to unregister rna > properties. > > Modified Paths: > -------------- > > trunk/blender/source/blender/python/intern/bpy_props.c > > Modified: > trunk/blender/source/blender/python/intern/bpy_props.c > =================================================================== > --- > trunk/blender/source/blender/python/intern/bpy_props.c > 2010-02-17 19:50:42 UTC (rev 26998) > +++ > trunk/blender/source/blender/python/intern/bpy_props.c > 2010-02-17 21:58:08 UTC (rev 26999) > @@ -87,6 +87,14 @@ > return ret; > } > > +static int bpy_struct_id_used(StructRNA *srna, char > *identifier) > +{ > + PointerRNA ptr; > + RNA_pointer_create(NULL, srna, NULL, > &ptr); > + return > (RNA_struct_find_property(&ptr, identifier) != NULL); > +} > + > + > /* Function that sets RNA, NOTE - self is NULL when called > from python, but being abused from C so we can pass the srna > allong > * This isnt incorrect since its a python object - > but be careful */ > static char BPy_BoolProperty_doc[] = > @@ -125,11 +133,17 @@ > if > (!PyArg_ParseTupleAndKeywords(args, kw, > "s|ssiO!s:BoolProperty", (char **)kwlist, &id, > &name, &description, &def, &PySet_Type, > &pyopts, &pysubtype)) > > return NULL; > > + > if(bpy_struct_id_used(srna, id)) { > + > // PyErr_Format(PyExc_TypeError, "BoolProperty(): '%s' > already defined.", id); > + > // return NULL; > + > Py_RETURN_NONE; > + } > + > if(pyopts && > pyrna_set_to_enum_bitfield(property_flag_items, pyopts, > &opts, "BoolProperty(options={...}):")) > > return NULL; > > if(pysubtype > && > RNA_enum_value_from_id(property_subtype_number_items, > pysubtype, &subtype)==0) { > - > PyErr_Format(PyExc_TypeError, "BoolProperty(subtype='%s'): > invalid subtype."); > + > PyErr_Format(PyExc_TypeError, "BoolProperty(subtype='%s'): > invalid subtype.", pysubtype); > > return NULL; > } > > @@ -187,11 +201,17 @@ > if > (!PyArg_ParseTupleAndKeywords(args, kw, > "s|ssOO!si:BoolVectorProperty", (char **)kwlist, &id, > &name, &description, &pydef, &PySet_Type, > &pyopts, &pysubtype, &size)) > > return NULL; > > + > if(bpy_struct_id_used(srna, id)) { > + > // PyErr_Format(PyExc_TypeError, "BoolVectorProperty(): '%s' > already defined.", id); > + > // return NULL; > + > Py_RETURN_NONE; > + } > + > if(pyopts && > pyrna_set_to_enum_bitfield(property_flag_items, pyopts, > &opts, "BoolVectorProperty(options={...}):")) > > return NULL; > > if(pysubtype > && > RNA_enum_value_from_id(property_subtype_array_items, > pysubtype, &subtype)==0) { > - > PyErr_Format(PyExc_TypeError, > "BoolVectorProperty(subtype='%s'): invalid subtype."); > + > PyErr_Format(PyExc_TypeError, > "BoolVectorProperty(subtype='%s'): invalid subtype.", > pysubtype); > > return NULL; > } > > @@ -256,11 +276,17 @@ > if > (!PyArg_ParseTupleAndKeywords(args, kw, > "s|ssiiiiiiO!s:IntProperty", (char **)kwlist, &id, > &name, &description, &def, &min, &max, > &soft_min, &soft_max, &step, &PySet_Type, > &pyopts, &pysubtype)) > > return NULL; > > + > if(bpy_struct_id_used(srna, id)) { > + > // PyErr_Format(PyExc_TypeError, "IntProperty(): '%s' > already defined.", id); > + > // return NULL; > + > Py_RETURN_NONE; > + } > + > if(pyopts && > pyrna_set_to_enum_bitfield(property_flag_items, pyopts, > &opts, "IntProperty(options={...}):")) > > return NULL; > > if(pysubtype > && > RNA_enum_value_from_id(property_subtype_number_items, > pysubtype, &subtype)==0) { > - > PyErr_Format(PyExc_TypeError, "IntProperty(subtype='%s'): > invalid subtype."); > + > PyErr_Format(PyExc_TypeError, "IntProperty(subtype='%s'): > invalid subtype.", pysubtype); > > return NULL; > } > > @@ -319,11 +345,17 @@ > if > (!PyArg_ParseTupleAndKeywords(args, kw, > "s|ssOiiiiO!si:IntVectorProperty", (char **)kwlist, &id, > &name, &description, &pydef, &min, &max, > &soft_min, &soft_max, &PySet_Type, &pyopts, > &pysubtype, &size)) > > return NULL; > > + > if(bpy_struct_id_used(srna, id)) { > + > // PyErr_Format(PyExc_TypeError, "IntVectorProperty(): '%s' > already defined.", id); > + > // return NULL; > + > Py_RETURN_NONE; > + } > + > if(pyopts && > pyrna_set_to_enum_bitfield(property_flag_items, pyopts, > &opts, "IntVectorProperty(options={...}):")) > > return NULL; > > if(pysubtype > && > RNA_enum_value_from_id(property_subtype_array_items, > pysubtype, &subtype)==0) { > - > PyErr_Format(PyExc_TypeError, > "IntVectorProperty(subtype='%s'): invalid subtype."); > + > PyErr_Format(PyExc_TypeError, > "IntVectorProperty(subtype='%s'): invalid subtype.", > pysubtype); > > return NULL; > } > > @@ -395,11 +427,17 @@ > if > (!PyArg_ParseTupleAndKeywords(args, kw, > "s|ssffffffiO!ss:FloatProperty", (char **)kwlist, &id, > &name, &description, &def, &min, &max, > &soft_min, &soft_max, &step, &precision, > &PySet_Type, &pyopts, &pysubtype, &pyunit)) > > return NULL; > > + > if(bpy_struct_id_used(srna, id)) { > + > // PyErr_Format(PyExc_TypeError, "FloatProperty(): '%s' > already defined.", id); > + > // return NULL; > + > Py_RETURN_NONE; > + } > + > if(pyopts && > pyrna_set_to_enum_bitfield(property_flag_items, pyopts, > &opts, "FloatProperty(options={...}):")) > > return NULL; > > if(pysubtype > && > RNA_enum_value_from_id(property_subtype_number_items, > pysubtype, &subtype)==0) { > - > PyErr_Format(PyExc_TypeError, "FloatProperty(subtype='%s'): > invalid subtype."); > + > PyErr_Format(PyExc_TypeError, "FloatProperty(subtype='%s'): > invalid subtype.", pysubtype); > > return NULL; > } > > @@ -463,11 +501,17 @@ > if > (!PyArg_ParseTupleAndKeywords(args, kw, > "s|ssOfffffiO!si:FloatVectorProperty", (char **)kwlist, > &id, &name, &description, &pydef, &min, > &max, &soft_min, &soft_max, &step, > &precision, &PySet_Type, &pyopts, > &pysubtype, &size)) > > return NULL; > > + > if(bpy_struct_id_used(srna, id)) { > + > // PyErr_Format(PyExc_TypeError, "FloatVectorProperty(): > '%s' already defined.", id); > + > // return NULL; > + > Py_RETURN_NONE; > + } > + > if(pyopts && > pyrna_set_to_enum_bitfield(property_flag_items, pyopts, > &opts, "FloatVectorProperty(options={...}):")) > > return NULL; > > if(pysubtype > && > RNA_enum_value_from_id(property_subtype_array_items, > pysubtype, &subtype)==0) { > - > PyErr_Format(PyExc_TypeError, > "FloatVectorProperty(subtype='%s'): invalid subtype."); > + > PyErr_Format(PyExc_TypeError, > "FloatVectorProperty(subtype='%s'): invalid subtype.", > pysubtype); > > return NULL; > } > > @@ -533,11 +577,17 @@ > if > (!PyArg_ParseTupleAndKeywords(args, kw, > "s|sssiO!s:StringProperty", (char **)kwlist, &id, > &name, &description, &def, &maxlen, > &PySet_Type, &pyopts, &pysubtype)) > > return NULL; > > + > if(bpy_struct_id_used(srna, id)) { > + > // PyErr_Format(PyExc_TypeError, "StringProperty(): '%s' > already defined.", id); > + > // return NULL; > + > Py_RETURN_NONE; > + } > + > if(pyopts && > pyrna_set_to_enum_bitfield(property_flag_items, pyopts, > &opts, "StringProperty(options={...}):")) > > return NULL; > > if(pysubtype > && > RNA_enum_value_from_id(property_subtype_string_items, > pysubtype, &subtype)==0) { > - > PyErr_Format(PyExc_TypeError, "StringProperty(subtype='%s'): > invalid subtype."); > + > PyErr_Format(PyExc_TypeError, "StringProperty(subtype='%s'): > invalid subtype.", pysubtype); > > return NULL; > } > > @@ -639,6 +689,12 @@ > if > (!PyArg_ParseTupleAndKeywords(args, kw, > "sO|sssO!:EnumProperty", (char **)kwlist, &id, > &items, &name, &description, &def, > &PySet_Type, &pyopts)) > > return NULL; > > + > if(bpy_struct_id_used(srna, id)) { > + > // PyErr_Format(PyExc_TypeError, "EnumProperty(): '%s' > already defined.", id); > + > // return NULL; > + > Py_RETURN_NONE; > + } > + > if(pyopts && > pyrna_set_to_enum_bitfield(property_flag_items, pyopts, > &opts, "EnumProperty(options={...}):")) > > return NULL; > > @@ -713,6 +769,12 @@ > if > (!PyArg_ParseTupleAndKeywords(args, kw, > "sO|ssO!:PointerProperty", (char **)kwlist, &id, > &type, &name, &description, &PySet_Type, > &pyopts)) > > return NULL; > > + > if(bpy_struct_id_used(srna, id)) { > + > // PyErr_Format(PyExc_TypeError, "PointerProperty(): '%s' > already defined.", id); > + > // return NULL; > + > Py_RETURN_NONE; > + } > + > if(pyopts && > pyrna_set_to_enum_bitfield(property_flag_items, pyopts, > &opts, "PointerProperty(options={...}):")) > > return NULL; > > @@ -768,6 +830,12 @@ > if > (!PyArg_ParseTupleAndKeywords(args, kw, > "sO|ssO!:CollectionProperty", (char **)kwlist, &id, > &type, &name, &description, &PySet_Type, > &pyopts)) > > return NULL; > > + > if(bpy_struct_id_used(srna, id)) { > + > // PyErr_Format(PyExc_TypeError, "CollectionProperty(): '%s' > already defined.", id); > + > // return NULL; > + > Py_RETURN_NONE; > + } > + > if(pyopts && > pyrna_set_to_enum_bitfield(property_flag_items, pyopts, > &opts, "CollectionProperty(options={...}):")) > > return NULL; > > > > _______________________________________________ > Bf-blender-cvs mailing list > [email protected] > http://lists.blender.org/mailman/listinfo/bf-blender-cvs > __________________________________________________________________ Yahoo! Canada Toolbar: Search from anywhere on the web, and bookmark your favourite sites. Download it now http://ca.toolbar.yahoo.com. _______________________________________________ Bf-committers mailing list [email protected] http://lists.blender.org/mailman/listinfo/bf-committers
