From e8c322ee8568b6fbe01625f047f7056aa00cd818 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 3 Mar 2011 12:00:35 +0000 Subject: [PATCH] Py/RNA API: WITH_PYTHON_SAFETY compile time option which enables extra safety checks. since this is noticeably slower I rather not enable by default yet. --- CMakeLists.txt | 1 + build_files/scons/tools/btools.py | 3 +- source/blender/python/SConscript | 33 ++++++++++++++------- source/blender/python/intern/CMakeLists.txt | 4 +++ source/blender/python/intern/bpy_rna.h | 18 +++++++---- 5 files changed, 43 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 53d96c9fdcd..0e8870fe977 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/build_files/scons/tools/btools.py b/build_files/scons/tools/btools.py index b1b2494d522..d589079a0d4 100644 --- a/build_files/scons/tools/btools.py +++ b/build_files/scons/tools/btools.py @@ -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', ''), diff --git a/source/blender/python/SConscript b/source/blender/python/SConscript index 315fc5ca9a3..30cd5a842ca 100644 --- a/source/blender/python/SConscript +++ b/source/blender/python/SConscript @@ -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 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 + + +# bpy +defs = [] + +if is_debug: + defs.append('_DEBUG') + +if env['WITH_BF_PYTHON_SAFETY']: + defs.append('WITH_PYTHON_SAFETY') + if env['BF_BUILDINFO']: defs.append('BUILD_DATE') -if env['OURPLATFORM'] in ('win32-mingw', 'win32-vc','win64-vc') and env['BF_DEBUG']: - defs.append('_DEBUG') - +sources = env.Glob('intern/*.c') env.BlenderLib( libname = 'bf_python', sources = Split(sources), includes = Split(incs), defines = defs, libtype = ['core','player'], priority = [361,160]) - - -# 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 diff --git a/source/blender/python/intern/CMakeLists.txt b/source/blender/python/intern/CMakeLists.txt index bf91fd90744..fbf2741533e 100644 --- a/source/blender/python/intern/CMakeLists.txt +++ b/source/blender/python/intern/CMakeLists.txt @@ -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}") diff --git a/source/blender/python/intern/bpy_rna.h b/source/blender/python/intern/bpy_rna.h index b5da9bf91be..8705efb055a 100644 --- a/source/blender/python/intern/bpy_rna.h +++ b/source/blender/python/intern/bpy_rna.h @@ -29,23 +29,31 @@ #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