Blender V4.5
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
46
47PyObject *PyC_Object_GetAttrStringArgs(PyObject *o, Py_ssize_t n, ...);
48PyObject *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 */
68int 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);
74int 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
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
89int 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
97PyObject *PyC_Tuple_PackArray_F32(const float *array, uint len);
98PyObject *PyC_Tuple_PackArray_F64(const double *array, uint len);
99PyObject *PyC_Tuple_PackArray_I32(const int *array, uint len);
100PyObject *PyC_Tuple_PackArray_I32FromBool(const int *array, uint len);
101PyObject *PyC_Tuple_PackArray_Bool(const bool *array, uint len);
102
106PyObject *PyC_Tuple_PackArray_String(const char **array, uint len);
107
108PyObject *PyC_Tuple_PackArray_Multi_F32(const float *array, const int dims[], int dims_len);
109PyObject *PyC_Tuple_PackArray_Multi_F64(const double *array, const int dims[], int dims_len);
110PyObject *PyC_Tuple_PackArray_Multi_I32(const int *array, const int dims[], int dims_len);
111PyObject *PyC_Tuple_PackArray_Multi_Bool(const bool *array, const int dims[], int dims_len);
112
117void PyC_Tuple_Fill(PyObject *tuple, PyObject *value);
118void PyC_List_Fill(PyObject *list, PyObject *value);
119
125PyObject *PyC_UnicodeFromBytes(const char *str);
129PyObject *PyC_UnicodeFromBytesAndSize(const char *str, Py_ssize_t size);
130const char *PyC_UnicodeAsBytes(PyObject *py_str, PyObject **r_coerce); /* coerce must be NULL */
138const char *PyC_UnicodeAsBytesAndSize(PyObject *py_str, Py_ssize_t *r_size, PyObject **r_coerce);
139
147 PyObject *value_coerce;
148 const char *value;
149 Py_ssize_t value_len;
150};
151
162int PyC_ParseUnicodeAsBytesAndSize(PyObject *o, void *p);
164int PyC_ParseUnicodeAsBytesAndSize_OrNone(PyObject *o, void *p);
165
178PyObject *PyC_DefaultNameSpace(const char *filename) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT;
179void PyC_RunQuicky(const char *filepath, int n, ...) ATTR_NONNULL(1);
188bool PyC_NameSpace_ImportArray(PyObject *py_dict, const char *imports[]);
189
194void PyC_MainModule_Restore(PyObject *main_mod);
195
197
201void *PyC_RNA_AsPointer(PyObject *value, const char *type_name);
202
203/* flag / set --- interchange */
205 int value;
206 const char *identifier;
207};
208
209PyObject *PyC_FlagSet_AsString(const PyC_FlagSet *item);
210int PyC_FlagSet_ValueFromID_int(const PyC_FlagSet *item, const char *identifier, int *r_value);
212 const char *identifier,
213 int *r_value,
214 const char *error_prefix);
215int PyC_FlagSet_ToBitfield(const PyC_FlagSet *items,
216 PyObject *value,
217 int *r_value,
218 const char *error_prefix);
219PyObject *PyC_FlagSet_FromBitfield(PyC_FlagSet *items, int flag);
220
226bool PyC_RunString_AsNumber(const char **imports,
227 const char *expr,
228 const char *filename,
229 double *r_value) ATTR_NONNULL(2, 3, 4) ATTR_WARN_UNUSED_RESULT;
230bool PyC_RunString_AsIntPtr(const char **imports,
231 const char *expr,
232 const char *filename,
233 intptr_t *r_value) ATTR_NONNULL(2, 3, 4) ATTR_WARN_UNUSED_RESULT;
237bool PyC_RunString_AsStringAndSize(const char **imports,
238 const char *expr,
239 const char *filename,
240 char **r_value,
241 size_t *r_value_size)
243bool PyC_RunString_AsString(const char **imports,
244 const char *expr,
245 const char *filename,
246 char **r_value) ATTR_NONNULL(2, 3, 4) ATTR_WARN_UNUSED_RESULT;
247
251bool PyC_RunString_AsStringAndSizeOrNone(const char **imports,
252 const char *expr,
253 const char *filename,
254 char **r_value,
255 size_t *r_value_size)
257bool PyC_RunString_AsStringOrNone(const char **imports,
258 const char *expr,
259 const char *filename,
260 char **r_value) ATTR_NONNULL(2, 3, 4) ATTR_WARN_UNUSED_RESULT;
261
265void PyC_StdFilesFlush();
266
272int PyC_ParseBool(PyObject *o, void *p);
273
275 int value;
276 const char *id;
277};
282
286int PyC_ParseStringEnum(PyObject *o, void *p);
287const char *PyC_StringEnum_FindIDFromValue(const struct PyC_StringEnumItems *items, int value);
288
292int PyC_CheckArgs_DeepCopy(PyObject *args);
293
294/* Integer parsing (with overflow checks), -1 on error. */
320int PyC_Long_AsBool(PyObject *value);
321int8_t PyC_Long_AsI8(PyObject *value);
322int16_t PyC_Long_AsI16(PyObject *value);
323#if 0 /* inline */
324int32_t PyC_Long_AsI32(PyObject *value);
325int64_t PyC_Long_AsI64(PyObject *value);
326#endif
327
334uint8_t PyC_Long_AsU8(PyObject *value);
335uint16_t PyC_Long_AsU16(PyObject *value);
336uint32_t PyC_Long_AsU32(PyObject *value);
343uint64_t PyC_Long_AsU64(PyObject *value);
344
345/* inline so type signatures match as expected */
346Py_LOCAL_INLINE(int32_t) PyC_Long_AsI32(PyObject *value)
347{
348#if PY_VERSION_HEX < 0x030d0000 /* <3.13 */
349 return (int32_t)_PyLong_AsInt(value);
350#else
351 return (int32_t)PyLong_AsInt(value);
352#endif
353}
354Py_LOCAL_INLINE(int64_t) PyC_Long_AsI64(PyObject *value)
355{
356 return (int64_t)PyLong_AsLongLong(value);
357}
358
359/* utils for format string in `struct` module style syntax */
360char PyC_StructFmt_type_from_str(const char *typestr);
365
369PyObject *PyC_UnicodeFromStdStr(const std::string &str);
370
371inline PyObject *PyC_Tuple_Pack_F32(const blender::Span<float> values)
372{
373 return PyC_Tuple_PackArray_F32(values.data(), values.size());
374}
375inline PyObject *PyC_Tuple_Pack_F64(const blender::Span<double> values)
376{
377 return PyC_Tuple_PackArray_F64(values.data(), values.size());
378}
379inline PyObject *PyC_Tuple_Pack_I32(const blender::Span<int> values)
380{
381 return PyC_Tuple_PackArray_I32(values.data(), values.size());
382}
383inline PyObject *PyC_Tuple_Pack_I32FromBool(const blender::Span<int> values)
384{
385 return PyC_Tuple_PackArray_I32FromBool(values.data(), values.size());
386}
387inline PyObject *PyC_Tuple_Pack_Bool(const blender::Span<bool> values)
388{
389 return PyC_Tuple_PackArray_Bool(values.data(), values.size());
390}
#define ATTR_WARN_UNUSED_RESULT
#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)
void PyC_RunQuicky(const char *filepath, int n,...)
bool PyC_RunString_AsString(const char *imports[], const char *expr, const char *filename, char **r_value)
PyObject * PyC_Tuple_PackArray_I32FromBool(const int *array, uint len)
bool PyC_RunString_AsStringAndSizeOrNone(const char *imports[], const char *expr, const char *filename, char **r_value, size_t *r_value_size)
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)
bool PyC_RunString_AsStringOrNone(const char *imports[], const char *expr, const char *filename, char **r_value)
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()
bool PyC_RunString_AsStringAndSize(const char *imports[], const char *expr, const char *filename, char **r_value, size_t *r_value_size)
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)
void PyC_StdFilesFlush()
int PyC_ParseBool(PyObject *o, void *p)
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)
bool PyC_RunString_AsIntPtr(const char *imports[], const char *expr, const char *filename, intptr_t *r_value)
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 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)
PyObject * PyC_DefaultNameSpace(const char *filename) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
PyObject * PyC_Tuple_Pack_F32(const blender::Span< float > values)
PyObject * PyC_ExceptionBuffer() ATTR_WARN_UNUSED_RESULT 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)
int PyC_Long_AsBool(PyObject *value)
int PyC_FlagSet_ValueFromID_int(const PyC_FlagSet *item, const char *identifier, int *r_value)
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)
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)
PyObject * PyC_FlagSet_FromBitfield(PyC_FlagSet *items, int flag)
bool PyC_StructFmt_type_is_float_any(char format)
const char * identifier
const struct PyC_StringEnumItems * items
uint len
uint8_t flag
Definition wm_window.cc:139