Fix Cycles Python error when device name is not a valid UTF-8 string
This may fix or help diagnose T76378.
This commit is contained in:
@@ -60,6 +60,12 @@ void *pylong_as_voidptr_typesafe(PyObject *object)
|
|||||||
return PyLong_AsVoidPtr(object);
|
return PyLong_AsVoidPtr(object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PyObject *pyunicode_from_string(const char *str)
|
||||||
|
{
|
||||||
|
/* Ignore errors if device API returns invalid UTF-8 strings. */
|
||||||
|
return PyUnicode_DecodeUTF8(str, strlen(str), "ignore");
|
||||||
|
}
|
||||||
|
|
||||||
/* Synchronize debug flags from a given Blender scene.
|
/* Synchronize debug flags from a given Blender scene.
|
||||||
* Return truth when device list needs invalidation.
|
* Return truth when device list needs invalidation.
|
||||||
*/
|
*/
|
||||||
@@ -429,9 +435,9 @@ static PyObject *available_devices_func(PyObject * /*self*/, PyObject *args)
|
|||||||
DeviceInfo &device = devices[i];
|
DeviceInfo &device = devices[i];
|
||||||
string type_name = Device::string_from_type(device.type);
|
string type_name = Device::string_from_type(device.type);
|
||||||
PyObject *device_tuple = PyTuple_New(3);
|
PyObject *device_tuple = PyTuple_New(3);
|
||||||
PyTuple_SET_ITEM(device_tuple, 0, PyUnicode_FromString(device.description.c_str()));
|
PyTuple_SET_ITEM(device_tuple, 0, pyunicode_from_string(device.description.c_str()));
|
||||||
PyTuple_SET_ITEM(device_tuple, 1, PyUnicode_FromString(type_name.c_str()));
|
PyTuple_SET_ITEM(device_tuple, 1, pyunicode_from_string(type_name.c_str()));
|
||||||
PyTuple_SET_ITEM(device_tuple, 2, PyUnicode_FromString(device.id.c_str()));
|
PyTuple_SET_ITEM(device_tuple, 2, pyunicode_from_string(device.id.c_str()));
|
||||||
PyTuple_SET_ITEM(ret, i, device_tuple);
|
PyTuple_SET_ITEM(ret, i, device_tuple);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -642,7 +648,7 @@ static PyObject *osl_compile_func(PyObject * /*self*/, PyObject *args)
|
|||||||
static PyObject *system_info_func(PyObject * /*self*/, PyObject * /*value*/)
|
static PyObject *system_info_func(PyObject * /*self*/, PyObject * /*value*/)
|
||||||
{
|
{
|
||||||
string system_info = Device::device_capabilities();
|
string system_info = Device::device_capabilities();
|
||||||
return PyUnicode_FromString(system_info.c_str());
|
return pyunicode_from_string(system_info.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WITH_OPENCL
|
#ifdef WITH_OPENCL
|
||||||
|
|||||||
Reference in New Issue
Block a user