@@ -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