提交 5062d3e4 authored 作者: ricardoV94's avatar ricardoV94 提交者: Ricardo Vieira

Fix unboxing of numpy boolean Scalars in C-backend

上级 7cd524ca
......@@ -484,20 +484,32 @@ class ScalarType(CType, HasDataType, HasShape):
def c_sync(self, name, sub):
specs = self.dtype_specs()
fail = sub["fail"]
dtype = specs[1]
cls = specs[2]
(np_dtype, _c_dtype, _cls_name) = specs
np_dtype_num = np.dtype(np_dtype).num
return f"""
Py_XDECREF(py_{name});
py_{name} = PyArrayScalar_New({cls});
PyArray_Descr* {name}_descr = PyArray_DescrFromType({np_dtype_num}); // {np_dtype}
if (!{name}_descr) {{
PyErr_Format(PyExc_RuntimeError, "Could not get descriptor for {np_dtype_num}={np_dtype}");
{fail}
}}
// PyArray_Scalar creates a new scalar object by copying data from the pointer &{name}
py_{name} = PyArray_Scalar(&{name}, {name}_descr, NULL);
// Clean up the descriptor reference (PyArray_DescrFromType returns a new ref)
Py_DECREF({name}_descr);
if (!py_{name})
{{
Py_XINCREF(Py_None);
py_{name} = Py_None;
PyErr_Format(PyExc_MemoryError,
"Instantiation of new Python scalar failed ({dtype})");
"Instantiation of new Python NumPy scalar failed ({np_dtype_num}={np_dtype})");
{fail}
}}
PyArrayScalar_ASSIGN(py_{name}, {cls}, {name});
"""
def c_cleanup(self, name, sub):
......@@ -731,7 +743,7 @@ class ScalarType(CType, HasDataType, HasShape):
return ["import_array();"]
def c_code_cache_version(self):
return (14, np.__version__)
return (15, np.__version__)
def get_shape_info(self, obj):
return obj.itemsize
......
......@@ -254,11 +254,6 @@ class Convolve2d(AbstractConvolveNd, Op): # type: ignore[misc]
def perform(self, node, inputs, outputs):
in1, in2, full_mode = inputs
if isinstance(full_mode, np.bool):
# Patch for wrong unboxing of bool scalars in C backend
# Conditional, because numba will produce a bool, not np.bool_
full_mode = full_mode.item()
mode = "full" if full_mode else "valid"
outputs[0][0] = scipy_convolve(in1, in2, mode=mode, method=self.method)
......
......@@ -2221,6 +2221,13 @@ def test_ScalarFromTensor(cast_policy):
scalar_from_tensor(vector())
def test_bool_scalar_from_tensor():
x = scalar("x", dtype="bool")
fn = function([x], scalar_from_tensor(x))
assert fn(np.array(True, dtype=bool))
assert not fn(np.array(False, dtype=bool))
def test_op_cache():
# TODO: What is this actually testing?
# trigger bug in ticket #162
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论