Skip to content

Commit c6ec9bc

Browse files
committed
no heap alloc
1 parent f6adeda commit c6ec9bc

1 file changed

Lines changed: 15 additions & 11 deletions

File tree

quaddtype/numpy_quaddtype/src/casts.cpp

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -414,27 +414,31 @@ static inline int
414414
quad_to_string_same_value_check(const quad_value *in_val, const char *str_buf, npy_intp str_len,
415415
QuadBackendType backend)
416416
{
417-
char *truncated_str = (char *)malloc(str_len + 1);
418-
if (truncated_str == NULL) {
419-
PyErr_NoMemory();
420-
return -1;
417+
// str_len will never exceed QUAD_STR_WIDTH (50).
418+
char stack_buf[QUAD_STR_WIDTH + 1];
419+
const char *parse_str;
420+
421+
if (str_buf[str_len] == '\0') {
422+
// String already properly terminated at str_len, use directly
423+
parse_str = str_buf;
424+
}
425+
else {
426+
// truncated string check
427+
memcpy(stack_buf, str_buf, str_len);
428+
stack_buf[str_len] = '\0';
429+
parse_str = stack_buf;
421430
}
422-
memcpy(truncated_str, str_buf, str_len);
423-
truncated_str[str_len] = '\0';
424431

425-
// Parse the truncated string back to quad
426432
quad_value roundtrip;
427433
char *endptr;
428434

429-
int err = NumPyOS_ascii_strtoq(truncated_str, backend, &roundtrip, &endptr);
435+
int err = NumPyOS_ascii_strtoq(parse_str, backend, &roundtrip, &endptr);
430436
if (err < 0) {
431437
PyErr_Format(PyExc_ValueError,
432438
"QuadPrecision value cannot be represented exactly: string '%s' failed to parse back",
433-
truncated_str);
434-
free(truncated_str);
439+
parse_str);
435440
return -1;
436441
}
437-
free(truncated_str);
438442

439443
// Compare original and roundtripped values along with signbit
440444
if (backend == BACKEND_SLEEF) {

0 commit comments

Comments
 (0)