diff options
author | Kenta Murata <mrkn@mrkn.jp> | 2020-12-07 00:32:29 +0900 |
---|---|---|
committer | Kenta Murata <mrkn@mrkn.jp> | 2020-12-07 00:38:19 +0900 |
commit | 60eabb1aa7d1d8ab83c49916bd8c3536daf5d03b (patch) | |
tree | 3555a0290a26c28e5a069dbbd8f0248d6ba31a38 /memory_view.c | |
parent | f9fd99e601377b114e924fc1697f18098b520fdf (diff) | |
download | ruby-60eabb1aa7d1d8ab83c49916bd8c3536daf5d03b.tar.gz |
Revert "memory_view.c: Add rb_memory_view_extract_item_members"
This reverts the following three commits.
- ce707079c153f389d861c91a8dccc510fab0e245
- 1a76bb56b0ba99a19d1373c4c8ebac42e7b6f27c
- 51500eedefa492699668ced3e07e330a9a4d53ee
Diffstat (limited to 'memory_view.c')
-rw-r--r-- | memory_view.c | 225 |
1 files changed, 2 insertions, 223 deletions
diff --git a/memory_view.c b/memory_view.c index d89648317d..8b2a2c051d 100644 --- a/memory_view.c +++ b/memory_view.c @@ -12,18 +12,6 @@ #include "internal/util.h" #include "ruby/memory_view.h" -#if SIZEOF_INTPTR_T == SIZEOF_LONG_LONG -# define INTPTR2NUM LL2NUM -# define UINTPTR2NUM ULL2NUM -#elif SIZEOF_INTPTR_T == SIZEOF_LONG -# define INTPTR2NUM LONG2NUM -# define UINTPTR2NUM ULONG2NUM -#else -# define INTPTR2NUM INT2NUM -# define UINTPTR2NUM UINT2NUM -#endif - - #define STRUCT_ALIGNOF(T, result) do { \ (result) = RUBY_ALIGNOF(T); \ } while(0) @@ -406,13 +394,13 @@ calculate_padding(ssize_t total, ssize_t alignment_size) { ssize_t rb_memory_view_parse_item_format(const char *format, rb_memory_view_item_component_t **members, - size_t *n_members, const char **err) + ssize_t *n_members, const char **err) { if (format == NULL) return 1; VALUE error = Qnil; ssize_t total = 0; - size_t len = 0; + ssize_t len = 0; bool alignment = false; ssize_t max_alignment_size = 0; @@ -570,215 +558,6 @@ rb_memory_view_get_item_pointer(rb_memory_view_t *view, const ssize_t *indices) return ptr; } -static void -switch_endianness(uint8_t *buf, ssize_t len) -{ - RUBY_ASSERT(buf != NULL); - RUBY_ASSERT(len >= 0); - - uint8_t *p = buf; - uint8_t *q = buf + len - 1; - - while (q - p > 0) { - uint8_t t = *p; - *p = *q; - *q = t; - ++p; - --q; - } -} - -static inline VALUE -extract_item_member(const uint8_t *ptr, const rb_memory_view_item_component_t *member, const size_t i, - uint8_t *buf, const size_t buf_size) -{ - RUBY_ASSERT(ptr != NULL); - RUBY_ASSERT(member != NULL); - -#ifdef WORDS_BIGENDIAN - const bool native_endian_p = !member->little_endian_p; -#else - const bool native_endian_p = member->little_endian_p; -#endif - - const uint8_t *p = ptr + member->offset + i * member->size; - - if (member->format == 'c') { - return INT2FIX(*(char *)p); - } - else if (member->format == 'C') { - return INT2FIX(*(unsigned char *)p); - } - - const uint8_t *q = p; - - if (!native_endian_p) { - RUBY_ASSERT(buf != NULL); - MEMCPY(buf, p, uint8_t, member->size); - switch_endianness(buf, member->size); - q = buf; - } - - switch (member->format) { - case 's': - if (member->native_size_p) { - return INT2FIX(*(short *)q); - } - else { - return INT2FIX(*(int16_t *)q); - } - - case 'S': - case 'n': - case 'v': - if (member->native_size_p) { - return UINT2NUM(*(unsigned short *)q); - } - else { - return INT2FIX(*(uint16_t *)q); - } - - case 'i': - return INT2NUM(*(int *)q); - - case 'I': - return UINT2NUM(*(unsigned int *)q); - - case 'l': - if (member->native_size_p) { - return LONG2NUM(*(long *)q); - } - else { - return LONG2NUM(*(int32_t *)q); - } - - case 'L': - case 'N': - case 'V': - if (member->native_size_p) { - return ULONG2NUM(*(unsigned long *)q); - } - else { - return ULONG2NUM(*(uint32_t *)q); - } - - case 'f': - case 'e': - case 'g': - return DBL2NUM(*(float *)q); - - case 'q': - if (member->native_size_p) { - return LL2NUM(*(LONG_LONG *)q); - } - else { -#if SIZEOF_INT64_t == SIZEOF_LONG - return LONG2NUM(*(int64_t *)q); -#else - return LL2NUM(*(int64_t *)q); -#endif - } - - case 'Q': - if (member->native_size_p) { - return ULL2NUM(*(unsigned LONG_LONG *)q); - } - else { -#if SIZEOF_UINT64_t == SIZEOF_LONG - return ULONG2NUM(*(uint64_t *)q); -#else - return ULL2NUM(*(uint64_t *)q); -#endif - } - - case 'd': - case 'E': - case 'G': - return DBL2NUM(*(double *)q); - - case 'j': - return INTPTR2NUM(*(intptr_t *)q); - - case 'J': - return UINTPTR2NUM(*(uintptr_t *)q); - - default: - UNREACHABLE_RETURN(Qnil); - } -} - -/* Return a value of the extracted member. */ -VALUE -rb_memory_view_extract_item_member(const void *ptr, const rb_memory_view_item_component_t *member, const size_t i) -{ - if (ptr == NULL) return Qnil; - if (member == NULL) return Qnil; - if (i >= member->repeat) return Qnil; - -#ifdef WORDS_BIGENDIAN - const bool native_endian_p = !member->little_endian_p; -#else - const bool native_endian_p = member->little_endian_p; -#endif - - VALUE buf_v = 0; - uint8_t *buf; - if (!native_endian_p) { - buf = ALLOCV_N(uint8_t, buf_v, member->size); - } - - VALUE v = extract_item_member(ptr, member, i, buf, member->size); - - if (buf_v) ALLOCV_END(buf_v); - return v; -} - -/* Return a value that consists of item members. - * When an item is a single member, the return value is a single value. - * When an item consists of multiple members, an array will be returned. */ -VALUE -rb_memory_view_extract_item_members(const void *ptr, const rb_memory_view_item_component_t *members, const size_t n_members) -{ - if (ptr == NULL) return Qnil; - if (members == NULL) return Qnil; - if (n_members == 0) return Qnil; - - if (n_members == 1 && members[0].repeat == 1) { - return rb_memory_view_extract_item_member(ptr, members, 0); - } - - size_t i, max_size = 0; - bool need_switch_endianness_p = false; - for (i = 0; i < n_members; ++i) { - if (max_size < members[i].size) { - max_size = members[i].size; - } -#ifdef WORDS_BIGENDIAN - need_switch_endianness_p |= members[i].little_endian_p; -#else - need_switch_endianness_p |= !members[i].little_endian_p; -#endif - } - - VALUE buf_v = 0; - uint8_t *buf = NULL; - if (need_switch_endianness_p) { - buf = ALLOCV_N(uint8_t, buf_v, max_size); - } - - VALUE item = rb_ary_new(); - for (i = 0; i < n_members; ++i) { - size_t j; - for (j = 0; j < members[i].repeat; ++j) { - VALUE v = extract_item_member(ptr, &members[i], j, buf, max_size); - rb_ary_push(item, v); - } - } - - if (buf_v) ALLOCV_END(buf_v); - return item; -} - static const rb_memory_view_entry_t * lookup_memory_view_entry(VALUE klass) { |