Blender V4.3
py_capi_utils.cc File Reference
#include <Python.h>
#include <frameobject.h>
#include "BLI_utildefines.h"
#include "py_capi_utils.hh"
#include "python_utildefines.hh"
#include "MEM_guardedalloc.h"
#include "BLI_string.h"
#include "BLI_string_utf8.h"

Go to the source code of this file.

Macros

#define PY_SSIZE_T_CLEAN
 

Functions

Fast Python to C Array Conversion for Primitive Types
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)
 
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)
 
static int PyC_AsArray_Multi_impl (void **array_p, const size_t array_item_size, PyObject *value, const int *dims, const int dims_len, const PyTypeObject *type, const char *error_prefix)
 
static int PyC_AsArray_Multi_FAST_impl (void **array_p, const size_t array_item_size, PyObject *value_fast, const int *dims, const int dims_len, const PyTypeObject *type, const char *error_prefix)
 
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)
 
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)
 
Typed Tuple Packing
Note
See #PyC_Tuple_Pack_* macros that take multiple arguments.
PyObject * PyC_Tuple_PackArray_F32 (const float *array, uint len)
 
PyObject * PyC_Tuple_PackArray_F64 (const double *array, uint len)
 
PyObject * PyC_Tuple_PackArray_I32 (const int *array, uint len)
 
PyObject * PyC_Tuple_PackArray_I32FromBool (const int *array, uint len)
 
PyObject * PyC_Tuple_PackArray_Bool (const bool *array, uint len)
 
PyObject * PyC_Tuple_PackArray_String (const char **array, uint len)
 
Typed Tuple Packing (Multi-Dimensional)
static PyObject * PyC_Tuple_PackArray_Multi_F32_impl (const float **array_p, const int dims[], const int dims_len)
 
PyObject * PyC_Tuple_PackArray_Multi_F32 (const float *array, const int dims[], const int dims_len)
 
static PyObject * PyC_Tuple_PackArray_Multi_F64_impl (const double **array_p, const int dims[], const int dims_len)
 
PyObject * PyC_Tuple_PackArray_Multi_F64 (const double *array, const int dims[], const int dims_len)
 
static PyObject * PyC_Tuple_PackArray_Multi_I32_impl (const int **array_p, const int dims[], const int dims_len)
 
PyObject * PyC_Tuple_PackArray_Multi_I32 (const int *array, const int dims[], const int dims_len)
 
static PyObject * PyC_Tuple_PackArray_Multi_Bool_impl (const bool **array_p, const int dims[], const int dims_len)
 
PyObject * PyC_Tuple_PackArray_Multi_Bool (const bool *array, const int dims[], const int dims_len)
 
Tuple/List Filling
void PyC_Tuple_Fill (PyObject *tuple, PyObject *value)
 
void PyC_List_Fill (PyObject *list, PyObject *value)
 
Bool/Enum Argument Parsing
int PyC_ParseBool (PyObject *o, void *p)
 
int PyC_ParseStringEnum (PyObject *o, void *p)
 
const char * PyC_StringEnum_FindIDFromValue (const PyC_StringEnumItems *items, const int value)
 
int PyC_CheckArgs_DeepCopy (PyObject *args)
 
Simple Printing (for debugging)

These are useful to run directly from a debugger to be able to inspect the state.

void PyC_ObSpit (const char *name, PyObject *var)
 
void PyC_ObSpitStr (char *result, size_t result_maxncpy, PyObject *var)
 
void PyC_LineSpit ()
 
void PyC_StackSpit ()
 
Access Current Frame File Name & Line Number
void PyC_FileAndNum (const char **r_filename, int *r_lineno)
 
void PyC_FileAndNum_Safe (const char **r_filename, int *r_lineno)
 
Object Access Utilities
PyObject * PyC_Object_GetAttrStringArgs (PyObject *o, Py_ssize_t n,...)
 
Frozen Set Creation
PyObject * PyC_FrozenSetFromStrings (const char **strings)
 
Exception Utilities
PyObject * PyC_Err_Format_Prefix (PyObject *exception_type_prefix, const char *format,...)
 
PyObject * PyC_Err_SetString_Prefix (PyObject *exception_type_prefix, const char *str)
 
