From bb62fa7a4e4897d508b7658825e5f3dafb7a9144 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Fri, 21 Dec 2018 22:58:57 -0500 Subject: [PATCH] Implement Korlib API versioning A common error when developing with Korman and Korlib is to forget to recompile _korlib on changes in the upstream C++ code. This will prevent the errors from being catastrophic and will revert the user to the python reference implementation with a minimum of fuss. --- korlib/module.cpp | 6 ++++++ korman/korlib/__init__.py | 21 +++++++++++++++------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/korlib/module.cpp b/korlib/module.cpp index 4d6a6d8..d183b21 100644 --- a/korlib/module.cpp +++ b/korlib/module.cpp @@ -18,6 +18,9 @@ #include "sound.h" #include "texture.h" +// This konstant is compared against that in the Python module to prevent sneaky errors... +#define KORLIB_API_VERSION 1 + extern "C" { static PyMethodDef korlib_Methods[] = { @@ -46,6 +49,9 @@ PyMODINIT_FUNC PyInit__korlib() { // Module classes... PyModule_AddObject(module, "GLTexture", Init_pyGLTexture_Type()); + // Konstants + PyModule_AddIntConstant(module, "_KORLIB_API_VERSION", KORLIB_API_VERSION); + return module; } diff --git a/korman/korlib/__init__.py b/korman/korlib/__init__.py index a30d6e3..89006c0 100644 --- a/korman/korlib/__init__.py +++ b/korman/korlib/__init__.py @@ -13,11 +13,22 @@ # You should have received a copy of the GNU General Public License # along with Korman. If not, see . +_KORLIB_API_VERSION = 1 + try: - from _korlib import * -except ImportError: + from _korlib import _KORLIB_API_VERSION as _C_API_VERSION + if _KORLIB_API_VERSION != _C_API_VERSION: + raise ImportError() + +except ImportError as ex: from .texture import * + if "_C_API_VERSION" in locals(): + msg = "Korlib C Module Version mismatch (expected {}, got {}).".format(_KORLIB_API_VERSION, _C_API_VERSION) + else: + msg = "Korlib C Module did not load correctly." + print(msg, "Using PyKorlib :(", sep=' ') + def create_bump_LUT(mipmap): kLUTHeight = 16 kLUTWidth = 16 @@ -57,11 +68,9 @@ except ImportError: def inspect_voribsfile(stream, header): raise NotImplementedError("Ogg Vorbis not supported unless _korlib is compiled") - def is_c_library(): - return False else: - def is_c_library(): - return True + from _korlib import * + finally: from .console import ConsoleToggler from .texture import TEX_DETAIL_ALPHA, TEX_DETAIL_ADD, TEX_DETAIL_MULTIPLY