Revision: 30644
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30644
Author:   campbellbarton
Date:     2010-07-23 03:43:30 +0200 (Fri, 23 Jul 2010)

Log Message:
-----------
[#22488] Reloading scripts causes crash
F8 key enabled again, useful for script UI development.

- keying set freeing wasnt freeing from all scenes and the builtin list.
- PointerProperty() cant refer to a removed python srna type (fixed in rigify 
and netrender).
- Added a check for freeing a type used by a PointerProperty but its very slow, 
makes reloading take ~10sec. Only enabled this in debug mode for now.

Netrender register() function isnt re-registering the property, probably 
because the module is cached by python and not re-run.

Modified Paths:
--------------
    trunk/blender/release/scripts/io/netrender/__init__.py
    trunk/blender/release/scripts/ui/properties_data_armature_rigify.py
    trunk/blender/source/blender/editors/animation/keyingsets.c
    trunk/blender/source/blender/editors/space_script/script_edit.c
    trunk/blender/source/blender/python/generic/mathutils.h
    trunk/blender/source/blender/python/intern/bpy_rna.c
    trunk/blender/source/blender/python/intern/bpy_rna.h

Modified: trunk/blender/release/scripts/io/netrender/__init__.py
===================================================================
--- trunk/blender/release/scripts/io/netrender/__init__.py      2010-07-22 
23:06:09 UTC (rev 30643)
+++ trunk/blender/release/scripts/io/netrender/__init__.py      2010-07-23 
01:43:30 UTC (rev 30644)
@@ -42,6 +42,9 @@
 
 def unregister():
     import bpy
+
+    bpy.types.Scene.RemoveProperty("network_render")
+
     bpy.types.unregister(ui.NetRenderJob)
     bpy.types.unregister(ui.NetRenderSettings)
     bpy.types.unregister(ui.NetRenderSlave)

Modified: trunk/blender/release/scripts/ui/properties_data_armature_rigify.py
===================================================================
--- trunk/blender/release/scripts/ui/properties_data_armature_rigify.py 
2010-07-22 23:06:09 UTC (rev 30643)
+++ trunk/blender/release/scripts/ui/properties_data_armature_rigify.py 
2010-07-23 01:43:30 UTC (rev 30644)
@@ -360,6 +360,7 @@
 
 
 def unregister():
+    bpy.types.Scene.RemoveProperty("pose_templates")
     unregister = bpy.types.unregister
     for cls in classes:
         unregister(cls)

Modified: trunk/blender/source/blender/editors/animation/keyingsets.c
===================================================================
--- trunk/blender/source/blender/editors/animation/keyingsets.c 2010-07-22 
23:06:09 UTC (rev 30643)
+++ trunk/blender/source/blender/editors/animation/keyingsets.c 2010-07-23 
01:43:30 UTC (rev 30644)
@@ -43,6 +43,7 @@
 #include "DNA_constraint_types.h"
 #include "DNA_scene_types.h"
 
+#include "BKE_main.h"
 #include "BKE_animsys.h"
 #include "BKE_action.h"
 #include "BKE_context.h"
@@ -589,7 +590,7 @@
 /* Remove the given KeyingSetInfo from the list of type infos, and also remove 
the builtin set if appropriate */
 void ANIM_keyingset_info_unregister (const bContext *C, KeyingSetInfo *ksi)
 {
-       Scene *scene = CTX_data_scene(C);
+       Main *bmain= CTX_data_main(C);
        KeyingSet *ks, *ksn;
        
        /* find relevant builtin KeyingSets which use this, and remove them */
@@ -600,8 +601,14 @@
                
                /* remove if matching typeinfo name */
                if (strcmp(ks->typeinfo, ksi->idname) == 0) {
+                       Scene *scene;
                        BKE_keyingset_free(ks);
-                       BLI_freelinkN(&scene->keyingsets, ks);
+                       BLI_remlink(&builtin_keyingsets, ks);
+
+                       for(scene= bmain->scene.first; scene; scene= 
scene->id.next)
+                               BLI_remlink_safe(&scene->keyingsets, ks);
+
+                       MEM_freeN(ks);
                }
        }
        

Modified: trunk/blender/source/blender/editors/space_script/script_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_script/script_edit.c     
2010-07-22 23:06:09 UTC (rev 30643)
+++ trunk/blender/source/blender/editors/space_script/script_edit.c     
2010-07-23 01:43:30 UTC (rev 30644)
@@ -90,13 +90,9 @@
 #ifndef DISABLE_PYTHON
        /* TODO, this crashes on netrender and keying sets, need to look into 
why
         * disable for now unless running in debug mode */
-       if(G.f & G_DEBUG) {
-               BPY_eval_string(C, 
"__import__('bpy').utils.load_scripts(reload_scripts=True)");
-       }
-       else {
-               BKE_reportf(op->reports, RPT_ERROR, "reloading is currently 
unstable, only operates in debug mode.\n");
-               return OPERATOR_CANCELLED;
-       }
+       WM_cursor_wait(1);
+       BPY_eval_string(C, 
"__import__('bpy').utils.load_scripts(reload_scripts=True)");
+       WM_cursor_wait(0);
        return OPERATOR_FINISHED;
 #endif
        return OPERATOR_CANCELLED;

Modified: trunk/blender/source/blender/python/generic/mathutils.h
===================================================================
--- trunk/blender/source/blender/python/generic/mathutils.h     2010-07-22 
23:06:09 UTC (rev 30643)
+++ trunk/blender/source/blender/python/generic/mathutils.h     2010-07-23 
01:43:30 UTC (rev 30644)
@@ -74,19 +74,6 @@
 #define Py_NEW  1
 #define Py_WRAP 2
 
-
-/* Mathutils is used by the BGE and Blender so have to define 
- * some things here for luddite mac users of py2.3 */
-#ifndef Py_RETURN_NONE
-#define Py_RETURN_NONE  return Py_INCREF(Py_None), Py_None
-#endif
-#ifndef Py_RETURN_FALSE
-#define Py_RETURN_FALSE  return Py_INCREF(Py_False), Py_False
-#endif
-#ifndef Py_RETURN_TRUE
-#define Py_RETURN_TRUE  return Py_INCREF(Py_True), Py_True
-#endif
-
 typedef struct Mathutils_Callback Mathutils_Callback;
 
 typedef int (*BaseMathCheckFunc)(BaseMathObject *);                            
                        /* checks the user is still valid */

Modified: trunk/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_rna.c        2010-07-22 
23:06:09 UTC (rev 30643)
+++ trunk/blender/source/blender/python/intern/bpy_rna.c        2010-07-23 
01:43:30 UTC (rev 30644)
@@ -4163,6 +4163,9 @@
 }
 
 static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self);
