Cleanup: reduce number of calls to PyUnicode_FromString

This commit is contained in:
Campbell Barton 2023-08-11 09:58:44 +10:00
parent 9810942adf
commit 3af7ed0e8e
3 changed files with 53 additions and 38 deletions

View File

@ -1739,21 +1739,30 @@ PyDoc_STRVAR(BPy_IDArray_get_typecode_doc,
"The type of the data in the array {'f': float, 'd': double, 'i': int, 'b': bool}.");
static PyObject *BPy_IDArray_get_typecode(BPy_IDArray *self, void * /*closure*/)
{
const char *typecode;
switch (self->prop->subtype) {
case IDP_FLOAT:
return PyUnicode_FromString("f");
typecode = "f";
break;
case IDP_DOUBLE:
return PyUnicode_FromString("d");
typecode = "d";
break;
case IDP_INT:
return PyUnicode_FromString("i");
typecode = "i";
break;
case IDP_BOOLEAN:
return PyUnicode_FromString("b");
typecode = "b";
break;
default: {
PyErr_Format(PyExc_RuntimeError,
"%s: invalid/corrupt array type '%d'!",
__func__,
self->prop->subtype);
return nullptr;
}
}
PyErr_Format(
PyExc_RuntimeError, "%s: invalid/corrupt array type '%d'!", __func__, self->prop->subtype);
return nullptr;
return PyUnicode_FromString(typecode);
}
static PyGetSetDef BPy_IDArray_getseters[] = {

View File

@ -37,16 +37,9 @@
static bool args_contain_key(PyObject *kwargs, const char *name)
{
if (kwargs == nullptr) {
/* When a function gets called without any kwargs, Python just passes nullptr instead.
* PyDict_Contains() is not nullptr-safe, though. */
return false;
}
PyObject *py_key = PyUnicode_FromString(name);
const bool result = PyDict_Contains(kwargs, py_key) == 1;
Py_DECREF(py_key);
return result;
/* When a function gets called without any kwargs, */
/* Python just passes nullptr instead. #PyDict_GetItemString() is not null-safe, though. */
return kwargs && PyDict_GetItemString(kwargs, name) != nullptr;
}
/**

View File

@ -69,22 +69,26 @@ PyDoc_STRVAR(
" :rtype: str\n");
static PyObject *pygpu_platform_device_type_get(PyObject * /*self*/)
{
const char *device;
if (GPU_type_matches(GPU_DEVICE_APPLE, GPU_OS_ANY, GPU_DRIVER_ANY)) {
return PyUnicode_FromString("APPLE");
device = "APPLE";
}
if (GPU_type_matches(GPU_DEVICE_NVIDIA, GPU_OS_ANY, GPU_DRIVER_ANY)) {
return PyUnicode_FromString("NVIDIA");
else if (GPU_type_matches(GPU_DEVICE_NVIDIA, GPU_OS_ANY, GPU_DRIVER_ANY)) {
device = "NVIDIA";
}
if (GPU_type_matches(GPU_DEVICE_ATI, GPU_OS_ANY, GPU_DRIVER_ANY)) {
return PyUnicode_FromString("AMD");
else if (GPU_type_matches(GPU_DEVICE_ATI, GPU_OS_ANY, GPU_DRIVER_ANY)) {
device = "AMD";
}
if (GPU_type_matches(GPU_DEVICE_INTEL | GPU_DEVICE_INTEL_UHD, GPU_OS_ANY, GPU_DRIVER_ANY)) {
return PyUnicode_FromString("INTEL");
else if (GPU_type_matches(GPU_DEVICE_INTEL | GPU_DEVICE_INTEL_UHD, GPU_OS_ANY, GPU_DRIVER_ANY)) {
device = "INTEL";
}
if (GPU_type_matches(GPU_DEVICE_SOFTWARE, GPU_OS_ANY, GPU_DRIVER_ANY)) {
return PyUnicode_FromString("SOFTWARE");
else if (GPU_type_matches(GPU_DEVICE_SOFTWARE, GPU_OS_ANY, GPU_DRIVER_ANY)) {
device = "SOFTWARE";
}
return PyUnicode_FromString("UNKNOWN");
else {
device = "UNKNOWN";
}
return PyUnicode_FromString(device);
}
PyDoc_STRVAR(pygpu_platform_backend_type_get_doc,
@ -96,19 +100,28 @@ PyDoc_STRVAR(pygpu_platform_backend_type_get_doc,
" :rtype: str\n");
static PyObject *pygpu_platform_backend_type_get(PyObject * /*self*/)
{
const char *backend = "UNKNOWN";
switch (GPU_backend_get_type()) {
case GPU_BACKEND_VULKAN:
return PyUnicode_FromString("VULKAN");
case GPU_BACKEND_METAL:
return PyUnicode_FromString("METAL");
case GPU_BACKEND_NONE:
return PyUnicode_FromString("NONE");
case GPU_BACKEND_OPENGL:
return PyUnicode_FromString("OPENGL");
case GPU_BACKEND_VULKAN: {
backend = "VULKAN";
break;
}
case GPU_BACKEND_METAL: {
backend = "METAL";
break;
}
case GPU_BACKEND_NONE: {
backend = "NONE";
break;
}
case GPU_BACKEND_OPENGL: {
backend = "OPENGL";
break;
}
case GPU_BACKEND_ANY:
break;
}
return PyUnicode_FromString("UNKNOWN");
return PyUnicode_FromString(backend);
}
/** \} */