Py/RNA API: WITH_PYTHON_SAFETY
authorCampbell Barton <ideasman42@gmail.com>
Thu, 3 Mar 2011 12:00:35 +0000 (12:00 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 3 Mar 2011 12:00:35 +0000 (12:00 +0000)
compile time option which enables extra safety checks.
since this is noticeably slower I rather not enable by default yet.

CMakeLists.txt
build_files/scons/tools/btools.py
source/blender/python/SConscript
source/blender/python/intern/CMakeLists.txt
source/blender/python/intern/bpy_rna.h

index 53d96c9fdcd40516536844bb9f3bf8b67e0b86ad..0e8870fe977ee375ba317d603df3701bb2f4f8ea 100644 (file)
@@ -69,6 +69,7 @@ get_blender_version()
 # Blender internal features
 option(WITH_INTERNATIONAL "Enable I18N   (International fonts and text)" ON)
 option(WITH_PYTHON        "Enable Embedded Python API" ON)
+option(WITH_PYTHON_SAFETY "Enable internal API error checking to track invalid data to prevent crash on access (at the expense of some effeciency)." OFF)
 option(WITH_PYTHON_MODULE "Enable building as a python module (experemental)" OFF)
 option(WITH_BUILDINFO     "Include extra build details" ON)
 option(WITH_IK_ITASC      "Enable ITASC IK solver" ON)
index b1b2494d522ba1955aa613337d9c407ed554c024..d589079a0d414e4cfe330190260bde2580cbc9e1 100644 (file)
@@ -72,7 +72,7 @@ def print_arguments(args, bc):
 
 def validate_arguments(args, bc):
     opts_list = [
-            'WITH_BF_PYTHON', 'BF_PYTHON', 'BF_PYTHON_VERSION', 'BF_PYTHON_INC', 'BF_PYTHON_BINARY', 'BF_PYTHON_LIB', 'BF_PYTHON_LIBPATH', 'WITH_BF_STATICPYTHON', 'BF_PYTHON_LIB_STATIC', 'BF_PYTHON_DLL',
+            'WITH_BF_PYTHON', 'WITH_BF_PYTHON_SAFETY', 'BF_PYTHON', 'BF_PYTHON_VERSION', 'BF_PYTHON_INC', 'BF_PYTHON_BINARY', 'BF_PYTHON_LIB', 'BF_PYTHON_LIBPATH', 'WITH_BF_STATICPYTHON', 'BF_PYTHON_LIB_STATIC', 'BF_PYTHON_DLL',
             'WITH_BF_OPENAL', 'BF_OPENAL', 'BF_OPENAL_INC', 'BF_OPENAL_LIB', 'BF_OPENAL_LIBPATH', 'WITH_BF_STATICOPENAL', 'BF_OPENAL_LIB_STATIC',
             'WITH_BF_SDL', 'BF_SDL', 'BF_SDL_INC', 'BF_SDL_LIB', 'BF_SDL_LIBPATH',
             'BF_LIBSAMPLERATE', 'BF_LIBSAMPLERATE_INC', 'BF_LIBSAMPLERATE_LIB', 'BF_LIBSAMPLERATE_LIBPATH', 'WITH_BF_STATICLIBSAMPLERATE', 'BF_LIBSAMPLERATE_LIB_STATIC',
@@ -211,6 +211,7 @@ def read_opts(env, cfg, args):
     localopts.AddVariables(
         ('LCGDIR', 'location of cvs lib dir'),
         (BoolVariable('WITH_BF_PYTHON', 'Compile with python', True)),
+        (BoolVariable('WITH_BF_PYTHON_SAFETY', 'Internal API error checking to track invalid data to prevent crash on access (at the expense of some effeciency)', False)),
         ('BF_PYTHON', 'base path for python', ''),
         ('BF_PYTHON_VERSION', 'Python version to use', ''),
         ('BF_PYTHON_INC', 'include path for Python headers', ''),
index 315fc5ca9a359e30eaf1b0c8d4a600ae499a8144..30cd5a842caea76ab7d77f0b5c8e41f11c8aec60 100644 (file)
@@ -1,24 +1,37 @@
 #!/usr/bin/python
-Import ('env')
 
-sources = env.Glob('intern/*.c')
+# TODO, split into 2 files.
+
+Import ('env')
 
 incs = '. ../editors/include ../makesdna ../makesrna ../blenlib ../blenkernel ../nodes'
 incs += ' ../imbuf ../blenloader ../render/extern/include ../windowmanager'
 incs += ' #intern/guardedalloc #intern/memutil #extern/glew/include'
 incs += ' #intern/audaspace/intern ' + env['BF_PYTHON_INC']
 
+is_debug = (env['OURPLATFORM'] in ('win32-mingw', 'win32-vc','win64-vc') and env['BF_DEBUG'])
+
+# generic
 defs = []
 
-if env['BF_BUILDINFO']:
-    defs.append('BUILD_DATE')
+if is_debug:
+    defs.append('_DEBUG')
+
+sources = env.Glob('generic/*.c')
+env.BlenderLib( libname = 'bf_python_ext', sources = Split(sources), includes = Split(incs), defines = defs, libtype = ['core','player'], priority = [362,165]) # ketsji is 360
 
-if env['OURPLATFORM'] in ('win32-mingw', 'win32-vc','win64-vc') and env['BF_DEBUG']:
+
+# bpy
+defs = []
+
+if is_debug:
     defs.append('_DEBUG')
 
-env.BlenderLib( libname = 'bf_python', sources = Split(sources), includes = Split(incs), defines = defs, libtype = ['core','player'], priority = [361,160])
+if env['WITH_BF_PYTHON_SAFETY']:
+    defs.append('WITH_PYTHON_SAFETY')
 
+if env['BF_BUILDINFO']:
+    defs.append('BUILD_DATE')
 
-# generic
-sources = env.Glob('generic/*.c')
-env.BlenderLib( libname = 'bf_python_ext', sources = Split(sources), includes = Split(incs), defines = defs, libtype = ['core','player'], priority = [362,165]) # ketsji is 360
+sources = env.Glob('intern/*.c')
+env.BlenderLib( libname = 'bf_python', sources = Split(sources), includes = Split(incs), defines = defs, libtype = ['core','player'], priority = [361,160])
index bf91fd90744baff6fcc453e847863ef60fcf18ed..fbf2741533ed2aa7aa146e16e7cffc5311a29873 100644 (file)
@@ -76,4 +76,8 @@ if(WITH_PYTHON_MODULE)
        add_definitions(-DWITH_PYTHON_MODULE)
 endif()
 
+if(WITH_PYTHON_SAFETY)
+       add_definitions(-DWITH_PYTHON_SAFETY)
+endif()
+
 blender_add_lib(bf_python "${SRC}" "${INC}")
index b5da9bf91be5a40e6acf8441678e91a3bfedb2cd..8705efb055a862e209611f3a6bd3b26c3e3160e3 100644 (file)
 #ifndef BPY_RNA_H
 #define BPY_RNA_H
 
-
 /* --- bpy build options --- */
+#ifdef WITH_PYTHON_SAFETY
+
 /* play it safe and keep optional for now, need to test further now this affects looping on 10000's of verts for eg. */
-// #define USE_WEAKREFS
+#define USE_WEAKREFS
 
 /* method to invalidate removed py data, XXX, slow to remove objects, otherwise no overhead */
-//#define USE_PYRNA_INVALIDATE_GC
+/* #define USE_PYRNA_INVALIDATE_GC */
 
 /* different method */
-//#define USE_PYRNA_INVALIDATE_WEAKREF
+#define USE_PYRNA_INVALIDATE_WEAKREF
 
 /* support for inter references, currently only needed for corner case */
-// #define USE_PYRNA_STRUCT_REFERENCE
+#define USE_PYRNA_STRUCT_REFERENCE
 
 /* use real collection iterators rather then faking with a list */
 #define USE_PYRNA_ITER
 
+#else /* WITH_PYTHON_SAFETY */
+
+ /* default, no defines! */
+
+#endif /* !WITH_PYTHON_SAFETY */
+
+
 /* sanity checks on above defs */
 #if defined(USE_PYRNA_INVALIDATE_WEAKREF) && !defined(USE_WEAKREFS)
 #define USE_WEAKREFS