Blender V4.3
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
9#pragma once
10
11#include <string>
12
13#include "BLI_compiler_attrs.h"
14#include "BLI_span.hh"
15#include "BLI_sys_types.h"
17
19void PyC_ObSpit(const char *name, PyObject *var);
24void PyC_ObSpitStr(char *result, size_t result_maxncpy, PyObject *var);
25void PyC_LineSpit();
26void PyC_StackSpit();
27
45
46PyObject *PyC_Object_GetAttrStringArgs(PyObject *o, Py_ssize_t n, ...);
47PyObject *PyC_FrozenSetFromStrings(const char **strings);
48
56PyObject *PyC_Err_Format_Prefix(PyObject *exception_type_prefix, const char *format, ...);
57PyObject *PyC_Err_SetString_Prefix(PyObject *exception_type_prefix, const char *str);
58
63void PyC_Err_PrintWithFunc(PyObject *py_func);
64
65void PyC_FileAndNum(const char **r_filename, int *r_lineno);
66void PyC_FileAndNum_Safe(const char **r_filename, int *r_lineno); /* checks python is running */
67int PyC_AsArray_FAST(void *array,
68 size_t array_item_size,
69 PyObject *value_fast,
70 Py_ssize_t length,
71 const PyTypeObject *type,
72 const char *error_prefix);
73int PyC_AsArray(void *array,
74 size_t array_item_size,
75 PyObject *value,
76 Py_ssize_t length,
77 const PyTypeObject *type,
78 const char *error_prefix);
79
81 size_t array_item_size,
82 PyObject *value_fast,
83 const int *dims,
84 int dims_len,
85 const PyTypeObject *type,
86 const char *error_prefix);
87
88int PyC_AsArray_Multi(void *array,
89 size_t array_item_size,
90 PyObject *value,
91 const int *dims,
92 int dims_len,
93 const PyTypeObject *type,
94 const char *error_prefix);
95
96PyObject *PyC_Tuple_PackArray_F32(const float *array, uint len);
97PyObject *PyC_Tuple_PackArray_F64(const double *array, uint len);
98PyObject *PyC_Tuple_PackArray_I32(const int *array, uint len);
99PyObject *PyC_Tuple_PackArray_I32FromBool(const int *array, uint len);
100PyObject *PyC_Tuple_PackArray_Bool(const bool *array, uint len);
101
105PyObject *PyC_Tuple_PackArray_String(const char **array, uint len);
106
107PyObject *PyC_Tuple_PackArray_Multi_F32(const float *array, const int dims[], int dims_len);
108PyObject *PyC_Tuple_PackArray_Multi_F64(const double *array, const int dims[], int dims_len);
109PyObject *PyC_Tuple_PackArray_Multi_I32(const int *array, const int dims[], int dims_len);
110PyObject *PyC_Tuple_PackArray_Multi_Bool(const bool *array, const int dims[], int dims_len);
111
116void PyC_Tuple_Fill(PyObject *tuple, PyObject *value);
117void PyC_List_Fill(PyObject *list, PyObject *value);
118
124PyObject *PyC_UnicodeFromBytes(const char *str);
128PyObject *PyC_UnicodeFromBytesAndSize(const char *str, Py_ssize_t size);
129const char *PyC_UnicodeAsBytes(PyObject *py_str, PyObject **r_coerce); /* coerce must be NULL */
137const char *PyC_UnicodeAsBytesAndSize(PyObject *py_str, Py_ssize_t *r_size, PyObject **r_coerce);
138
146 PyObject *value_coerce;
147 const char *value;
148 Py_ssize_t value_len;
149};
150
161int PyC_ParseUnicodeAsBytesAndSize(PyObject *o, void *p);
163int PyC_ParseUnicodeAsBytesAndSize_OrNone(PyObject *o, void *p);
164
177PyObject *PyC_DefaultNameSpace(const char *filename) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT;
178void PyC_RunQuicky(const char *filepath, int n, ...) ATTR_NONNULL(1);
187bool PyC_NameSpace_ImportArray(PyObject *py_dict, const char *imports[]);
188
193void PyC_MainModule_Restore(PyObject *main_mod);
194
196
200void *PyC_RNA_AsPointer(PyObject *value, const char *type_name);
201
202/* flag / set --- interchange */
204 int value;
205 const char *identifier;
206};
207
208PyObject *PyC_FlagSet_AsString(const PyC_FlagSet *item);
209int PyC_FlagSet_ValueFromID_int(const PyC_FlagSet *item, const char *identifier, int *r_value);
211 const char *identifier,
212 int *r_value,
213 const char *error_prefix);
214int PyC_FlagSet_ToBitfield(const PyC_FlagSet *items,
215 PyObject *value,
216 int *r_value,
217 const char *error_prefix);
218PyObject *PyC_FlagSet_FromBitfield(PyC_FlagSet *items, int flag);
219
225bool PyC_RunString_AsNumber(const char **imports,
226 const char *expr,
227 const char *filename,
228 double *r_value) ATTR_NONNULL(2, 3, 4) ATTR_WARN_UNUSED_RESULT;
229bool PyC_RunString_AsIntPtr(const char **imports,
230 const char *expr,
231 const char *filename,
236bool PyC_RunString_AsStringAndSize(const char **imports,
237 const char *expr,
238 const char *filename,
239 char **r_value,
240 size_t *r_value_size)
242bool PyC_RunString_AsString(const char **imports,
243 const char *expr,
244 const char *filename,
245 char **r_value) ATTR_NONNULL(2, 3, 4) ATTR_WARN_UNUSED_RESULT;
246
250bool PyC_RunString_AsStringAndSizeOrNone(const char **imports,
251 const char *expr,
252 const char *filename,
253 char **r_value,
254 size_t *r_value_size)
256bool PyC_RunString_AsStringOrNone(const char **imports,
257 const char *expr,
258 const char *filename,
259 char **r_value) ATTR_NONNULL(2, 3, 4) ATTR_WARN_UNUSED_RESULT;
260
266int PyC_ParseBool(PyObject *o, void *p);
267
269 int value;
270 const char *id;
271};
276
280int PyC_ParseStringEnum(PyObject *o, void *p);
281const char *PyC_StringEnum_FindIDFromValue(const struct PyC_StringEnumItems *items, int value);
282
286int PyC_CheckArgs_DeepCopy(PyObject *args);
287
288/* Integer parsing (with overflow checks), -1 on error. */
314int PyC_Long_AsBool(PyObject *value);
315int8_t PyC_Long_AsI8(PyObject *value);
316int16_t PyC_Long_AsI16(PyObject *value);
317#if 0 /* inline */
318int32_t PyC_Long_AsI32(PyObject *value);
319int64_t PyC_Long_AsI64(PyObject *value);
320#endif
321
328uint8_t PyC_Long_AsU8(PyObject *value);
329uint16_t PyC_Long_AsU16(PyObject *value);
330uint32_t PyC_Long_AsU32(PyObject *value);
337uint64_t PyC_Long_AsU64(PyObject *value);
338
339/* inline so type signatures match as expected */
340Py_LOCAL_INLINE(int32_t) PyC_Long_AsI32(PyObject *value)
341{
342 return (int32_t)_PyLong_AsInt(value);
343}
344Py_LOCAL_INLINE(int64_t) PyC_Long_AsI64(PyObject *value)
345{
346 return (int64_t)PyLong_AsLongLong(value);
347}
348
349/* utils for format string in `struct` module style syntax */
350char PyC_StructFmt_type_from_str(const char *typestr);
355
359PyObject *PyC_UnicodeFromStdStr(const std::string &str);
360
361inline PyObject *PyC_Tuple_Pack_F32(const blender::Span<float> values)
362{
363 return PyC_Tuple_PackArray_F32(values.data(), values.size());
364}
365inline PyObject *PyC_Tuple_Pack_F64(const blender::Span<double> values)
366{
367 return PyC_Tuple_PackArray_F64(values.data(), values.size());
368}
369inline PyObject *PyC_Tuple_Pack_I32(const blender::Span<int> values)
370{
371 return PyC_Tuple_PackArray_I32(values.data(), values.size());
372}
373inline PyObject *PyC_Tuple_Pack_I32FromBool(const blender::Span<int> values)
374{
375 return PyC_Tuple_PackArray_I32FromBool(values.data(), values.size());
376}
377inline PyObject *PyC_Tuple_Pack_Bool(const blender::Span<bool> values)
378{
379 return PyC_Tuple_PackArray_Bool(values.data(), values.size());
380}
#define ATTR_RETURNS_NONNULL
#define ATTR_NONNULL(...)
unsigned int uint
int len
#define str(s)
format
int16_t PyC_Long_AsI16(PyObject *value)
const char * PyC_UnicodeAsBytesAndSize(PyObject *py_str, Py_ssize_t *r_size, PyObject **r_coerce)
int PyC_AsArray_FAST(void *array, size_t array_item_size, PyObject *value_fast, Py_ssize_t length, const PyTypeObject *type, const char *error_prefix)
PyObject * PyC_Tuple_PackArray_Multi_F64(const double *array, const int dims[], int dims_len)
PyObject * PyC_Tuple_PackArray_Bool(const bool *array, uint len)
char PyC_StructFmt_type_from_str(const char *typestr)
int PyC_AsArray_Multi_FAST(void *array, size_t array_item_size, PyObject *value_fast, const int *dims, int dims_len, const PyTypeObject *type, const char *error_prefix)
int PyC_AsArray(void *array, size_t array_item_size, PyObject *value, Py_ssize_t length, const PyTypeObject *type, const char *error_prefix)
PyObject * PyC_Err_SetString_Prefix(PyObject *exception_type_prefix, const char *str)
void PyC_LineSpit()
void * PyC_RNA_AsPointer(PyObject *value, const char *type_name)
PyObject * PyC_MainModule_Backup() ATTR_WARN_UNUSED_RESULT
PyObject * PyC_Tuple_PackArray_Multi_Bool(const bool *array, const int dims[], int dims_len)
bool PyC_StructFmt_type_is_bool(char format)
bool PyC_RunString_AsStringOrNone(const char **imports, const char *expr, const char *filename, char **r_value) ATTR_NONNULL(2
uint8_t PyC_Long_AsU8(PyObject *value)
PyObject * PyC_Tuple_Pack_I32(const blender::Span< int > values)
bool PyC_RunString_AsString(const char **imports, const char *expr, const char *filename, char **r_value) ATTR_NONNULL(2
PyObject * PyC_Err_Format_Prefix(PyObject *exception_type_prefix, const char *format,...)
void PyC_ObSpit(const char *name, PyObject *var)
bool ATTR_WARN_UNUSED_RESULT
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 PyC_RunString_AsIntPtr(const char **imports, const char *expr, const char *filename, intptr_t *r_value) ATTR_NONNULL(2
PyObject * PyC_UnicodeFromBytesAndSize(const char *str, Py_ssize_t size)
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_AsArray_Multi(void *array, size_t array_item_size, PyObject *value, const int *dims, int dims_len, const PyTypeObject *type, const char *error_prefix)
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)
PyObject * PyC_UnicodeFromBytes(const char *str)
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 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_Tuple_PackArray_String(const char **array, uint len)
int PyC_Long_AsBool(PyObject *value)
PyObject * PyC_ExceptionBuffer_Simple() ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL
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 PyC_IsInterpreterActive()
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)
void PyC_FileAndNum_Safe(const char **r_filename, int *r_lineno)
const char * PyC_StringEnum_FindIDFromValue(const struct PyC_StringEnumItems *items, int value)
bool PyC_RunString_AsStringAndSizeOrNone(const char **imports, const char *expr, const char *filename, char **r_value, size_t *r_value_size) ATTR_NONNULL(2
int PyC_ParseUnicodeAsBytesAndSize_OrNone(PyObject *o, void *p)
uint32_t PyC_Long_AsU32(PyObject *value)
bool PyC_NameSpace_ImportArray(PyObject *py_dict, const char *imports[])
void PyC_FileAndNum(const char **r_filename, int *r_lineno)
void PyC_StackSpit()
PyObject * PyC_Tuple_PackArray_Multi_F32(const float *array, const int dims[], int dims_len)
void PyC_List_Fill(PyObject *list, PyObject *value)
uint16_t PyC_Long_AsU16(PyObject *value)
PyObject * PyC_UnicodeFromStdStr(const std::string &str)
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)
int PyC_ParseBool(PyObject *o, void *p)
PyObject * PyC_FrozenSetFromStrings(const char **strings)
PyObject * PyC_Tuple_PackArray_Multi_I32(const int *array, const int dims[], int dims_len)
void PyC_Tuple_Fill(PyObject *tuple, PyObject *value)
PyObject * PyC_FlagSet_FromBitfield(PyC_FlagSet *items, int flag)
PyObject * PyC_Object_GetAttrStringArgs(PyObject *o, Py_ssize_t n,...)
bool PyC_StructFmt_type_is_float_any(char format)
const char * PyC_UnicodeAsBytes(PyObject *py_str, PyObject **r_coerce)
signed short int16_t
Definition stdint.h:76
unsigned short uint16_t
Definition stdint.h:79
unsigned int uint32_t
Definition stdint.h:80
__int64 int64_t
Definition stdint.h:89
_W64 int intptr_t
Definition stdint.h:118
signed int int32_t
Definition stdint.h:77
unsigned char uint8_t
Definition stdint.h:78
unsigned __int64 uint64_t
Definition stdint.h:90
signed char int8_t
Definition stdint.h:75
const char * identifier
const struct PyC_StringEnumItems * items
uint8_t flag
Definition wm_window.cc:138