PyAPI: add utilities PyTuple_SET_ITEMS, Py_INCREF_RET
Setting all values of a tuple is such a common operation that it deserves its own macro. Also added Py_INCREF_RET to avoid confusing use of comma operator.
This commit is contained in:
@@ -33,6 +33,9 @@
|
||||
|
||||
#include "BLI_utildefines.h"
|
||||
|
||||
#include "../generic/python_utildefines.h"
|
||||
|
||||
|
||||
PyDoc_STRVAR(py_blf_position_doc,
|
||||
".. function:: position(fontid, x, y, z)\n"
|
||||
"\n"
|
||||
@@ -183,8 +186,9 @@ static PyObject *py_blf_dimensions(PyObject *UNUSED(self), PyObject *args)
|
||||
BLF_width_and_height(fontid, text, INT_MAX, &r_width, &r_height);
|
||||
|
||||
ret = PyTuple_New(2);
|
||||
PyTuple_SET_ITEM(ret, 0, PyFloat_FromDouble(r_width));
|
||||
PyTuple_SET_ITEM(ret, 1, PyFloat_FromDouble(r_height));
|
||||
PyTuple_SET_ITEMS(ret,
|
||||
PyFloat_FromDouble(r_width),
|
||||
PyFloat_FromDouble(r_height));
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,16 +33,17 @@
|
||||
|
||||
#include "idprop_py_api.h"
|
||||
|
||||
|
||||
#include "BKE_idprop.h"
|
||||
|
||||
|
||||
#define USE_STRING_COERCE
|
||||
|
||||
#ifdef USE_STRING_COERCE
|
||||
#include "py_capi_utils.h"
|
||||
#endif
|
||||
|
||||
#include "../generic/python_utildefines.h"
|
||||
|
||||
|
||||
/*********************** ID Property Main Wrapper Stuff ***************/
|
||||
|
||||
/* ----------------------------------------------------------------------------
|
||||
@@ -746,10 +747,9 @@ static void BPy_IDGroup_CorrectListLen(IDProperty *prop, PyObject *seq, int len,
|
||||
|
||||
printf("%s: ID Property Error found and corrected!\n", func);
|
||||
|
||||
/*fill rest of list with valid references to None*/
|
||||
/* fill rest of list with valid references to None */
|
||||
for (j = len; j < prop->len; j++) {
|
||||
Py_INCREF(Py_None);
|
||||
PyList_SET_ITEM(seq, j, Py_None);
|
||||
PyList_SET_ITEM(seq, j, Py_INCREF_RET(Py_None));
|
||||
}
|
||||
|
||||
/*set correct group length*/
|
||||
@@ -808,8 +808,9 @@ PyObject *BPy_Wrap_GetItems(ID *id, IDProperty *prop)
|
||||
|
||||
for (i = 0, loop = prop->data.group.first; loop; loop = loop->next, i++) {
|
||||
PyObject *item = PyTuple_New(2);
|
||||
PyTuple_SET_ITEM(item, 0, PyUnicode_FromString(loop->name));
|
||||
PyTuple_SET_ITEM(item, 1, BPy_IDGroup_WrapData(id, loop, prop));
|
||||
PyTuple_SET_ITEMS(item,
|
||||
PyUnicode_FromString(loop->name),
|
||||
BPy_IDGroup_WrapData(id, loop, prop));
|
||||
PyList_SET_ITEM(seq, i, item);
|
||||
}
|
||||
|
||||
@@ -1406,8 +1407,9 @@ static PyObject *BPy_Group_Iter_Next(BPy_IDGroup_Iter *self)
|
||||
|
||||
if (self->mode == IDPROP_ITER_ITEMS) {
|
||||
ret = PyTuple_New(2);
|
||||
PyTuple_SET_ITEM(ret, 0, PyUnicode_FromString(cur->name));
|
||||
PyTuple_SET_ITEM(ret, 1, BPy_IDGroup_WrapData(self->group->id, cur, self->group->prop));
|
||||
PyTuple_SET_ITEMS(ret,
|
||||
PyUnicode_FromString(cur->name),
|
||||
BPy_IDGroup_WrapData(self->group->id, cur, self->group->prop));
|
||||
return ret;
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -37,6 +37,8 @@
|
||||
|
||||
#include "py_capi_utils.h"
|
||||
|
||||
#include "../generic/python_utildefines.h"
|
||||
|
||||
/* only for BLI_strncpy_wchar_from_utf8, should replace with py funcs but too late in release now */
|
||||
#include "BLI_string_utf8.h"
|
||||
|
||||
@@ -178,6 +180,17 @@ void PyC_Tuple_Fill(PyObject *tuple, PyObject *value)
|
||||
}
|
||||
}
|
||||
|
||||
void PyC_List_Fill(PyObject *list, PyObject *value)
|
||||
{
|
||||
unsigned int tot = PyList_GET_SIZE(list);
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < tot; i++) {
|
||||
PyList_SET_ITEM(list, i, value);
|
||||
Py_INCREF(value);
|
||||
}
|
||||
}
|
||||
|
||||
/* for debugging */
|
||||
void PyC_ObSpit(const char *name, PyObject *var)
|
||||
{
|
||||
@@ -664,8 +677,7 @@ void PyC_RunQuicky(const char *filepath, int n, ...)
|
||||
PyErr_Print();
|
||||
PyErr_Clear();
|
||||
|
||||
PyList_SET_ITEM(values, i, Py_None); /* hold user */
|
||||
Py_INCREF(Py_None);
|
||||
PyList_SET_ITEM(values, i, Py_INCREF_RET(Py_None)); /* hold user */
|
||||
|
||||
sizes[i] = 0;
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@ int PyC_AsArray(void *array, PyObject *value, const Py_ssize_t length,
|
||||
PyObject * PyC_FromArray(const void *array, int length, const PyTypeObject *type,
|
||||
const bool is_double, const char *error_prefix);
|
||||
void PyC_Tuple_Fill(PyObject *tuple, PyObject *value);
|
||||
void PyC_List_Fill(PyObject *list, PyObject *value);
|
||||
|
||||
/* follow http://www.python.org/dev/peps/pep-0383/ */
|
||||
PyObject * PyC_UnicodeFromByte(const char *str);
|
||||
|
||||
52
source/blender/python/generic/python_utildefines.h
Normal file
52
source/blender/python/generic/python_utildefines.h
Normal file
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
/** \file blender/python/generic/python_utildefines.h
|
||||
* \ingroup pygen
|
||||
* \brief header-only utilities
|
||||
* \note light addition to Python.h, use py_capi_utils.h for larger features.
|
||||
*/
|
||||
|
||||
#ifndef __PYTHON_UTILDEFINES_H__
|
||||
#define __PYTHON_UTILDEFINES_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define PyTuple_SET_ITEMS(op_arg, ...) \
|
||||
{ \
|
||||
PyTupleObject *op = (PyTupleObject *)op_arg; \
|
||||
PyObject **ob_items = op->ob_item; \
|
||||
CHECK_TYPE_ANY(op_arg, PyObject *, PyTupleObject *); \
|
||||
BLI_assert(_VA_NARGS_COUNT(__VA_ARGS__) == PyTuple_GET_SIZE(op)); \
|
||||
ARRAY_SET_ITEMS(ob_items, __VA_ARGS__); \
|
||||
} (void)0
|
||||
|
||||
/* wrap Py_INCREF & return the result,
|
||||
* use sparingly to avoid comma operator or temp var assignment */
|
||||
BLI_INLINE PyObject *Py_INCREF_RET(PyObject *op) { Py_INCREF(op); return op; }
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __PYTHON_UTILDEFINES_H__ */
|
||||
|
||||
Reference in New Issue
Block a user