Blender V5.0
bpy_rna.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#pragma once
10
11#include <Python.h>
12
13#include <optional>
14
15/* --- bpy build options --- */
17#ifdef WITH_PYTHON_SAFETY
18
23# define USE_WEAKREFS
24
25/* method to invalidate removed py data, XXX, slow to remove objects, otherwise no overhead */
26// #define USE_PYRNA_INVALIDATE_GC
27
28/* different method */
29# define USE_PYRNA_INVALIDATE_WEAKREF
30
31/* support for inter references, currently only needed for corner case */
32# define USE_PYRNA_STRUCT_REFERENCE
33
34#else /* WITH_PYTHON_SAFETY */
35
36/* default, no defines! */
37
38#endif /* !WITH_PYTHON_SAFETY */
39
40/* Sanity checks on above defines. */
41#if defined(USE_PYRNA_INVALIDATE_WEAKREF) && !defined(USE_WEAKREFS)
42# define USE_WEAKREFS
43#endif
44
45#if defined(USE_PYRNA_INVALIDATE_GC) && defined(USE_PYRNA_INVALIDATE_WEAKREF)
46# error "Only 1 reference check method at a time!"
47#endif
48
49/* only used by operator introspection get_rna(), this is only used for doc gen
50 * so prefer the leak to the memory bloat for now. */
51// #define PYRNA_FREE_SUPPORT
52
53/* use real collection iterators rather than faking with a list
54 * this is needed so enums can be iterated over without crashing,
55 * since finishing the iteration frees temp allocated enums */
56#define USE_PYRNA_ITER
57
58/* --- end bpy build options --- */
59
60struct ID;
61
66extern PyTypeObject pyrna_struct_meta_idprop_Type;
67extern PyTypeObject pyrna_struct_Type;
68extern PyTypeObject pyrna_prop_Type;
69extern PyTypeObject pyrna_prop_array_Type;
70extern PyTypeObject pyrna_prop_collection_Type;
71extern PyTypeObject pyrna_func_Type;
72
73#define BPy_StructRNA_Check(v) (PyObject_TypeCheck(v, &pyrna_struct_Type))
74#define BPy_StructRNA_CheckExact(v) (Py_TYPE(v) == &pyrna_struct_Type)
75#define BPy_PropertyRNA_Check(v) (PyObject_TypeCheck(v, &pyrna_prop_Type))
76#define BPy_PropertyRNA_CheckExact(v) (Py_TYPE(v) == &pyrna_prop_Type)
77
78#define PYRNA_STRUCT_CHECK_OBJ(obj) \
79 if (UNLIKELY(pyrna_struct_validity_check(obj) == -1)) { \
80 return NULL; \
81 } \
82 (void)0
83#define PYRNA_STRUCT_CHECK_INT(obj) \
84 if (UNLIKELY(pyrna_struct_validity_check(obj) == -1)) { \
85 return -1; \
86 } \
87 (void)0
88
89#define PYRNA_PROP_CHECK_OBJ(obj) \
90 if (UNLIKELY(pyrna_prop_validity_check(obj) == -1)) { \
91 return NULL; \
92 } \
93 (void)0
94#define PYRNA_PROP_CHECK_INT(obj) \
95 if (UNLIKELY(pyrna_prop_validity_check(obj) == -1)) { \
96 return -1; \
97 } \
98 (void)0
99
100#define PYRNA_STRUCT_CHECK_OBJ_UNLESS(obj, unless) \
101 { \
102 const BPy_StructRNA *_obj = obj; \
103 if (UNLIKELY(pyrna_struct_validity_check_only(_obj) == -1) && !(unless)) { \
104 pyrna_struct_validity_exception_only(_obj); \
105 return NULL; \
106 } \
107 } \
108 (void)0
109
110#define PYRNA_STRUCT_IS_VALID(pysrna) (LIKELY(((BPy_StructRNA *)(pysrna))->ptr->type != NULL))
111#define PYRNA_PROP_IS_VALID(pysrna) (LIKELY(((BPy_PropertyRNA *)(pysrna))->ptr->type != NULL))
112
113/* 'in_weakreflist' MUST be aligned */
114
116 PyObject_HEAD /* Required Python macro. */
117#ifdef USE_WEAKREFS
118 PyObject *in_weakreflist;
119#endif
120
121 std::optional<PointerRNA> ptr;
122};
123
125 PyObject_HEAD /* Required Python macro. */
126#ifdef USE_WEAKREFS
127 PyObject *in_weakreflist;
128#endif
129
130 std::optional<PointerRNA> ptr;
131
132#ifdef USE_PYRNA_STRUCT_REFERENCE
133 /* generic PyObject we hold a reference to, example use:
134 * hold onto the collection iterator to prevent it from freeing allocated data we may use */
135 PyObject *reference;
136#endif /* !USE_PYRNA_STRUCT_REFERENCE */
137
138#ifdef PYRNA_FREE_SUPPORT
140 bool freeptr;
141#endif /* PYRNA_FREE_SUPPORT */
142};
143
145 PyObject_HEAD /* Required Python macro. */
146#ifdef USE_WEAKREFS
147 PyObject *in_weakreflist;
148#endif
149
150 std::optional<PointerRNA> ptr;
152};
153
155 PyObject_HEAD /* Required Python macro. */
156
157 /* START Must match #BPy_PropertyRNA. */
158
159#ifdef USE_WEAKREFS
160 PyObject *in_weakreflist;
161#endif
162
163 std::optional<PointerRNA> ptr;
165
166 /* END Must match #BPy_PropertyRNA. */
167
168 /* Arystan: this is a hack to allow sub-item r/w access like: face.uv[n][m] */
173};
174
176 PyObject_HEAD /* Required Python macro. */
177#ifdef USE_WEAKREFS
178 PyObject *in_weakreflist;
179#endif
180
181 /* collection iterator specific parts */
182 std::optional<CollectionPropertyIterator> iter;
183};
184
186 PyObject_HEAD /* Required Python macro. */
187#ifdef USE_WEAKREFS
188 PyObject *in_weakreflist;
189#endif
190
191 std::optional<PointerRNA> ptr;
197 vectorcallfunc vectorcall;
198};
199
200[[nodiscard]] StructRNA *srna_from_self(PyObject *self, const char *error_prefix);
201[[nodiscard]] StructRNA *pyrna_struct_as_srna(PyObject *self,
202 bool parent,
203 const char *error_prefix);
204
205void BPY_rna_init();
206void BPY_rna_exit();
207[[nodiscard]] PyObject *BPY_rna_module();
209// PyObject *BPY_rna_doc();
210[[nodiscard]] PyObject *BPY_rna_types();
214void BPY_rna_types_dict_set(PyObject *dict);
215void BPY_rna_types_finalize_external_types(PyObject *submodule);
216
218[[nodiscard]] PyObject *pyrna_struct_CreatePyObject(PointerRNA *ptr);
219[[nodiscard]] PyObject *pyrna_prop_CreatePyObject(PointerRNA *ptr, PropertyRNA *prop);
220
221/* Made public for other modules which don't deal closely with RNA. */
222[[nodiscard]] PyObject *pyrna_id_CreatePyObject(ID *id);
223[[nodiscard]] bool pyrna_id_FromPyObject(PyObject *obj, ID **id);
224[[nodiscard]] bool pyrna_id_CheckPyObject(PyObject *obj);
225
226/* operators also need this to set args */
227[[nodiscard]] int pyrna_pydict_to_props(PointerRNA *ptr,
228 PyObject *kw,
229 bool all_args,
230 const char *error_prefix);
231[[nodiscard]] PyObject *pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop);
232
233[[nodiscard]] int pyrna_deferred_register_class(StructRNA *srna, PyTypeObject *py_class);
234
235const PointerRNA *pyrna_struct_as_ptr(PyObject *py_obj, const StructRNA *srna);
236const PointerRNA *pyrna_struct_as_ptr_or_null(PyObject *py_obj, const StructRNA *srna);
237
249
256[[nodiscard]] int pyrna_struct_as_ptr_parse(PyObject *o, void *p);
260[[nodiscard]] int pyrna_struct_as_ptr_or_null_parse(PyObject *o, void *p);
261
262void pyrna_struct_type_extend_capi(StructRNA *srna, PyMethodDef *method, PyGetSetDef *getset);
263
264void pyrna_alloc_types();
265
266/* Primitive type conversion. */
267
268[[nodiscard]] int pyrna_py_to_array(
269 PointerRNA *ptr, PropertyRNA *prop, char *param_data, PyObject *py, const char *error_prefix);
270[[nodiscard]] int pyrna_py_to_array_index(PointerRNA *ptr,
271 PropertyRNA *prop,
272 int arraydim,
273 int arrayoffset,
274 int index,
275 PyObject *py,
276 const char *error_prefix);
277[[nodiscard]] PyObject *pyrna_array_index(PointerRNA *ptr, PropertyRNA *prop, int index);
278
279[[nodiscard]] PyObject *pyrna_py_from_array(PointerRNA *ptr, PropertyRNA *prop);
282 PropertyRNA *prop,
283 int index);
284[[nodiscard]] PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop);
285[[nodiscard]] int pyrna_array_contains_py(PointerRNA *ptr, PropertyRNA *prop, PyObject *value);
286
287[[nodiscard]] bool pyrna_write_check();
288void pyrna_write_set(bool val);
289
291
292[[nodiscard]] int pyrna_struct_validity_check_only(const BPy_StructRNA *pysrna);
294[[nodiscard]] int pyrna_struct_validity_check(const BPy_StructRNA *pysrna);
295
296[[nodiscard]] int pyrna_prop_validity_check(const BPy_PropertyRNA *self);
297
298/* bpy.utils.(un)register_class */
299extern PyMethodDef meth_bpy_register_class;
300extern PyMethodDef meth_bpy_unregister_class;
301
302/* bpy.utils._bl_owner_(get/set) */
303extern PyMethodDef meth_bpy_owner_id_set;
304extern PyMethodDef meth_bpy_owner_id_get;
305
PyObject * self
PyTypeObject pyrna_struct_meta_idprop_Type
Definition bpy_rna.cc:7080
PyTypeObject pyrna_prop_Type
Definition bpy_rna.cc:7411
PyMethodDef meth_bpy_owner_id_set
Definition bpy_rna.cc:10604
PyMethodDef meth_bpy_owner_id_get
Definition bpy_rna.cc:10598
PyTypeObject pyrna_prop_array_Type
Definition bpy_rna.cc:7467
PyTypeObject pyrna_struct_Type
Definition bpy_rna.cc:7172
PyTypeObject pyrna_func_Type
Definition bpy_rna.cc:8048
PyMethodDef meth_bpy_unregister_class
Definition bpy_rna.cc:10378
PyMethodDef meth_bpy_register_class
Definition bpy_rna.cc:10147
BPy_StructRNA * bpy_context_module
Definition bpy_rna.cc:96
PyTypeObject pyrna_prop_collection_Type
Definition bpy_rna.cc:7523
const PointerRNA * pyrna_struct_as_ptr(PyObject *py_obj, const StructRNA *srna)
Definition bpy_rna.cc:9012
int pyrna_py_to_array(PointerRNA *ptr, PropertyRNA *prop, char *param_data, PyObject *py, const char *error_prefix)
void pyrna_invalidate(BPy_DummyPointerRNA *self)
Definition bpy_rna.cc:178
int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, bool all_args, const char *error_prefix)
Definition bpy_rna.cc:1530
bool pyrna_id_CheckPyObject(PyObject *obj)
Definition bpy_rna.cc:8622
PyObject * BPY_rna_module()
Definition bpy_rna.cc:8703
PyObject * pyrna_array_index(PointerRNA *ptr, PropertyRNA *prop, int index)
PyObject * pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
Definition bpy_rna.cc:748
void pyrna_struct_type_extend_capi(StructRNA *srna, PyMethodDef *method, PyGetSetDef *getset)
Definition bpy_rna.cc:10511
int pyrna_array_contains_py(PointerRNA *ptr, PropertyRNA *prop, PyObject *value)
bool pyrna_write_check()
Definition bpy_rna.cc:457
void pyrna_struct_validity_exception_only(const BPy_StructRNA *pysrna)
Definition bpy_rna.cc:151
void BPY_rna_init()
Definition bpy_rna.cc:8627
void BPY_rna_types_finalize_external_types(PyObject *submodule)
Definition bpy_rna.cc:8898
int pyrna_struct_as_ptr_or_null_parse(PyObject *o, void *p)
Definition bpy_rna.cc:9045
int pyrna_struct_as_ptr_parse(PyObject *o, void *p)
Definition bpy_rna.cc:9034
int pyrna_py_to_array_index(PointerRNA *ptr, PropertyRNA *prop, int arraydim, int arrayoffset, int index, PyObject *py, const char *error_prefix)
StructRNA * srna_from_self(PyObject *self, const char *error_prefix)
Definition bpy_rna.cc:9058
PyObject * pyrna_id_CreatePyObject(ID *id)
Definition bpy_rna.cc:8601
int pyrna_struct_validity_check(const BPy_StructRNA *pysrna)
Definition bpy_rna.cc:157
int pyrna_prop_validity_check(const BPy_PropertyRNA *self)
Definition bpy_rna.cc:166
int pyrna_struct_validity_check_only(const BPy_StructRNA *pysrna)
Definition bpy_rna.cc:143
const PointerRNA * pyrna_struct_as_ptr_or_null(PyObject *py_obj, const StructRNA *srna)
Definition bpy_rna.cc:9026
StructRNA * pyrna_struct_as_srna(PyObject *self, bool parent, const char *error_prefix)
Definition bpy_rna.cc:8959
PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
Definition bpy_rna.cc:1445
int pyrna_deferred_register_class(StructRNA *srna, PyTypeObject *py_class)
Definition bpy_rna.cc:9281
void BPY_rna_types_dict_set(PyObject *dict)
Definition bpy_rna.cc:8237
void BPY_rna_exit()
Definition bpy_rna.cc:8680
PyObject * BPY_rna_types()
Definition bpy_rna.cc:8868
PyObject * pyrna_prop_CreatePyObject(PointerRNA *ptr, PropertyRNA *prop)
Definition bpy_rna.cc:8553
void pyrna_write_set(bool val)
Definition bpy_rna.cc:464
void pyrna_alloc_types()
Definition bpy_rna.cc:10052
void BPY_update_rna_module()
Definition bpy_rna.cc:8715
bool pyrna_id_FromPyObject(PyObject *obj, ID **id)
Definition bpy_rna.cc:8611
PyObject * pyrna_struct_CreatePyObject(PointerRNA *ptr)
Definition bpy_rna.cc:8496
PyObject * pyrna_py_from_array_index(BPy_PropertyArrayRNA *self, PointerRNA *ptr, PropertyRNA *prop, int index)
PyObject * pyrna_struct_CreatePyObject_with_primitive_support(PointerRNA *ptr)
Definition bpy_rna.cc:8532
PyObject * pyrna_py_from_array(PointerRNA *ptr, PropertyRNA *prop)
PyObject_HEAD std::optional< PointerRNA > ptr
Definition bpy_rna.hh:121
vectorcallfunc vectorcall
Definition bpy_rna.hh:197
PyObject_HEAD std::optional< PointerRNA > ptr
Definition bpy_rna.hh:191
FunctionRNA * func
Definition bpy_rna.hh:192
PyObject_HEAD std::optional< PointerRNA > ptr
Definition bpy_rna.hh:163
PropertyRNA * prop
Definition bpy_rna.hh:164
PyObject_HEAD std::optional< CollectionPropertyIterator > iter
Definition bpy_rna.hh:182
PyObject_HEAD std::optional< PointerRNA > ptr
Definition bpy_rna.hh:150
PropertyRNA * prop
Definition bpy_rna.hh:151
StructRNA * type
Definition bpy_rna.hh:245
const PointerRNA * ptr
Definition bpy_rna.hh:247
PyObject_HEAD std::optional< PointerRNA > ptr
Definition bpy_rna.hh:130
Definition DNA_ID.h:414
PointerRNA * ptr
Definition wm_files.cc:4238