RNA: document Python instancing for ID's and RNA types

Document some of the less obvious implications for
re-using Python instances.
This commit is contained in:
Campbell Barton 2021-01-07 21:32:43 +11:00
parent 4a771263fd
commit 0d042c8cca
2 changed files with 25 additions and 0 deletions

View File

@ -314,6 +314,20 @@ typedef struct ID {
*/
struct ID *orig_id;
/**
* Holds the #PyObject reference to the ID (initialized on demand).
*
* This isn't essential, it could be removed however it gives some advantages:
*
* - Every time the #ID is accessed a #BPy_StructRNA doesn't have to be created & destroyed
* (consider all the polling and drawing functions that access ID's).
*
* - When this #ID is deleted, the #BPy_StructRNA can be invalidated
* so accessing it from Python raises an exception instead of crashing.
*
* This is of limited benefit though, as it doesn't apply to non #ID data
* that references this ID (the bones of an armature or the modifiers of an object for e.g.).
*/
void *py_instance;
void *_pad1;
} ID;

View File

@ -545,6 +545,17 @@ struct StructRNA {
/* function to register/unregister subclasses */
StructRegisterFunc reg;
StructUnregisterFunc unreg;
/**
* Optionally support reusing Python instances for this type.
*
* Without this, an operator class created for #wmOperatorType.invoke (for example)
* would have a different instance passed to the #wmOperatorType.modal callback.
* So any variables assigned to `self` from Python would not be available to other callbacks.
*
* Being able to access the instance also has the advantage that we can invalidate
* the Python instance when the data has been removed, see: #BPY_DECREF_RNA_INVALIDATE
* so accessing the variables from Python raises an exception instead of crashing.
*/
StructInstanceFunc instance;
/* callback to get id properties */