Skip to content

Commit ce2459a

Browse files
committed
refactor npy_string_newsize to call npy_string_newemptysize
1 parent d7dffc2 commit ce2459a

File tree

1 file changed

+12
-36
lines changed

1 file changed

+12
-36
lines changed

stringdtype/stringdtype/src/static_string.c

Lines changed: 12 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -345,55 +345,27 @@ npy_string_newsize(const char *init, size_t size,
345345
npy_packed_static_string *to_init,
346346
npy_string_allocator *allocator)
347347
{
348-
if (size > NPY_MAX_STRING_SIZE) {
348+
if (npy_string_newemptysize(size, to_init, allocator) < 0) {
349349
return -1;
350350
}
351351

352-
_npy_static_string_u *to_init_u = ((_npy_static_string_u *)to_init);
353-
354-
unsigned char flags = VSTRING_FLAGS(to_init_u);
355-
356352
if (size == 0) {
357-
*to_init = *NPY_EMPTY_STRING;
358-
to_init_u->direct_buffer.flags_and_size |= flags;
359353
return 0;
360354
}
361355

362-
if (size > NPY_SHORT_STRING_MAX_SIZE) {
363-
int on_heap = 0;
364-
char *ret_buf =
365-
heap_or_arena_allocate(allocator, to_init_u, size, &on_heap);
366-
367-
if (ret_buf == NULL) {
368-
return -1;
369-
}
370-
371-
set_vstring_size(to_init_u, size);
356+
_npy_static_string_u *to_init_u = ((_npy_static_string_u *)to_init);
372357

373-
memcpy(ret_buf, init, size);
358+
char *buf = NULL;
374359

375-
if (on_heap) {
376-
to_init_u->vstring.offset = (size_t)ret_buf;
377-
}
378-
else {
379-
npy_string_arena *arena = &allocator->arena;
380-
if (arena == NULL) {
381-
return -1;
382-
}
383-
to_init_u->vstring.offset =
384-
(size_t)ret_buf - (size_t)arena->buffer;
385-
}
360+
if (size > NPY_SHORT_STRING_MAX_SIZE) {
361+
buf = vstring_buffer(&allocator->arena, to_init_u);
386362
}
387363
else {
388-
// Size can be no larger than 7 or 15, depending on CPU architecture.
389-
// In either case, the size data is in at most the least significant 4
390-
// bits of the byte so it's safe to | with one of 0x10, 0x20, 0x40, or
391-
// 0x80.
392-
to_init_u->direct_buffer.flags_and_size =
393-
NPY_STRING_SHORT | flags | size;
394-
memcpy(&(to_init_u->direct_buffer.buf), init, size);
364+
buf = to_init_u->direct_buffer.buf;
395365
}
396366

367+
memcpy(buf, init, size);
368+
397369
return 0;
398370
}
399371

@@ -437,6 +409,10 @@ npy_string_newemptysize(size_t size, npy_packed_static_string *out,
437409
set_vstring_size(out_u, size);
438410
}
439411
else {
412+
// Size can be no larger than 7 or 15, depending on CPU architecture.
413+
// In either case, the size data is in at most the least significant 4
414+
// bits of the byte so it's safe to | with one of 0x10, 0x20, 0x40, or
415+
// 0x80.
440416
out_u->direct_buffer.flags_and_size = NPY_STRING_SHORT | flags | size;
441417
}
442418

0 commit comments

Comments
 (0)