Skip to content

Commit 0703921

Browse files
committed
use the bytes_to_quad helper
1 parent 970b62c commit 0703921

1 file changed

Lines changed: 5 additions & 54 deletions

File tree

quaddtype/numpy_quaddtype/src/casts.cpp

Lines changed: 5 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -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

3333
static 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

Comments
 (0)