void PyC_Err_PrintWithFunc (PyObject *py_func)
 
Exception Buffer Access
static void pyc_exception_buffer_handle_system_exit ()
 
PyObject * PyC_ExceptionBuffer ()
 
PyObject * PyC_ExceptionBuffer_Simple ()
 
Unicode Conversion

In some cases we need to coerce strings, avoid doing this inline.

const char * PyC_UnicodeAsBytesAndSize (PyObject *py_str, Py_ssize_t *r_size, PyObject **r_coerce)
 
const char * PyC_UnicodeAsBytes (PyObject *py_str, PyObject **r_coerce)
 
PyObject * PyC_UnicodeFromBytesAndSize (const char *str, Py_ssize_t size)
 
PyObject * PyC_UnicodeFromBytes (const char *str)
 
PyObject * PyC_UnicodeFromStdStr (const std::string &str)
 
int PyC_ParseUnicodeAsBytesAndSize (PyObject *o, void *p)
 
int PyC_ParseUnicodeAsBytesAndSize_OrNone (PyObject *o, void *p)
 
Name Space Creation/Manipulation
PyObject * PyC_DefaultNameSpace (const char *filename)
 
bool PyC_NameSpace_ImportArray (PyObject *py_dict, const char *imports[])
 
PyObject * PyC_MainModule_Backup ()
 
void PyC_MainModule_Restore (PyObject *main_mod)
 
bool PyC_IsInterpreterActive ()
 
#Py_SetPythonHome Wrapper
void PyC_RunQuicky (const char *filepath, int n,...)
 
void * PyC_RNA_AsPointer (PyObject *value, const char *type_name)
 
Flag Set Utilities (#PyC_FlagSet)

Convert to/from Python set of strings to an int flag.

PyObject * PyC_FlagSet_AsString (const PyC_FlagSet *item)
 
int PyC_FlagSet_ValueFromID_int (const PyC_FlagSet *item, const char *identifier, int *r_value)
 
int PyC_FlagSet_ValueFromID (const PyC_FlagSet *item, const char *identifier, int *r_value, const char *error_prefix)
 
int PyC_FlagSet_ToBitfield (const PyC_FlagSet *items, PyObject *value, int *r_value, const char *error_prefix)
 
PyObject * PyC_FlagSet_FromBitfield (PyC_FlagSet *items, int flag)
 
Int Conversion
Note
Python doesn't provide overflow checks for specific bit-widths.
static ulong pyc_Long_AsUnsignedLong (PyObject *value)
 
int PyC_Long_AsBool (PyObject *value)
 
int8_t PyC_Long_AsI8 (PyObject *value)
 
int16_t PyC_Long_AsI16 (PyObject *value)
 
uint8_t PyC_Long_AsU8 (PyObject *value)
 
uint16_t PyC_Long_AsU16 (PyObject *value)
 
uint32_t PyC_Long_AsU32 (PyObject *value)
 
uint64_t PyC_Long_AsU64 (PyObject *value)
 
Py_buffer Utils
char PyC_StructFmt_type_from_str (const char *typestr)
 
bool PyC_StructFmt_type_is_float_any (char format)
 
bool PyC_StructFmt_type_is_int_any (char format)
 
bool PyC_StructFmt_type_is_byte (char format)
 
bool PyC_StructFmt_type_is_bool (char format)
 

Run String (Evaluate to Primitive Types)

static PyObject ATTR_WARN_UNUSED_RESULT
 
static PyObject * pyc_run_string_as_py_object (const char *imports[], const char *imports_star[], const char *expr, const char *filename) ATTR_NONNULL(3
 
bool PyC_RunString_AsNumber (const char *imports[], const char *expr, const char *filename, double *r_value)
 
bool PyC_RunString_AsIntPtr (const char *imports[], const char *expr, const char *filename, intptr_t *r_value)
 
bool PyC_RunString_AsStringAndSize (const char *imports[], const char *expr, const char *filename, char **r_value, size_t *r_value_size)
 
bool PyC_RunString_AsString (const char *imports[], const char *expr, const char *filename, char **r_value)
 
bool PyC_RunString_AsStringAndSizeOrNone (const char *imports[], const char *expr, const char *filename, char **r_value, size_t *r_value_size)
 
bool PyC_RunString_AsStringOrNone (const char *imports[], const char *expr, const char *filename, char **r_value)
 

Detailed Description

Extend upon CPython's API, filling in some gaps, these functions use PyC_ prefix to distinguish them apart from CPython.

Note
This module should only depend on CPython, however it currently uses BLI_string_utf8() for unicode conversion.

Definition in file py_capi_utils.cc.

Macro Definition Documentation

◆ PY_SSIZE_T_CLEAN

#define PY_SSIZE_T_CLEAN

Definition at line 17 of file py_capi_utils.cc.

Function Documentation

◆ PyC_AsArray()

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 )

◆ PyC_AsArray_FAST()

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 )

