Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2014-04-22 17:05:58 +0400
committerCampbell Barton <ideasman42@gmail.com>2014-04-22 17:05:58 +0400
commitaf84bf2d29f5b976928554dd167a72d6c2fa2404 (patch)
tree0df32e31ff964b3da598f160f6a0e8c64e2c45b6 /source/blender
parentbca7d15ce039e5a9c3620f7bbce00246f537fd5a (diff)
Add type checks for Python context overrides
it was too easy to use invalid types which would crash or fail silently.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/intern/context.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c
index eeb1f4b9e4f..f3ee5c5440c 100644
--- a/source/blender/blenkernel/intern/context.c
+++ b/source/blender/blenkernel/intern/context.c
@@ -232,18 +232,31 @@ struct bContextDataResult {
short type; /* 0: normal, 1: seq */
};
-static void *ctx_wm_python_context_get(const bContext *C, const char *member, void *fall_through)
+static void *ctx_wm_python_context_get(
+ const bContext *C,
+ const char *member, const StructRNA *member_type,
+ void *fall_through)
{
#ifdef WITH_PYTHON
if (UNLIKELY(C && CTX_py_dict_get(C))) {
bContextDataResult result;
memset(&result, 0, sizeof(bContextDataResult));
BPY_context_member_get((bContext *)C, member, &result);
- if (result.ptr.data)
- return result.ptr.data;
+
+ if (result.ptr.data) {
+ if (RNA_struct_is_a(result.ptr.type, member_type)) {
+ return result.ptr.data;
+ }
+ else {
+ printf("PyContext '%s' is a '%s', expected a '%s'\n",
+ member,
+ RNA_struct_identifier(result.ptr.type),
+ RNA_struct_identifier(member_type));
+ }
+ }
}
#else
- (void)C, (void)member;
+ (void)C, (void)member, (void)member_type;
#endif
/* don't allow UI context access from non-main threads */
@@ -608,17 +621,17 @@ wmWindowManager *CTX_wm_manager(const bContext *C)
wmWindow *CTX_wm_window(const bContext *C)
{
- return ctx_wm_python_context_get(C, "window", C->wm.window);
+ return ctx_wm_python_context_get(C, "window", &RNA_Window, C->wm.window);
}
bScreen *CTX_wm_screen(const bContext *C)
{
- return ctx_wm_python_context_get(C, "screen", C->wm.screen);
+ return ctx_wm_python_context_get(C, "screen", &RNA_Screen, C->wm.screen);
}
ScrArea *CTX_wm_area(const bContext *C)
{
- return ctx_wm_python_context_get(C, "area", C->wm.area);
+ return ctx_wm_python_context_get(C, "area", &RNA_Area, C->wm.area);
}
SpaceLink *CTX_wm_space_data(const bContext *C)
@@ -629,7 +642,7 @@ SpaceLink *CTX_wm_space_data(const bContext *C)
ARegion *CTX_wm_region(const bContext *C)
{
- return ctx_wm_python_context_get(C, "region", C->wm.region);
+ return ctx_wm_python_context_get(C, "region", &RNA_Region, C->wm.region);
}
void *CTX_wm_region_data(const bContext *C)