@@ -27,7 +27,7 @@ extern "C" {
2727#include " dragon4.h"
2828#include " ops.hpp"
2929
30- #define NUM_CASTS 40 // 17 to_casts + 17 from_casts + 1 quad_to_quad + 1 void_to_quad + 2 StringDType
30+ #define NUM_CASTS 40 // 18 to_casts + 18 from_casts + 1 quad_to_quad + 1 void_to_quad
3131#define QUAD_STR_WIDTH 50 // 42 is enough for scientific notation float128, just keeping some buffer
3232
3333static NPY_CASTING
@@ -673,41 +673,12 @@ stringdtype_to_quad_strided_loop(PyArrayMethod_Context *context, char *const dat
673673 }
674674 }
675675
676- char *temp_str = (char *)malloc (s.size + 1 );
677- if (temp_str == NULL ) {
678- NpyString_release_allocator (allocator);
679- PyErr_NoMemory ();
680- return -1 ;
681- }
682- memcpy (temp_str, s.buf , s.size );
683- temp_str[s.size ] = ' \0 ' ;
684-
685- char *endptr;
686676 quad_value out_val;
687- int err = NumPyOS_ascii_strtoq (temp_str, backend, &out_val, &endptr);
688-
689- if (err < 0 ) {
690- PyErr_Format (PyExc_ValueError,
691- " could not convert string to QuadPrecision: '%s'" , temp_str);
692- free (temp_str);
677+ if (bytes_to_quad_convert (s.buf , s.size , backend, &out_val) < 0 ) {
693678 NpyString_release_allocator (allocator);
694679 return -1 ;
695680 }
696681
697- while (ascii_isspace (*endptr)) {
698- endptr++;
699- }
700-
701- if (*endptr != ' \0 ' ) {
702- PyErr_Format (PyExc_ValueError,
703- " could not convert string to QuadPrecision: '%s'" , temp_str);
704- free (temp_str);
705- NpyString_release_allocator (allocator);
706- return -1 ;
707- }
708-
709- free (temp_str);
710-
711682 store_quad<Aligned>(out_ptr, out_val, backend);
712683
713684 in_ptr += in_stride;
@@ -728,29 +699,9 @@ quad_to_stringdtype_resolve_descriptors(PyObject *NPY_UNUSED(self), PyArray_DTyp
728699 loop_descrs[0 ] = given_descrs[0 ];
729700
730701 if (given_descrs[1 ] == NULL ) {
731- PyObject *args = PyTuple_New (0 );
732- if (args == NULL ) {
733- Py_DECREF (loop_descrs[0 ]);
734- return (NPY_CASTING )-1 ;
735- }
736- PyObject *kwargs = PyDict_New ();
737- if (kwargs == NULL ) {
738- Py_DECREF (args);
739- Py_DECREF (loop_descrs[0 ]);
740- return (NPY_CASTING )-1 ;
741- }
742- if (PyDict_SetItemString (kwargs, " coerce" , Py_True) < 0 ) {
743- Py_DECREF (args);
744- Py_DECREF (kwargs);
745- Py_DECREF (loop_descrs[0 ]);
746- return (NPY_CASTING )-1 ;
747- }
748-
749- loop_descrs[1 ] = (PyArray_Descr *)PyObject_Call (
750- (PyObject *)&PyArray_StringDType, args, kwargs);
751- Py_DECREF (args);
752- Py_DECREF (kwargs);
753-
702+ // Default StringDType() already has coerce=True
703+ loop_descrs[1 ] = (PyArray_Descr *)PyObject_CallNoArgs (
704+ (PyObject *)&PyArray_StringDType);
754705 if (loop_descrs[1 ] == NULL ) {
755706 Py_DECREF (loop_descrs[0 ]);
756707 return (NPY_CASTING )-1 ;
0 commit comments