◆ PyC_AsArray_Multi()

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 )

Definition at line 288 of file py_capi_utils.cc.

References PyC_AsArray_Multi_impl().

Referenced by bpy_prop_array_from_py_with_dims().

◆ PyC_AsArray_Multi_FAST()

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 )

Definition at line 276 of file py_capi_utils.cc.

References PyC_AsArray_Multi_FAST_impl().

◆ PyC_AsArray_Multi_FAST_impl()

static int PyC_AsArray_Multi_FAST_impl ( void ** array_p,
const size_t array_item_size,
PyObject * value_fast,
const int * dims,
const int dims_len,
const PyTypeObject * type,
const char * error_prefix )
static

◆ PyC_AsArray_Multi_impl()

static int PyC_AsArray_Multi_impl ( void ** array_p,
const size_t array_item_size,
PyObject * value,
const int * dims,
const int dims_len,
const PyTypeObject * type,
const char * error_prefix )
static

Definition at line 255 of file py_capi_utils.cc.

References PyC_AsArray_Multi_FAST_impl(), and ret.

Referenced by PyC_AsArray_Multi(), and PyC_AsArray_Multi_FAST_impl().

◆ PyC_CheckArgs_DeepCopy()

int PyC_CheckArgs_DeepCopy ( PyObject * args)

Silly function, we don't use arg. just check its compatible with __deepcopy__.

Definition at line 558 of file py_capi_utils.cc.

Referenced by Color_deepcopy(), Euler_deepcopy(), Matrix_deepcopy(), py_imbuf_deepcopy(), Quaternion_deepcopy(), and Vector_deepcopy().

◆ PyC_DefaultNameSpace()

PyObject * PyC_DefaultNameSpace ( const char * filename)

Description: This function creates a new Python dictionary object. NOTE: dict is owned by sys.modules["__main__"] module, reference is borrowed NOTE: important we use the dict from main, this is what python expects for 'pickle' to work as well as strings like this...

‍foo = 10 print(import("__main__").foo)

NOTE: this overwrites main which gives problems with nested calls. be sure to run PyC_MainModule_Backup & PyC_MainModule_Restore if there is any chance that python is in the call stack.

Definition at line 1114 of file py_capi_utils.cc.

References PyC_UnicodeFromBytes().

Referenced by bpy_rna_uilayout_introspect(), bpy_run_string_impl(), pyc_run_string_as_py_object(), PyC_RunQuicky(), and python_script_exec().

◆ PyC_Err_Format_Prefix()

PyObject * PyC_Err_Format_Prefix ( PyObject * exception_type_prefix,
const char * format,
... )

Similar to #PyErr_Format(),

Implementation - we can't actually prepend the existing exception, because it could have any arguments given to it, so instead we get its __str__ output and raise our own exception including it.

Definition at line 784 of file py_capi_utils.cc.

Referenced by bpy_class_call(), PyC_Err_SetString_Prefix(), and pyrna_py_to_prop().

◆ PyC_Err_PrintWithFunc()

◆ PyC_Err_SetString_Prefix()

PyObject * PyC_Err_SetString_Prefix ( PyObject * exception_type_prefix,
const char * str )

Definition at line 830 of file py_capi_utils.cc.

References PyC_Err_Format_Prefix(), and str.

Referenced by bpy_app_debug_value_set().

◆ pyc_exception_buffer_handle_system_exit()

static void pyc_exception_buffer_handle_system_exit ( )
static

When a script calls sys.exit(..) it is expected that Blender quits, internally this raises as SystemExit exception which this function detects.

