diff options
author | Campbell Barton <ideasman42@gmail.com> | 2009-05-04 12:55:54 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2009-05-04 12:55:54 +0400 |
commit | 2f7cd19ff520ff5a1a0f80a55cc5e68c802b7df5 (patch) | |
tree | d679af8428bb91e59c4cd92fd154a598618f0258 /source/gameengine | |
parent | 9248da811e7e0c1e8945d85a6520e74678d9e6c0 (diff) |
print BGE Py api warnings only once to avoid flooding the terminal and slowing the game down too much, resets on loading scenes/blendfiles and restarting the game engine.
Diffstat (limited to 'source/gameengine')
-rw-r--r-- | source/gameengine/Expressions/PyObjectPlus.cpp | 29 | ||||
-rw-r--r-- | source/gameengine/Expressions/PyObjectPlus.h | 40 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_PythonInit.cpp | 10 |
3 files changed, 74 insertions, 5 deletions
diff --git a/source/gameengine/Expressions/PyObjectPlus.cpp b/source/gameengine/Expressions/PyObjectPlus.cpp index 107b12b7159..82f67a9b007 100644 --- a/source/gameengine/Expressions/PyObjectPlus.cpp +++ b/source/gameengine/Expressions/PyObjectPlus.cpp @@ -908,15 +908,16 @@ PyObject *PyObjectPlus::NewProxy_Ext(PyObjectPlus *self, PyTypeObject *tp, bool /////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////// /* deprecation warning management */ + bool PyObjectPlus::m_ignore_deprecation_warnings(false); void PyObjectPlus::SetDeprecationWarnings(bool ignoreDeprecationWarnings) { m_ignore_deprecation_warnings = ignoreDeprecationWarnings; } -void PyObjectPlus::ShowDeprecationWarning(const char* old_way,const char* new_way) +void PyObjectPlus::ShowDeprecationWarning_func(const char* old_way,const char* new_way) { - if (!m_ignore_deprecation_warnings) { + { printf("Method %s is deprecated, please use %s instead.\n", old_way, new_way); // import sys; print '\t%s:%d' % (sys._getframe(0).f_code.co_filename, sys._getframe(0).f_lineno) @@ -955,6 +956,30 @@ void PyObjectPlus::ShowDeprecationWarning(const char* old_way,const char* new_wa } } +void PyObjectPlus::ClearDeprecationWarning() +{ + WarnLink *wlink_next; + WarnLink *wlink = GetDeprecationWarningLinkFirst(); + + while(wlink) + { + wlink->warn_done= false; /* no need to NULL the link, its cleared before adding to the list next time round */ + wlink_next= reinterpret_cast<WarnLink *>(wlink->link); + wlink->link= NULL; + wlink= wlink_next; + } + NullDeprecationWarning(); +} + +WarnLink* m_base_wlink_first= NULL; +WarnLink* m_base_wlink_last= NULL; + +WarnLink* PyObjectPlus::GetDeprecationWarningLinkFirst(void) {return m_base_wlink_first;} +WarnLink* PyObjectPlus::GetDeprecationWarningLinkLast(void) {return m_base_wlink_last;} +void PyObjectPlus::SetDeprecationWarningFirst(WarnLink* wlink) {m_base_wlink_first= wlink;} +void PyObjectPlus::SetDeprecationWarningLinkLast(WarnLink* wlink) {m_base_wlink_last= wlink;} +void PyObjectPlus::NullDeprecationWarning() {m_base_wlink_first= m_base_wlink_last= NULL;} + #endif //NO_EXP_PYTHON_EMBEDDING diff --git a/source/gameengine/Expressions/PyObjectPlus.h b/source/gameengine/Expressions/PyObjectPlus.h index f90a1436d00..449ece535c1 100644 --- a/source/gameengine/Expressions/PyObjectPlus.h +++ b/source/gameengine/Expressions/PyObjectPlus.h @@ -81,6 +81,36 @@ static inline void Py_Fatal(const char *M) { exit(-1); }; + +/* Use with ShowDeprecationWarning macro */ +typedef struct { + bool warn_done; + void *link; +} WarnLink; + +#define ShowDeprecationWarning(old_way, new_way) \ +{ \ + static WarnLink wlink = {false, NULL}; \ + if ((m_ignore_deprecation_warnings || wlink.warn_done)==0) \ + { \ + ShowDeprecationWarning_func(old_way, new_way); \ + WarnLink *wlink_last= GetDeprecationWarningLinkLast(); \ + ShowDeprecationWarning_func(old_way, new_way); \ + wlink.warn_done = true; \ + wlink.link = NULL; \ + \ + if(wlink_last) { \ + wlink_last->link= (void *)&(wlink); \ + SetDeprecationWarningLinkLast(&(wlink)); \ + } else { \ + SetDeprecationWarningFirst(&(wlink)); \ + SetDeprecationWarningLinkLast(&(wlink)); \ + } \ + } \ +} \ + + + typedef struct { PyObject_HEAD /* required python macro */ class PyObjectPlus *ref; @@ -461,13 +491,21 @@ public: static bool m_ignore_deprecation_warnings; + static WarnLink* GetDeprecationWarningLinkFirst(void); + static WarnLink* GetDeprecationWarningLinkLast(void); + static void SetDeprecationWarningFirst(WarnLink* wlink); + static void SetDeprecationWarningLinkLast(WarnLink* wlink); + static void NullDeprecationWarning(); + /** enable/disable display of deprecation warnings */ static void SetDeprecationWarnings(bool ignoreDeprecationWarnings); /** Shows a deprecation warning */ - static void ShowDeprecationWarning(const char* method,const char* prop); + static void ShowDeprecationWarning_func(const char* method,const char* prop); + static void ClearDeprecationWarning(); }; + PyObject *py_getattr_dict(PyObject *pydict, PyObject *tp_dict); #endif // _adr_py_lib_h_ diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp index 18fd990dc51..8eb8956cfe2 100644 --- a/source/gameengine/Ketsji/KX_PythonInit.cpp +++ b/source/gameengine/Ketsji/KX_PythonInit.cpp @@ -1123,8 +1123,8 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack gp_KetsjiScene = scene; gUseVisibilityTemp=false; - - + + PyObjectPlus::ClearDeprecationWarning(); /* Not that nice to call here but makes sure warnings are reset between loading scenes */ /* Use existing module where possible * be careful not to init any runtime vars after this */ @@ -1697,6 +1697,8 @@ PyObject* initGamePlayerPythonScripting(const STR_String& progname, TPythonSecur first_time = false; + PyObjectPlus::ClearDeprecationWarning(); + PyObject* moduleobj = PyImport_AddModule("__main__"); return PyModule_GetDict(moduleobj); } @@ -1710,6 +1712,7 @@ void exitGamePlayerPythonScripting() Py_Finalize(); bpy_import_main_set(NULL); + PyObjectPlus::ClearDeprecationWarning(); } @@ -1736,6 +1739,8 @@ PyObject* initGamePythonScripting(const STR_String& progname, TPythonSecurityLev /* clear user defined modules that may contain data from the last run */ clearGameModules(); + PyObjectPlus::NullDeprecationWarning(); + PyObject* moduleobj = PyImport_AddModule("__main__"); return PyModule_GetDict(moduleobj); } @@ -1781,6 +1786,7 @@ void exitGamePythonScripting() clearGameModules(); restorePySysPath(); /* get back the original sys.path and clear the backup */ bpy_import_main_set(NULL); + PyObjectPlus::ClearDeprecationWarning(); } |