Revision: 20121
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20121
Author:   campbellbarton
Date:     2009-05-09 20:18:04 +0200 (Sat, 09 May 2009)

Log Message:
-----------
Methods didn't check for zombies which could crash in the case where a method 
for an object is kept.

 func = ob.getMass
 ...remove ob...
 func() # crash

2 More refcount fixes spotted by Benoit too

Modified Paths:
--------------
    trunk/blender/source/gameengine/Expressions/PyObjectPlus.h
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp

Modified: trunk/blender/source/gameengine/Expressions/PyObjectPlus.h
===================================================================
--- trunk/blender/source/gameengine/Expressions/PyObjectPlus.h  2009-05-09 
17:24:21 UTC (rev 20120)
+++ trunk/blender/source/gameengine/Expressions/PyObjectPlus.h  2009-05-09 
18:18:04 UTC (rev 20121)
@@ -225,30 +225,35 @@
 #define KX_PYMETHOD(class_name, method_name)                   \
        PyObject* Py##method_name(PyObject* args, PyObject* kwds); \
        static PyObject* sPy##method_name( PyObject* self, PyObject* args, 
PyObject* kwds) { \
+               if(BGE_PROXY_REF(self)==NULL) { 
PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "() - " 
BGE_PROXY_ERROR_MSG); return NULL; } \
                return 
((class_name*)BGE_PROXY_REF(self))->Py##method_name(args, kwds);         \
        }; \
 
 #define KX_PYMETHOD_VARARGS(class_name, method_name)                   \
        PyObject* Py##method_name(PyObject* args); \
        static PyObject* sPy##method_name( PyObject* self, PyObject* args) { \
+               if(BGE_PROXY_REF(self)==NULL) { 
PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "() - " 
BGE_PROXY_ERROR_MSG); return NULL; } \
                return 
((class_name*)BGE_PROXY_REF(self))->Py##method_name(args);               \
        }; \
 
 #define KX_PYMETHOD_NOARGS(class_name, method_name)                    \
        PyObject* Py##method_name(); \
        static PyObject* sPy##method_name( PyObject* self) { \
+               if(BGE_PROXY_REF(self)==NULL) { 
PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "() - " 
BGE_PROXY_ERROR_MSG); return NULL; } \
                return ((class_name*)BGE_PROXY_REF(self))->Py##method_name();   
        \
        }; \
        
 #define KX_PYMETHOD_O(class_name, method_name)                 \
        PyObject* Py##method_name(PyObject* value); \
        static PyObject* sPy##method_name( PyObject* self, PyObject* value) { \
+               if(BGE_PROXY_REF(self)==NULL) { 
PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "(value) - " 
BGE_PROXY_ERROR_MSG); return NULL; } \
                return 
((class_name*)BGE_PROXY_REF(self))->Py##method_name(value);              \
        }; \
 
 #define KX_PYMETHOD_DOC(class_name, method_name)                       \
        PyObject* Py##method_name(PyObject* args, PyObject* kwds); \
        static PyObject* sPy##method_name( PyObject* self, PyObject* args, 
PyObject* kwds) { \
+               if(BGE_PROXY_REF(self)==NULL) { 
PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "(...) - " 
BGE_PROXY_ERROR_MSG); return NULL; } \
                return 
((class_name*)BGE_PROXY_REF(self))->Py##method_name(args, kwds);         \
        }; \
     static const char method_name##_doc[]; \
@@ -256,6 +261,7 @@
 #define KX_PYMETHOD_DOC_VARARGS(class_name, method_name)                       
\
        PyObject* Py##method_name(PyObject* args); \
        static PyObject* sPy##method_name( PyObject* self, PyObject* args) { \
+               if(BGE_PROXY_REF(self)==NULL) { 
PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "(...) - " 
BGE_PROXY_ERROR_MSG); return NULL; } \
                return 
((class_name*)BGE_PROXY_REF(self))->Py##method_name(args);               \
        }; \
     static const char method_name##_doc[]; \
@@ -263,6 +269,7 @@
 #define KX_PYMETHOD_DOC_O(class_name, method_name)                     \
        PyObject* Py##method_name(PyObject* value); \
        static PyObject* sPy##method_name( PyObject* self, PyObject* value) { \
+               if(BGE_PROXY_REF(self)==NULL) { 
PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "(value) - " 
BGE_PROXY_ERROR_MSG); return NULL; } \
                return 
((class_name*)BGE_PROXY_REF(self))->Py##method_name(value);              \
        }; \
     static const char method_name##_doc[]; \
@@ -270,6 +277,7 @@
 #define KX_PYMETHOD_DOC_NOARGS(class_name, method_name)                        
\
        PyObject* Py##method_name(); \
        static PyObject* sPy##method_name( PyObject* self) { \
+               if(BGE_PROXY_REF(self)==NULL) { 
PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "() - " 
BGE_PROXY_ERROR_MSG); return NULL; } \
                return ((class_name*)BGE_PROXY_REF(self))->Py##method_name();   
        \
        }; \
     static const char method_name##_doc[]; \

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp    2009-05-09 
17:24:21 UTC (rev 20120)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp    2009-05-09 
18:18:04 UTC (rev 20121)
@@ -1726,7 +1726,7 @@
        for(i=0; i < (int)self->m_meshes.size(); i++)
        {
                KX_MeshProxy* meshproxy = new KX_MeshProxy(self->m_meshes[i]);
-               PyList_SET_ITEM(meshes, i, meshproxy->GetProxy());
+               PyList_SET_ITEM(meshes, i, meshproxy->NewProxy(true));
        }
        
        return meshes;

Modified: trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp 2009-05-09 17:24:21 UTC 
(rev 20120)
+++ trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp 2009-05-09 18:18:04 UTC 
(rev 20121)
@@ -1847,5 +1847,9 @@
 
 
        SCA_IObject* replica = AddReplicaObject((SCA_IObject*)ob, other, time);
+       
+       // release here because AddReplicaObject AddRef's
+       // the object is added to the scene so we dont want python to own a 
reference
+       replica->Release();
        return replica->GetProxy();
 }
\ No newline at end of file


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

Reply via email to