Blender V5.0
py_capi_utils.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 <string>
14
15#include "BLI_compiler_attrs.h"
16#include "BLI_span.hh"
17#include "BLI_sys_types.h"
18
20void PyC_ObSpit(const char *name, PyObject *var);
25void PyC_ObSpitStr(char *result, size_t result_maxncpy, PyObject *var);
26void PyC_LineSpit();
27void PyC_StackSpit();
28
38[[nodiscard]] PyObject *PyC_ExceptionBuffer() ATTR_RETURNS_NONNULL;
45[[nodiscard]] PyObject *PyC_ExceptionBuffer_Simple() ATTR_RETURNS_NONNULL;
46
47[[nodiscard]] PyObject *PyC_Object_GetAttrStringArgs(PyObject *o, Py_ssize_t n, ...);
48[[nodiscard]] PyObject *PyC_FrozenSetFromStrings(const char **strings);
49
57PyObject *PyC_Err_Format_Prefix(PyObject *exception_type_prefix, const char *format, ...);
58PyObject *PyC_Err_SetString_Prefix(PyObject *exception_type_prefix, const char *str);
59
64void PyC_Err_PrintWithFunc(PyObject *py_func);
65
66void PyC_FileAndNum(const char **r_filename, int *r_lineno);
67void PyC_FileAndNum_Safe(const char **r_filename, int *r_lineno); /* checks python is running */
68[[nodiscard]] int PyC_AsArray_FAST(void *array,
69 size_t array_item_size,
70 PyObject *value_fast,
71 Py_ssize_t length,
72 const PyTypeObject *type,
73 const char *error_prefix);
74[[nodiscard]] int PyC_AsArray(void *array,
75 size_t array_item_size,
76 PyObject *value,
77 Py_ssize_t length,
78 const PyTypeObject *type,
79 const char *error_prefix);
80
81[[nodiscard]] int PyC_AsArray_Multi_FAST(void *array,
82 size_t array_item_size,
83 PyObject *value_fast,
84 const int *dims,
85 int dims_len,
86 const PyTypeObject *type,
87 const char *error_prefix);
88
89[[nodiscard]] int PyC_AsArray_Multi(void *array,
90 size_t array_item_size,
91 PyObject *value,
92 const int *dims,
93 int dims_len,
94 const PyTypeObject *type,
95 const char *error_prefix);
96
97[[nodiscard]] PyObject *PyC_Tuple_PackArray_F32(const float *array, uint len);
98[[nodiscard]] PyObject *PyC_Tuple_PackArray_F64(const double *array, uint len);
99[[nodiscard]] PyObject *PyC_Tuple_PackArray_I32(const int *array, uint len);
100[[nodiscard]] PyObject *PyC_Tuple_PackArray_I32FromBool(const int *array, uint len);
101[[nodiscard]] PyObject *PyC_Tuple_PackArray_Bool(const bool *array, uint len);
102
106[[nodiscard]] PyObject *PyC_Tuple_PackArray_String(const char **array, uint len);
107
108[[nodiscard]] PyObject *PyC_Tuple_PackArray_Multi_F32(const float *array,
109 const int dims[],
110 int dims_len);
111[[nodiscard]] PyObject *PyC_Tuple_PackArray_Multi_F64(const double *array,
112 const int dims[],
113 int dims_len);
114[[nodiscard]] PyObject *PyC_Tuple_PackArray_Multi_I32(const int *array,
115 const int dims[],
116 int dims_len);
117[[nodiscard]] PyObject *PyC_Tuple_PackArray_Multi_Bool(const bool *array,
118 const int dims[],
119 int dims_len);
120
125void PyC_Tuple_Fill(PyObject *tuple, PyObject *value);
126void PyC_List_Fill(PyObject *list, PyObject *value);
127
133[[nodiscard]] PyObject *PyC_UnicodeFromBytes(const char *str);
137[[nodiscard]] PyObject *PyC_UnicodeFromBytesAndSize(const char *str, Py_ssize_t size);
138[[nodiscard]] const char *PyC_UnicodeAsBytes(PyObject *py_str,
139 PyObject **r_coerce); /* coerce must be NULL */
147[[nodiscard]] const char *PyC_UnicodeAsBytesAndSize(PyObject *py_str,
148 Py_ssize_t *r_size,
149 PyObject **r_coerce);
150
158 PyObject *value_coerce;
159 const char *value;
160 Py_ssize_t value_len;
161};
162
173int PyC_ParseUnicodeAsBytesAndSize(PyObject *o, void *p);
175int PyC_ParseUnicodeAsBytesAndSize_OrNone(PyObject *o, void *p);
176
189[[nodiscard]] PyObject *PyC_DefaultNameSpace(const char *filename) ATTR_NONNULL(1);
190void PyC_RunQuicky(const char *filepath, int n, ...) ATTR_NONNULL(1);
199[[nodiscard]] bool PyC_NameSpace_ImportArray(PyObject *py_dict, const char *imports[]);
200
204[[nodiscard]] PyObject *PyC_MainModule_Backup();
205void PyC_MainModule_Restore(PyObject *main_mod);
206
207[[nodiscard]] bool PyC_IsInterpreterActive();
208
212[[nodiscard]] void *PyC_RNA_AsPointer(PyObject *value, const char *type_name);
213
214/* flag / set --- interchange */
216 int value;
217 const char *identifier;
218};
219
220[[nodiscard]] PyObject *PyC_FlagSet_AsString(const PyC_FlagSet *item);
221[[nodiscard]] int PyC_FlagSet_ValueFromID_int(const PyC_FlagSet *item,
222 const char *identifier,
223 int *r_value);
224[[nodiscard]] int PyC_FlagSet_ValueFromID(const PyC_FlagSet *item,
225 const char *identifier,
226 int *r_value,
227 const char *error_prefix);
228[[nodiscard]] int PyC_FlagSet_ToBitfield(const PyC_FlagSet *items,
229 PyObject *value,
230 int *r_value,
231 const char *error_prefix);
232[[nodiscard]] PyObject *PyC_FlagSet_FromBitfield(PyC_FlagSet *items, int flag);
233
239[[nodiscard]] bool PyC_RunString_AsNumber(const char **imports,
240 const char *expr,
241 const char *filename,
242 double *r_value) ATTR_NONNULL(2, 3, 4);
243[[nodiscard]] bool PyC_RunString_AsIntPtr(const char **imports,
244 const char *expr,
245 const char *filename,
246 intptr_t *r_value) ATTR_NONNULL(2, 3, 4);
250[[nodiscard]] bool PyC_RunString_AsStringAndSize(const char **imports,
251 const char *expr,
252 const char *filename,
253 char **r_value,
254 size_t *r_value_size) ATTR_NONNULL(2, 3, 4, 5);
255[[nodiscard]] bool PyC_RunString_AsString(const char **imports,
256 const char *expr,
257 const char *filename,
258 char **r_value) ATTR_NONNULL(2, 3, 4);
259
263[[nodiscard]] bool PyC_RunString_AsStringAndSizeOrNone(const char **imports,
264 const char *expr,
265 const char *filename,
266 char **r_value,
267 size_t *r_value_size) ATTR_NONNULL(2, 3, 4);
268[[nodiscard]] bool PyC_RunString_AsStringOrNone(const char **imports,
269 const char *expr,
270 const char *filename,
271 char **r_value) ATTR_NONNULL(2, 3, 4);
272
276void PyC_StdFilesFlush();
277
283[[nodiscard]] int PyC_ParseBool(PyObject *o, void *p);
284
286 int value;
287 const char *id;
288};
293
297[[nodiscard]] int PyC_ParseStringEnum(PyObject *o, void *p);
298[[nodiscard]] const char *PyC_StringEnum_FindIDFromValue(const struct PyC_StringEnumItems *items,
299 int value);
300
304[[nodiscard]] int PyC_CheckArgs_DeepCopy(PyObject *args);
305
306/* Integer parsing (with overflow checks), -1 on error. */
332[[nodiscard]] int PyC_Long_AsBool(PyObject *value);
333[[nodiscard]] int8_t PyC_Long_AsI8(PyObject *value);
334[[nodiscard]] int16_t PyC_Long_AsI16(PyObject *value);
335#if 0 /* inline */
336[[nodiscard]] int32_t PyC_Long_AsI32(PyObject *value);
337[[nodiscard]] int64_t PyC_Long_AsI64(PyObject *value);
338#endif
339
346[[nodiscard]] uint8_t PyC_Long_AsU8(PyObject *value);
347[[nodiscard]] uint16_t PyC_Long_AsU16(PyObject *value);
348[[nodiscard]] uint32_t PyC_Long_AsU32(PyObject *value);
355[[nodiscard]] uint64_t PyC_Long_AsU64(PyObject *value);
356
357/* inline so type signatures match as expected */
358[[nodiscard]] Py_LOCAL_INLINE(int32_t) PyC_Long_AsI32(PyObject *value)
359{
360#if PY_VERSION_HEX < 0x030d0000 /* <3.13 */
361 return (int32_t)_PyLong_AsInt(value);
362#else
363 return (int32_t)PyLong_AsInt(value);
364#endif
365}
366[[nodiscard]] Py_LOCAL_INLINE(int64_t) PyC_Long_AsI64(PyObject *value)
367{
368 return (int64_t)PyLong_AsLongLong(value);
369}
370
371/* utils for format string in `struct` module style syntax */
372[[nodiscard]] char PyC_StructFmt_type_from_str(const char *typestr);
373[[nodiscard]] bool PyC_StructFmt_type_is_float_any(char format);
374[[nodiscard]] bool PyC_StructFmt_type_is_int_any(char format);
375[[nodiscard]] bool PyC_StructFmt_type_is_byte(char format);
376[[nodiscard]] bool PyC_StructFmt_type_is_bool(char format);
377
381[[nodiscard]] PyObject *PyC_UnicodeFromStdStr(const std::string &str);
382
383[[nodiscard]] inline PyObject *PyC_Tuple_Pack_F32(const blender::Span<float> values)
384{
385 return PyC_Tuple_PackArray_F32(values.data(), values.size());
386}
387[[nodiscard]] inline PyObject *PyC_Tuple_Pack_F64(const blender::Span<double> values)
388{
389 return PyC_Tuple_PackArray_F64(values.data(), values.size());
390}
391[[nodiscard]] inline PyObject *PyC_Tuple_Pack_I32(const blender::Span<int> values)
392{
393 return PyC_Tuple_PackArray_I32(values.data(), values.size());
394}
395[[nodiscard]] inline PyObject *PyC_Tuple_Pack_I32FromBool(const blender::Span<int> values)
396{
397 return PyC_Tuple_PackArray_I32FromBool(values.data(), values.size());
398}
399[[nodiscard]] inline PyObject *PyC_Tuple_Pack_Bool(const blender::Span<bool> values)
400{
401 return PyC_Tuple_PackArray_Bool(values.data(), values.size());
402}
#define ATTR_RETURNS_NONNULL
#define ATTR_NONNULL(...)
unsigned int uint
long long int int64_t
unsigned long long int uint64_t
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
constexpr const T * data() const
Definition BLI_span.hh:215
constexpr int64_t size() const
Definition BLI_span.hh:252
#define str(s)
float length(VecOp< float, D >) RET
format
int PyC_AsArray_Multi_FAST(void *array, const size_t array_item_size, PyObject *value_fast, const int *dims, const int dims_len, const PyTypeObject *type, const char *error_prefix)
const char * PyC_UnicodeAsBytesAndSize(PyObject *py_str, Py_ssize_t *r_size, PyObject **r_coerce)
PyObject * PyC_Tuple_PackArray_Bool(const bool *array, uint len)
PyObject * PyC_Err_SetString_Prefix(PyObject *exception_type_prefix, const char *str)
void * PyC_RNA_AsPointer(PyObject *value, const char *type_name)
PyObject * PyC_Tuple_PackArray_Multi_Bool(const bool *array, const int dims[], const int dims_len)
PyObject * PyC_Err_Format_Prefix(PyObject *exception_type_prefix, const char *format,...)
PyObject * PyC_UnicodeFromBytesAndSize(const char *str, Py_ssize_t size)
PyObject * PyC_Tuple_PackArray_I32FromBool(const int *array, uint len)
PyObject * PyC_UnicodeFromBytes(const char *str)
PyObject * PyC_Tuple_PackArray_Multi_F64(const double *array, const int dims[], const int dims_len)
PyObject * PyC_Tuple_PackArray_I32(const int *array, uint len)
#define PyLong_AsInt
PyObject * PyC_Tuple_PackArray_String(const char **array, uint len)
int PyC_AsArray(void *array, const size_t array_item_size, PyObject *value, const Py_ssize_t length, const PyTypeObject *type, const char *error_prefix)
bool PyC_IsInterpreterActive()
PyObject * PyC_Tuple_PackArray_Multi_F32(const float *array, const int dims[], const int dims_len)
PyObject * PyC_ExceptionBuffer_Simple()
int PyC_AsArray_Multi(void *array, const size_t array_item_size, PyObject *value, const int *dims, const int dims_len, const PyTypeObject *type, const char *error_prefix)
PyObject * PyC_MainModule_Backup()
void PyC_FileAndNum_Safe(const char **r_filename, int *r_lineno)
int PyC_AsArray_FAST(void *array, const size_t array_item_size, PyObject *value_fast, const Py_ssize_t length, const PyTypeObject *type, const char *error_prefix)
bool PyC_NameSpace_ImportArray(PyObject *py_dict, const char *imports[])
void PyC_FileAndNum(const char **r_filename, int *r_lineno)
void PyC_List_Fill(PyObject *list, PyObject *value)
void PyC_Err_PrintWithFunc(PyObject *py_func)
void PyC_MainModule_Restore(PyObject *main_mod)
PyObject * PyC_Tuple_PackArray_F32(const float *array, uint len)
PyObject * PyC_Tuple_PackArray_F64(const double *array, uint len)
PyObject * PyC_Tuple_PackArray_Multi_I32(const int *array, const int dims[], const int dims_len)
PyObject * PyC_FrozenSetFromStrings(const char **strings)
void PyC_Tuple_Fill(PyObject *tuple, PyObject *value)
PyObject * PyC_Object_GetAttrStringArgs(PyObject *o, Py_ssize_t n,...)
const char * PyC_UnicodeAsBytes(PyObject *py_str, PyObject **r_coerce)
int16_t PyC_Long_AsI16(PyObject *value)
PyObject * PyC_Tuple_PackArray_Bool(const bool *array, uint len)
char PyC_StructFmt_type_from_str(const char *typestr)
void PyC_LineSpit()
bool bool bool bool bool bool PyC_RunString_AsStringOrNone(const char **imports, const char *expr, const char *filename, char **r_value) ATTR_NONNULL(2
bool PyC_StructFmt_type_is_bool(char format)
uint8_t PyC_Long_AsU8(PyObject *value)
PyObject * PyC_Tuple_Pack_I32(const blender::Span< int > values)
void PyC_ObSpit(const char *name, PyObject *var)
Py_LOCAL_INLINE(int32_t) PyC_Long_AsI32(PyObject *value)
PyObject * PyC_Tuple_Pack_Bool(const blender::Span< bool > values)
int8_t PyC_Long_AsI8(PyObject *value)
PyObject * PyC_Tuple_Pack_F64(const blender::Span< double > values)
bool PyC_RunString_AsNumber(const char **imports, const char *expr, const char *filename, double *r_value) ATTR_NONNULL(2
PyObject * PyC_FlagSet_AsString(const PyC_FlagSet *item)
bool bool bool bool bool PyC_RunString_AsStringAndSizeOrNone(const char **imports, const char *expr, const char *filename, char **r_value, size_t *r_value_size) ATTR_NONNULL(2
bool bool bool bool PyC_RunString_AsString(const char **imports, const char *expr, const char *filename, char **r_value) ATTR_NONNULL(2
PyObject * PyC_Tuple_Pack_F32(const blender::Span< float > values)
bool bool bool PyC_RunString_AsStringAndSize(const char **imports, const char *expr, const char *filename, char **r_value, size_t *r_value_size) ATTR_NONNULL(2
PyObject * PyC_ExceptionBuffer() ATTR_RETURNS_NONNULL
int PyC_CheckArgs_DeepCopy(PyObject *args)
int PyC_ParseUnicodeAsBytesAndSize(PyObject *o, void *p)
PyObject * PyC_Tuple_PackArray_I32FromBool(const int *array, uint len)
int PyC_FlagSet_ValueFromID(const PyC_FlagSet *item, const char *identifier, int *r_value, const char *error_prefix)
int PyC_ParseStringEnum(PyObject *o, void *p)
uint64_t PyC_Long_AsU64(PyObject *value)
bool PyC_StructFmt_type_is_int_any(char format)
PyObject * PyC_Tuple_PackArray_I32(const int *array, uint len)
PyObject * PyC_Tuple_Pack_I32FromBool(const blender::Span< int > values)
void PyC_ObSpitStr(char *result, size_t result_maxncpy, PyObject *var)
bool bool PyC_RunString_AsIntPtr(const char **imports, const char *expr, const char *filename, intptr_t *r_value) ATTR_NONNULL(2
int PyC_Long_AsBool(PyObject *value)
int PyC_FlagSet_ValueFromID_int(const PyC_FlagSet *item, const char *identifier, int *r_value)
void PyC_RunQuicky(const char *filepath, int n,...) ATTR_NONNULL(1)
bool bool bool bool bool bool void PyC_StdFilesFlush()
bool PyC_StructFmt_type_is_byte(char format)
int PyC_FlagSet_ToBitfield(const PyC_FlagSet *items, PyObject *value, int *r_value, const char *error_prefix)
const char * PyC_StringEnum_FindIDFromValue(const struct PyC_StringEnumItems *items, int value)
PyObject * PyC_DefaultNameSpace(const char *filename) ATTR_NONNULL(1)
int PyC_ParseUnicodeAsBytesAndSize_OrNone(PyObject *o, void *p)
uint32_t PyC_Long_AsU32(PyObject *value)
void PyC_StackSpit()
uint16_t PyC_Long_AsU16(PyObject *value)
PyObject * PyC_UnicodeFromStdStr(const std::string &str)
PyObject * PyC_Tuple_PackArray_F32(const float *array, uint len)
PyObject * PyC_Tuple_PackArray_F64(const double *array, uint len)
int PyC_ParseBool(PyObject *o, void *p)
PyObject * PyC_FlagSet_FromBitfield(PyC_FlagSet *items, int flag)
bool PyC_StructFmt_type_is_float_any(char format)
const char * name
const char * identifier
const struct PyC_StringEnumItems * items
uint len
uint8_t flag
Definition wm_window.cc:145