Historically Blender would call PyErr_Print when encountering an error. In some cases PyErr_Print is still called, but not all. When only PyC_ExceptionBuffer is used to access the error, it's not desirable that sys.exit() fails to exit, causing sys.exit(..) to arbitrarily work depending on the internals of Blender's error handling. To avoid this discrepancy, detect when PyErr_Print would exit and call it in that case. It's important to call PyErr_Print (instead of simply exiting), because the exception may contain a message which the user should see.

Note
No need to handle freeing resources here, Python's atexit is used to cleanup Blender's state when Python requests an exit (via bpy_atexit callback).

Definition at line 872 of file py_capi_utils.cc.

Referenced by PyC_ExceptionBuffer(), and PyC_ExceptionBuffer_Simple().

◆ PyC_ExceptionBuffer()

PyObject * PyC_ExceptionBuffer ( )

Return a string containing the full stack trace.

  • Only call when PyErr_Occurred() != 0 .
  • The exception is left in place without being manipulated, although they will be normalized in order to display them (PyErr_Print also does this).
  • SystemExit exceptions will exit (so sys.exit(..) works, matching PyErr_Print behavior).
  • The always returns a Python string (unless exiting where the function doesn't return).

Definition at line 898 of file py_capi_utils.cc.

References BLI_assert, pyc_exception_buffer_handle_system_exit(), result, and UNLIKELY.

Referenced by BPy_errors_to_report_ex(), pointer_type_from_py(), pyrna_py_to_prop(), and run_string_handle_error().

◆ PyC_ExceptionBuffer_Simple()

PyObject * PyC_ExceptionBuffer_Simple ( )

A version of PyC_ExceptionBuffer that returns the last exception only.

Useful for error messages from evaluating numeric expressions for e.g. where a full multi-line stack-trace isn't needed and doesn't format well in the status-bar.

Definition at line 958 of file py_capi_utils.cc.

References BLI_assert, pyc_exception_buffer_handle_system_exit(), result, and UNLIKELY.

Referenced by BPy_errors_to_report_ex(), and run_string_handle_error().

◆ PyC_FileAndNum()

void PyC_FileAndNum ( const char ** r_filename,
int * r_lineno )

Definition at line 658 of file py_capi_utils.cc.

References mod().

Referenced by BPy_errors_to_report_ex(), PyC_FileAndNum_Safe(), PyC_LineSpit(), and pyrna_func_call().

◆ PyC_FileAndNum_Safe()

void PyC_FileAndNum_Safe ( const char ** r_filename,
int * r_lineno )

Definition at line 712 of file py_capi_utils.cc.

References PyC_FileAndNum(), and PyC_IsInterpreterActive().

◆ PyC_FlagSet_AsString()

PyObject * PyC_FlagSet_AsString ( const PyC_FlagSet * item)

Definition at line 1380 of file py_capi_utils.cc.

References PyC_FlagSet::identifier.

Referenced by PyC_FlagSet_ValueFromID().

◆ PyC_FlagSet_FromBitfield()

PyObject * PyC_FlagSet_FromBitfield ( PyC_FlagSet * items,
int flag )

Definition at line 1464 of file py_capi_utils.cc.

References flag, PyC_FlagSet::identifier, ret, and PyC_FlagSet::value.

Referenced by bpy_bmesh_select_mode_get().

◆ PyC_FlagSet_ToBitfield()

int PyC_FlagSet_ToBitfield ( const PyC_FlagSet * items,
PyObject * value,
int * r_value,
const char * error_prefix )

◆ PyC_FlagSet_ValueFromID()

◆ PyC_FlagSet_ValueFromID_int()

int PyC_FlagSet_ValueFromID_int ( const PyC_FlagSet * item,
const char * identifier,
int * r_value )

Definition at line 1391 of file py_capi_utils.cc.

References PyC_FlagSet::identifier, STREQ, and PyC_FlagSet::value.

Referenced by PyC_FlagSet_ValueFromID().

◆ PyC_FrozenSetFromStrings()

PyObject * PyC_FrozenSetFromStrings ( const char ** strings)

Definition at line 762 of file py_capi_utils.cc.

References ret, and str.

Referenced by BPyInit__bpy_path().

◆ PyC_IsInterpreterActive()

◆ PyC_LineSpit()

void PyC_LineSpit ( )

Definition at line 620 of file py_capi_utils.cc.

References PyC_FileAndNum(), and PyC_IsInterpreterActive().

Referenced by _RNA_warning().

◆ PyC_List_Fill()

void PyC_List_Fill ( PyObject * list,
PyObject * value )

Definition at line 490 of file py_capi_utils.cc.

◆ PyC_Long_AsBool()

int PyC_Long_AsBool ( PyObject * value)

Comparison with #PyObject_IsTrue

Even though Python provides a way to retrieve the boolean value for an object, in many cases it's far too relaxed, with the following examples coercing values.

data.value = "Text" # True.
data.value = "" # False.
data.value = {1, 2} # True
data.value = {} # False.
data.value = None # False.

In practice this is often a mistake by the script author that doesn't behave as they expect. So it's better to be more strict for attribute assignment and function arguments, only accepting True/False 0/1.

If coercing a value is desired, it can be done explicitly: data.value = bool(value)

See also
PyC_ParseBool for use with #PyArg_ParseTuple and related functions.
Note
Don't use bool return type, so -1 can be used as an error value.

Definition at line 1725 of file py_capi_utils.cc.

References UNLIKELY.

Referenced by bpy_bm_elem_hflag_set(), bpy_bm_elem_hide_set(), bpy_bm_elem_select_set(), bpy_bmesh_select_flush(), bpy_bmloopuv_pin_uv_set(), bpy_bmloopuv_select_edge_set(), bpy_bmloopuv_select_set(), bpy_bmvertskin_flag_set(), BPy_IDArray_SetItem(), bpy_prop_boolean_get_fn(), bpy_slot_from_py(), foreach_getset(), idp_from_PyBool(), idp_from_PySequence_Fast(), idprop_ui_data_update_bool_default(), pyrna_array_contains_py(), and pyrna_py_to_prop_array_index().

◆ PyC_Long_AsI16()

int16_t PyC_Long_AsI16 ( PyObject * value)

Definition at line 1751 of file py_capi_utils.cc.

References INT16_MAX, and UNLIKELY.

Referenced by bpy_app_debug_value_set(), foreach_getset(), and PyC_AsArray_FAST().

◆ PyC_Long_AsI8()

int8_t PyC_Long_AsI8 ( PyObject * value)

Definition at line 1738 of file py_capi_utils.cc.

References INT8_MAX, and UNLIKELY.

Referenced by foreach_getset(), and PyC_AsArray_FAST().

◆ PyC_Long_AsU16()

uint16_t PyC_Long_AsU16 ( PyObject * value)

Definition at line 1782 of file py_capi_utils.cc.

References pyc_Long_AsUnsignedLong(), UINT16_MAX, and UNLIKELY.

Referenced by foreach_getset().

◆ PyC_Long_AsU32()

uint32_t PyC_Long_AsU32 ( PyObject * value)

◆ PyC_Long_AsU64()

uint64_t PyC_Long_AsU64 ( PyObject * value)

#PyLong_AsUnsignedLongLong, unlike #PyLong_AsLongLong, does not fall back to calling #PyNumber_Index when its argument is not a PyLongObject instance. To match parsing signed integer types with #PyLong_AsLongLong, this function performs the #PyNumber_Index fallback, if necessary, before calling #PyLong_AsUnsignedLongLong.

Definition at line 1808 of file py_capi_utils.cc.

Referenced by foreach_getset().

◆ PyC_Long_AsU8()

uint8_t PyC_Long_AsU8 ( PyObject * value)

Unlike Python's #PyLong_AsUnsignedLong and #PyLong_AsUnsignedLongLong, these unsigned integer parsing functions fall back to calling #PyNumber_Index when their argument is not a PyLongObject. This matches Python's signed integer parsing functions which also fall back to calling #PyNumber_Index.

Definition at line 1769 of file py_capi_utils.cc.

References pyc_Long_AsUnsignedLong(), UINT8_MAX, and UNLIKELY.

Referenced by foreach_getset().

◆ pyc_Long_AsUnsignedLong()

static ulong pyc_Long_AsUnsignedLong ( PyObject * value)
static

Definition at line 1703 of file py_capi_utils.cc.

Referenced by PyC_Long_AsU16(), PyC_Long_AsU32(), and PyC_Long_AsU8().

◆ PyC_MainModule_Backup()

PyObject * PyC_MainModule_Backup ( )

◆ PyC_MainModule_Restore()

void PyC_MainModule_Restore ( PyObject * main_mod)

◆ PyC_NameSpace_ImportArray()

bool PyC_NameSpace_ImportArray ( PyObject * py_dict,
const char * imports[] )

Import imports into py_dict.

Parameters
py_dictA Python dictionary, typically used as a name-space for script execution.
importsA NULL terminated array of strings.
Returns
true when all modules import without errors, otherwise return false. The caller is expected to handle the exception.

Definition at line 1132 of file py_capi_utils.cc.

References mod().

Referenced by bpy_run_string_impl(), and pyc_run_string_as_py_object().

◆ PyC_Object_GetAttrStringArgs()

PyObject * PyC_Object_GetAttrStringArgs ( PyObject * o,
Py_ssize_t n,
... )

Definition at line 727 of file py_capi_utils.cc.

◆ PyC_ObSpit()

void PyC_ObSpit ( const char * name,
PyObject * var )

Useful to print Python objects while debugging.

Definition at line 574 of file py_capi_utils.cc.

Referenced by bpy_class_free(), PyC_RunQuicky(), and pyrna_subtype_set_rna().

◆ PyC_ObSpitStr()

void PyC_ObSpitStr ( char * result,
size_t result_maxncpy,
PyObject * var )

A version of PyC_ObSpit that writes into a string (and doesn't take a name argument). Use for logging.

Definition at line 592 of file py_capi_utils.cc.

References BLI_snprintf().

Referenced by pyrna_srna_ExternalType().

◆ PyC_ParseBool()

◆ PyC_ParseStringEnum()

◆ PyC_ParseUnicodeAsBytesAndSize()

int PyC_ParseUnicodeAsBytesAndSize ( PyObject * o,
void * p )

Use with PyArg_ParseTuple's "O&" formatting.

Expose PyC_UnicodeAsBytes in a way which is useful to the argument parser.

Parameters
oAn argument parsed to PyC_UnicodeAsBytes.
pPointer to #PyC_UnicodeAsBytes_Data.
Note
The Python API docs reference PyUnicode_FSConverter however this does not support paths which non utf-8 encoding, see: #111033.

Definition at line 1078 of file py_capi_utils.cc.

References BLI_assert, PyC_UnicodeAsBytesAndSize(), and UNLIKELY.

Referenced by bpy_app_icons_new_triangles_from_file(), bpy_lib_load(), bpy_lib_write(), bpy_system_resource(), bpy_user_resource(), bpy_utils_previews_load(), M_imbuf_load(), py_blf_load(), py_blf_unload(), and PyC_ParseUnicodeAsBytesAndSize_OrNone().

◆ PyC_ParseUnicodeAsBytesAndSize_OrNone()

int PyC_ParseUnicodeAsBytesAndSize_OrNone ( PyObject * o,
void * p )

A version of PyC_ParseUnicodeAsBytesAndSize that accepts None.

Definition at line 1097 of file py_capi_utils.cc.

References BLI_assert, PyC_ParseUnicodeAsBytesAndSize(), and UNUSED_VARS_NDEBUG.

Referenced by bpy_rna_data_temp_data(), and M_imbuf_write().

◆ PyC_RNA_AsPointer()

void * PyC_RNA_AsPointer ( PyObject * value,
const char * type_name )

◆ pyc_run_string_as_py_object()

static PyObject * pyc_run_string_as_py_object ( const char * imports[],
const char * imports_star[],
const char * expr,
const char * filename )
static

◆ PyC_RunQuicky()

void PyC_RunQuicky ( const char * filepath,
int n,
... )

Definition at line 1188 of file py_capi_utils.cc.

References printf, ptr, PyC_DefaultNameSpace(), PyC_ObSpit(), and ret.

◆ PyC_RunString_AsIntPtr()

bool PyC_RunString_AsIntPtr ( const char * imports[],
const char * expr,
const char * filename,
intptr_t * r_value )

Definition at line 1574 of file py_capi_utils.cc.

References BLI_assert, and pyc_run_string_as_py_object().

Referenced by BPY_run_string_as_intptr().

◆ PyC_RunString_AsNumber()

bool PyC_RunString_AsNumber ( const char * imports[],
const char * expr,
const char * filename,
double * r_value )

Definition at line 1528 of file py_capi_utils.cc.

References BLI_assert, and pyc_run_string_as_py_object().

Referenced by BPY_run_string_as_number(), and bpyunits_to_value().

◆ PyC_RunString_AsString()

bool PyC_RunString_AsString ( const char * imports[],
const char * expr,
const char * filename,
char ** r_value )

Definition at line 1628 of file py_capi_utils.cc.

References PyC_RunString_AsStringAndSize().

◆ PyC_RunString_AsStringAndSize()

bool PyC_RunString_AsStringAndSize ( const char * imports[],
const char * expr,
const char * filename,
char ** r_value,
size_t * r_value_size )

◆ PyC_RunString_AsStringAndSizeOrNone()

bool PyC_RunString_AsStringAndSizeOrNone ( const char * imports[],
const char * expr,
const char * filename,
char ** r_value,
size_t * r_value_size )

◆ PyC_RunString_AsStringOrNone()

bool PyC_RunString_AsStringOrNone ( const char * imports[],
const char * expr,
const char * filename,
char ** r_value )

Definition at line 1673 of file py_capi_utils.cc.

References PyC_RunString_AsStringAndSizeOrNone().

◆ PyC_StackSpit()

void PyC_StackSpit ( )

Definition at line 638 of file py_capi_utils.cc.

References PyC_IsInterpreterActive().

◆ PyC_StringEnum_FindIDFromValue()

const char * PyC_StringEnum_FindIDFromValue ( const PyC_StringEnumItems * items,
const int value )

◆ PyC_StructFmt_type_from_str()

char PyC_StructFmt_type_from_str ( const char * typestr)

◆ PyC_StructFmt_type_is_bool()

bool PyC_StructFmt_type_is_bool ( char format)

Definition at line 1901 of file py_capi_utils.cc.

◆ PyC_StructFmt_type_is_byte()

bool PyC_StructFmt_type_is_byte ( char format)

Definition at line 1889 of file py_capi_utils.cc.

Referenced by gl_buffer_type_from_py_buffer().

◆ PyC_StructFmt_type_is_float_any()

bool PyC_StructFmt_type_is_float_any ( char format)

◆ PyC_StructFmt_type_is_int_any()

bool PyC_StructFmt_type_is_int_any ( char format)

◆ PyC_Tuple_Fill()

void PyC_Tuple_Fill ( PyObject * tuple,
PyObject * value )

Caller needs to ensure tuple is uninitialized. Handy for filling a tuple with None for eg.

Definition at line 479 of file py_capi_utils.cc.

Referenced by kdtree_nearest_to_py_and_check(), py_bvhtree_nearest_to_py_none(), and py_bvhtree_raycast_to_py_none().

◆ PyC_Tuple_PackArray_Bool()

PyObject * PyC_Tuple_PackArray_Bool ( const bool * array,
uint len )

◆ PyC_Tuple_PackArray_F32()

PyObject * PyC_Tuple_PackArray_F32 ( const float * array,
uint len )

◆ PyC_Tuple_PackArray_F64()

PyObject * PyC_Tuple_PackArray_F64 ( const double * array,
uint len )

Definition at line 318 of file py_capi_utils.cc.

References len.

Referenced by PyC_Tuple_Pack_F64(), and PyC_Tuple_PackArray_Multi_F64_impl().

◆ PyC_Tuple_PackArray_I32()

PyObject * PyC_Tuple_PackArray_I32 ( const int * array,
uint len )

◆ PyC_Tuple_PackArray_I32FromBool()

PyObject * PyC_Tuple_PackArray_I32FromBool ( const int * array,
uint len )

Definition at line 336 of file py_capi_utils.cc.

References len.

Referenced by PyC_Tuple_Pack_I32FromBool().

◆ PyC_Tuple_PackArray_Multi_Bool()

PyObject * PyC_Tuple_PackArray_Multi_Bool ( const bool * array,
const int dims[],
const int dims_len )

Definition at line 468 of file py_capi_utils.cc.

References PyC_Tuple_PackArray_Multi_Bool_impl().

Referenced by bpy_prop_boolean_array_set_fn().

◆ PyC_Tuple_PackArray_Multi_Bool_impl()

static PyObject * PyC_Tuple_PackArray_Multi_Bool_impl ( const bool ** array_p,
const int dims[],
const int dims_len )
static

◆ PyC_Tuple_PackArray_Multi_F32()

PyObject * PyC_Tuple_PackArray_Multi_F32 ( const float * array,
const int dims[],
const int dims_len )

Definition at line 396 of file py_capi_utils.cc.

References PyC_Tuple_PackArray_Multi_F32_impl().

Referenced by bpy_prop_float_array_set_fn().

◆ PyC_Tuple_PackArray_Multi_F32_impl()

static PyObject * PyC_Tuple_PackArray_Multi_F32_impl ( const float ** array_p,
const int dims[],
const int dims_len )
static

◆ PyC_Tuple_PackArray_Multi_F64()

PyObject * PyC_Tuple_PackArray_Multi_F64 ( const double * array,
const int dims[],
const int dims_len )

Definition at line 420 of file py_capi_utils.cc.

References PyC_Tuple_PackArray_Multi_F64_impl().

◆ PyC_Tuple_PackArray_Multi_F64_impl()

static PyObject * PyC_Tuple_PackArray_Multi_F64_impl ( const double ** array_p,
const int dims[],
const int dims_len )
static

◆ PyC_Tuple_PackArray_Multi_I32()

PyObject * PyC_Tuple_PackArray_Multi_I32 ( const int * array,
const int dims[],
const int dims_len )

Definition at line 444 of file py_capi_utils.cc.

References PyC_Tuple_PackArray_Multi_I32_impl().

Referenced by bpy_prop_int_array_set_fn().

◆ PyC_Tuple_PackArray_Multi_I32_impl()

static PyObject * PyC_Tuple_PackArray_Multi_I32_impl ( const int ** array_p,
const int dims[],
const int dims_len )
static

◆ PyC_Tuple_PackArray_String()

PyObject * PyC_Tuple_PackArray_String ( const char ** array,
uint len )
Note
Any errors converting strings will return null with the error left as-is.

Definition at line 354 of file py_capi_utils.cc.

References len.

Referenced by bpy_app_python_args_get().

◆ PyC_UnicodeAsBytes()

const char * PyC_UnicodeAsBytes ( PyObject * py_str,
PyObject ** r_coerce )

◆ PyC_UnicodeAsBytesAndSize()

const char * PyC_UnicodeAsBytesAndSize ( PyObject * py_str,
Py_ssize_t * r_size,
PyObject ** r_coerce )

String conversion, escape non-unicode chars

Parameters
r_sizeThe string length (not including the null terminator).
Note
By convention Blender API's use len/length however Python API's use the term size, as this is an alternative to Python's #PyUnicode_AsUTF8AndSize, follow it's naming.
Parameters
r_coercemust reference a pointer set to NULL.

Definition at line 1001 of file py_capi_utils.cc.

References result.

Referenced by idp_from_PyUnicode(), and PyC_ParseUnicodeAsBytesAndSize().

◆ PyC_UnicodeFromBytes()

PyObject * PyC_UnicodeFromBytes ( const char * str)

◆ PyC_UnicodeFromBytesAndSize()

PyObject * PyC_UnicodeFromBytesAndSize ( const char * str,
Py_ssize_t size )
Parameters
sizeThe length of the string: strlen(str).

Definition at line 1053 of file py_capi_utils.cc.

References result, and str.

Referenced by idprop_py_from_idp_string(), PyC_UnicodeFromBytes(), PyC_UnicodeFromStdStr(), pyrna_param_to_py(), pyrna_prop_to_py(), and pyrna_WindowManager_clipboard_get().

◆ PyC_UnicodeFromStdStr()

PyObject * PyC_UnicodeFromStdStr ( const std::string & str)

Variable Documentation

◆ ATTR_WARN_UNUSED_RESULT

PyObject ATTR_WARN_UNUSED_RESULT

Definition at line 1490 of file py_capi_utils.cc.