+static PyObject *pyrna_basetype_register(PyObject *self, PyObject *py_class);
+static PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *py_class);
+
 static struct PyMethodDef pyrna_basetype_methods[] = {
        {"__dir__", (PyCFunction)pyrna_basetype_dir, METH_NOARGS, ""},
        {"register", (PyCFunction)pyrna_basetype_register, METH_O, ""},
@@ -4760,7 +4763,7 @@
  * - Should still be fixed - Campbell
  * */
 
-PyObject *pyrna_basetype_register(PyObject *self, PyObject *py_class)
+static PyObject *pyrna_basetype_register(PyObject *self, PyObject *py_class)
 {
        bContext *C= NULL;
        ReportList reports;
@@ -4836,14 +4839,41 @@
        Py_RETURN_NONE;
 }
 
-PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *py_class)
+
+static int pyrna_srna_contains_pointer_prop_srna(StructRNA *srna_props, 
StructRNA *srna, const char **prop_identifier)
 {
+       PointerRNA tptr;
+       PropertyRNA *iterprop;
+       RNA_pointer_create(NULL, &RNA_Struct, srna_props, &tptr);
+       
+       iterprop= RNA_struct_find_property(&tptr, "properties");
+
+       RNA_PROP_BEGIN(&tptr, itemptr, iterprop) {
+               PropertyRNA *prop= itemptr.data;
+               if(RNA_property_type(prop) == PROP_POINTER) {
+                       if (strcmp(RNA_property_identifier(prop), "rna_type") 
== 0) {
+                               /* pass */
+                       }
+                       else if(RNA_property_pointer_type(&tptr, prop) == srna) 
{
+                               *prop_identifier= RNA_property_identifier(prop);
+                               return 1;
+                       }
+               }
+       }
+       RNA_PROP_END;
+       
+       return 0;
+}
+
+static PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *py_class)
+{
        bContext *C= NULL;
        StructUnregisterFunc unreg;
        StructRNA *srna;
 
        /*if(PyDict_GetItemString(((PyTypeObject*)py_class)->tp_dict, 
"bl_rna")==NULL) {
-               PyErr_SetString(PyExc_ValueError, "bpy.types.unregister(): not 
a registered as a subclass.");
+               PWM_cursor_wait(0);
+yErr_SetString(PyExc_ValueError, "bpy.types.unregister(): not a registered as 
a subclass.");
                return NULL;
        }*/
 
@@ -4859,6 +4889,34 @@
                return NULL;
        }
        
+       /* should happen all the time but very slow */
+       if(G.f & G_DEBUG) {
+               /* remove all properties using this class */
+               StructRNA *srna_iter;
+               PointerRNA ptr_rna;
+               PropertyRNA *prop_rna;
+               const char *prop_identifier= NULL;
+
+               RNA_blender_rna_pointer_create(&ptr_rna);
+               prop_rna = RNA_struct_find_property(&ptr_rna, "structs");
+               
+               
+               
+               /* loop over all structs */
+               RNA_PROP_BEGIN(&ptr_rna, itemptr, prop_rna) {
+                       srna_iter = itemptr.data;
+                       if(pyrna_srna_contains_pointer_prop_srna(srna_iter, 
srna, &prop_identifier)) {
+                               break;
+                       }
+               }
+               RNA_PROP_END;
+               
+               if(prop_identifier) {
+                       PyErr_Format(PyExc_SystemError, 
"bpy.types.unregister(...): Cant unregister %s because %s.%s pointer property 
is using this.", RNA_struct_identifier(srna), RNA_struct_identifier(srna_iter), 
prop_identifier);
+                       return NULL;
+               }               
+       }
+       
        /* get the context, so register callback can do necessary refreshes */
        C= BPy_GetContext();
 

Modified: trunk/blender/source/blender/python/intern/bpy_rna.h
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_rna.h        2010-07-22 
23:06:09 UTC (rev 30643)
+++ trunk/blender/source/blender/python/intern/bpy_rna.h        2010-07-23 
01:43:30 UTC (rev 30644)
@@ -86,10 +86,6 @@
 
 int pyrna_enum_value_from_id(EnumPropertyItem *item, const char *identifier, 
int *value, const char *error_prefix);
 
-/* function for registering types */
-PyObject *pyrna_basetype_register(PyObject *self, PyObject *args);
-PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *args);
-
 int pyrna_deferred_register_props(struct StructRNA *srna, PyObject 
*class_dict);
 
 /* called before stopping python */


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

Reply via email to