Skip to content

Commit fa70b10

Browse files
committed
casting as per size
1 parent 0e97ae7 commit fa70b10

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

quaddtype/numpy_quaddtype/src/casts.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -327,25 +327,35 @@ quad_to_unicode_resolve_descriptors(PyObject *NPY_UNUSED(self), PyArray_DTypeMet
327327
PyArray_Descr *given_descrs[2], PyArray_Descr *loop_descrs[2],
328328
npy_intp *view_offset)
329329
{
330-
Py_INCREF(given_descrs[0]);
331-
loop_descrs[0] = given_descrs[0];
330+
npy_intp required_size_chars = QUAD_STR_WIDTH;
331+
npy_intp required_size_bytes = required_size_chars * 4; // UCS4 = 4 bytes per char
332332

333333
if (given_descrs[1] == NULL) {
334+
// Create descriptor with required size
334335
PyArray_Descr *unicode_descr = PyArray_DescrNewFromType(NPY_UNICODE);
335336
if (unicode_descr == nullptr) {
336337
return (NPY_CASTING)-1;
337338
}
338339

339-
unicode_descr->elsize = QUAD_STR_WIDTH * 4; // bytes
340+
unicode_descr->elsize = required_size_bytes;
340341
loop_descrs[1] = unicode_descr;
341342
}
342343
else {
343344
Py_INCREF(given_descrs[1]);
344345
loop_descrs[1] = given_descrs[1];
345346
}
346347

348+
// Set the input descriptor
349+
Py_INCREF(given_descrs[0]);
350+
loop_descrs[0] = given_descrs[0];
351+
347352
*view_offset = 0;
348-
return NPY_UNSAFE_CASTING;
353+
354+
// If target descriptor is wide enough, it's a safe cast
355+
if (loop_descrs[1]->elsize >= required_size_bytes) {
356+
return NPY_SAFE_CASTING;
357+
}
358+
return NPY_SAME_KIND_CASTING;
349359
}
350360

351361
// Helper function: Convert quad to string with adaptive notation

0 commit comments

Comments
 (0)