diff options
author | Campbell Barton <ideasman42@gmail.com> | 2021-03-16 04:18:56 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2021-03-16 07:17:45 +0300 |
commit | e125305af41a7360c52b9a38024b7e24fde06d70 (patch) | |
tree | 89670ef582473388c7c87fe42f4ae81f0a44132d /source/blender/python/intern/bpy_interface.c | |
parent | be51d671b500e8b6881295778de7272a70504b71 (diff) |
Fix T86332: Error using lambda in annotations in Python 3.10
Callbacks used in `bpy.props` didn't hold a references to the functions
they used.
While this has been the case since early 2.5x it didn't cause any
problems as long as the class held a reference.
With Python 3.10 or when using `from __future__ import annotations`,
the annotations are no longer owned by the class once evaluated.
Resolve this by holding a reference in the module, which now supports
traverse & clear callbacks so the objects are visible to Python's
garbage collector.
Also refactor storage of Python data, moving from an array into a struct.
Diffstat (limited to 'source/blender/python/intern/bpy_interface.c')
-rw-r--r-- | source/blender/python/intern/bpy_interface.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index 331884c0bd2..5f31e0bb74d 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -45,6 +45,7 @@ #include "bpy_capi_utils.h" #include "bpy_intern_string.h" #include "bpy_path.h" +#include "bpy_props.h" #include "bpy_rna.h" #include "bpy_traceback.h" @@ -523,6 +524,9 @@ void BPY_python_end(void) /* finalizing, no need to grab the state, except when we are a module */ gilstate = PyGILState_Ensure(); + /* Decrement user counts of all callback functions. */ + BPY_rna_props_clear_all(); + /* free other python data. */ pyrna_free_types(); |