From 1c9c3d3462b2f912efbc3a797145545e7c09b12c Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 9 Jun 2026 16:01:06 +0900 Subject: [PATCH 1/5] Update Launchable setup actions to Node.js 24 runtime actions/setup-python v5.6.0 and actions/setup-java v4.8.0 run on the deprecated Node.js 20 runtime, which GitHub Actions warns about and will force to Node.js 24 on June 16th, 2026. Bump to setup-python v6.2.0 and setup-java v5.2.0. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/actions/launchable/setup/action.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/actions/launchable/setup/action.yml b/.github/actions/launchable/setup/action.yml index 305878492c243c..14a3a6f0eea92e 100644 --- a/.github/actions/launchable/setup/action.yml +++ b/.github/actions/launchable/setup/action.yml @@ -95,7 +95,7 @@ runs: # Launchable CLI requires Python and Java. # https://www.launchableinc.com/docs/resources/cli-reference/ - name: Set up Python - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: "3.x" if: >- @@ -103,7 +103,7 @@ runs: && !endsWith(inputs.os, 'ppc64le') && !endsWith(inputs.os, 's390x') }} - name: Set up Java - uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4.8.0 + uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 with: distribution: 'temurin' java-version: '17' @@ -112,7 +112,7 @@ runs: && !endsWith(inputs.os, 'ppc64le') && !endsWith(inputs.os, 's390x') }} - name: Set up Java ppc64le - uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4.8.0 + uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 with: distribution: 'semeru' architecture: 'ppc64le' @@ -122,7 +122,7 @@ runs: && endsWith(inputs.os, 'ppc64le') }} - name: Set up Java s390x - uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4.8.0 + uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 with: distribution: 'semeru' architecture: 's390x' From 47fd9957d7ad255734775c483da0f792d27eaf4d Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 9 Jun 2026 16:03:41 +0900 Subject: [PATCH 2/5] Silence Homebrew already-installed warnings in tarball-macos Add --quiet to brew install so pre-installed formulae no longer emit "already installed and up-to-date" annotations, matching the existing .github/actions/setup/macos action. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/tarball-macos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tarball-macos.yml b/.github/workflows/tarball-macos.yml index 0d02cf6ae17475..b872545945b4ec 100644 --- a/.github/workflows/tarball-macos.yml +++ b/.github/workflows/tarball-macos.yml @@ -47,7 +47,7 @@ jobs: "$@" || { sleep 5 && "$@"; } || { sleep 60 && "$@"; } } set -x - with_retry brew install gmp libffi openssl zlib autoconf automake libtool libyaml + with_retry brew install --quiet gmp libffi openssl zlib autoconf automake libtool libyaml - name: Set ENV run: | echo "JOBS=-j$((1 + $(sysctl -n hw.activecpu)))" >> $GITHUB_ENV From b80b160886f135313b3ec6098965bdf6d460c331 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 9 Jun 2026 16:06:30 +0900 Subject: [PATCH 3/5] Update capiext cache action to Node.js 24 runtime actions/cache v4.2.4 runs on the deprecated Node.js 20 runtime. Bump restore/save to v5.0.5, matching the actions/cache pin already used elsewhere in the workflows. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/actions/capiext/action.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/capiext/action.yml b/.github/actions/capiext/action.yml index ed69c8ac5ea709..702f38ec5bb994 100644 --- a/.github/actions/capiext/action.yml +++ b/.github/actions/capiext/action.yml @@ -36,7 +36,7 @@ runs: working-directory: ${{ inputs.builddir }} - name: Restore previous CAPI extensions - uses: actions/cache/restore@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 + uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 id: cache with: path: ${{ inputs.builddir }}/spec/ruby/optional/capi/ext/ @@ -72,7 +72,7 @@ runs: }} - name: Save CAPI extensions - uses: actions/cache/save@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 + uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 with: path: ${{ inputs.builddir }}/spec/ruby/optional/capi/ext/ key: ${{ steps.config.outputs.key }} From e475350a7c251d76accb5018674bfbeb6da7b1c9 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Mon, 8 Jun 2026 16:49:19 +0900 Subject: [PATCH 4/5] IO::Buffer: Add the helper function `get_io_buffer` --- io_buffer.c | 185 +++++++++++++++++++--------------------------------- 1 file changed, 67 insertions(+), 118 deletions(-) diff --git a/io_buffer.c b/io_buffer.c index dc8f547a322096..9f4d4776216d98 100644 --- a/io_buffer.c +++ b/io_buffer.c @@ -335,6 +335,14 @@ static const rb_data_type_t rb_io_buffer_type = { .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_EMBEDDABLE, }; +static struct rb_io_buffer * +get_io_buffer(VALUE self) +{ + struct rb_io_buffer *buffer; + TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + return buffer; +} + static inline enum rb_io_buffer_flags io_buffer_extract_flags(VALUE argument) { @@ -429,8 +437,7 @@ io_buffer_default_length(const struct rb_io_buffer *buffer, size_t offset) static inline struct rb_io_buffer * io_buffer_extract_length_offset(VALUE self, int argc, VALUE argv[], size_t *length, size_t *offset) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); if (argc >= 2 && !NIL_P(argv[1])) { *offset = io_buffer_extract_offset(argv[1]); @@ -461,8 +468,7 @@ io_buffer_extract_length_offset(VALUE self, int argc, VALUE argv[], size_t *leng static inline struct rb_io_buffer * io_buffer_extract_offset_length(VALUE self, int argc, VALUE argv[], size_t *offset, size_t *length) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); if (argc >= 1 && !NIL_P(argv[0])) { *offset = io_buffer_extract_offset(argv[0]); @@ -498,8 +504,7 @@ static VALUE io_buffer_for_make_instance(VALUE klass, VALUE string, enum rb_io_b { VALUE instance = rb_io_buffer_type_allocate(klass); - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(instance, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(instance); flags |= RB_IO_BUFFER_EXTERNAL; @@ -645,8 +650,7 @@ rb_io_buffer_new(void *base, size_t size, enum rb_io_buffer_flags flags) { VALUE instance = rb_io_buffer_type_allocate(rb_cIOBuffer); - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(instance, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(instance); io_buffer_initialize(instance, buffer, base, size, flags, Qnil); @@ -658,8 +662,7 @@ rb_io_buffer_map(VALUE io, size_t size, rb_off_t offset, enum rb_io_buffer_flags { VALUE instance = rb_io_buffer_type_allocate(rb_cIOBuffer); - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(instance, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(instance); int descriptor = rb_io_descriptor(io); @@ -812,8 +815,7 @@ rb_io_buffer_initialize(int argc, VALUE *argv, VALUE self) { rb_check_arity(argc, 0, 2); - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); size_t size; if (argc > 0) { @@ -880,8 +882,7 @@ io_buffer_validate(struct rb_io_buffer *buffer) enum rb_io_buffer_flags rb_io_buffer_get_bytes(VALUE self, void **base, size_t *size) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); if (io_buffer_validate(buffer)) { if (buffer->base) { @@ -915,8 +916,7 @@ io_buffer_validate_for_writing(struct rb_io_buffer *buffer) static struct rb_io_buffer * get_io_buffer_for_writing(VALUE self) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); io_buffer_validate_for_writing(buffer); return buffer; } @@ -938,8 +938,7 @@ io_buffer_get_bytes_for_writing(struct rb_io_buffer *buffer, void **base, size_t void rb_io_buffer_get_bytes_for_writing(VALUE self, void **base, size_t *size) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); io_buffer_get_bytes_for_writing(buffer, base, size); } @@ -969,8 +968,7 @@ io_buffer_get_bytes_for_reading(struct rb_io_buffer *buffer, const void **base, void rb_io_buffer_get_bytes_for_reading(VALUE self, const void **base, size_t *size) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); io_buffer_get_bytes_for_reading(buffer, base, size); } @@ -987,8 +985,7 @@ rb_io_buffer_get_bytes_for_reading(VALUE self, const void **base, size_t *size) VALUE rb_io_buffer_to_s(VALUE self) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); VALUE result = rb_str_new_cstr("#<"); @@ -1122,8 +1119,7 @@ io_buffer_hexdump(VALUE string, size_t width, const char *base, size_t length, s VALUE rb_io_buffer_inspect(VALUE self) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); VALUE result = rb_io_buffer_to_s(self); @@ -1156,8 +1152,7 @@ rb_io_buffer_inspect(VALUE self) VALUE rb_io_buffer_size(VALUE self) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); return SIZET2NUM(buffer->size); } @@ -1173,8 +1168,7 @@ rb_io_buffer_size(VALUE self) static VALUE rb_io_buffer_valid_p(VALUE self) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); return RBOOL(io_buffer_validate(buffer)); } @@ -1196,8 +1190,7 @@ rb_io_buffer_valid_p(VALUE self) static VALUE rb_io_buffer_null_p(VALUE self) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); return RBOOL(buffer->base == NULL); } @@ -1212,8 +1205,7 @@ rb_io_buffer_null_p(VALUE self) static VALUE rb_io_buffer_empty_p(VALUE self) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); return RBOOL(buffer->size == 0); } @@ -1232,8 +1224,7 @@ rb_io_buffer_empty_p(VALUE self) static VALUE rb_io_buffer_external_p(VALUE self) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); return RBOOL(buffer->flags & RB_IO_BUFFER_EXTERNAL); } @@ -1257,8 +1248,7 @@ rb_io_buffer_external_p(VALUE self) static VALUE rb_io_buffer_internal_p(VALUE self) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); return RBOOL(buffer->flags & RB_IO_BUFFER_INTERNAL); } @@ -1279,8 +1269,7 @@ rb_io_buffer_internal_p(VALUE self) static VALUE rb_io_buffer_mapped_p(VALUE self) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); return RBOOL(buffer->flags & RB_IO_BUFFER_MAPPED); } @@ -1311,8 +1300,7 @@ rb_io_buffer_mapped_p(VALUE self) static VALUE rb_io_buffer_shared_p(VALUE self) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); return RBOOL(buffer->flags & RB_IO_BUFFER_SHARED); } @@ -1334,8 +1322,7 @@ rb_io_buffer_shared_p(VALUE self) static VALUE rb_io_buffer_locked_p(VALUE self) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); return RBOOL(buffer->flags & RB_IO_BUFFER_LOCKED); } @@ -1365,8 +1352,7 @@ rb_io_buffer_locked_p(VALUE self) static VALUE rb_io_buffer_private_p(VALUE self) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); return RBOOL(buffer->flags & RB_IO_BUFFER_PRIVATE); } @@ -1374,8 +1360,7 @@ rb_io_buffer_private_p(VALUE self) int rb_io_buffer_readonly_p(VALUE self) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); return buffer->flags & RB_IO_BUFFER_READONLY; } @@ -1416,8 +1401,7 @@ io_buffer_lock(struct rb_io_buffer *buffer) VALUE rb_io_buffer_lock(VALUE self) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); io_buffer_lock(buffer); @@ -1437,8 +1421,7 @@ io_buffer_unlock(struct rb_io_buffer *buffer) VALUE rb_io_buffer_unlock(VALUE self) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); io_buffer_unlock(buffer); @@ -1448,8 +1431,7 @@ rb_io_buffer_unlock(VALUE self) int rb_io_buffer_try_unlock(VALUE self) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); if (buffer->flags & RB_IO_BUFFER_LOCKED) { buffer->flags &= ~RB_IO_BUFFER_LOCKED; @@ -1462,8 +1444,7 @@ rb_io_buffer_try_unlock(VALUE self) static VALUE rb_io_buffer_locked_ensure(VALUE self) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); buffer->flags &= ~RB_IO_BUFFER_LOCKED; @@ -1503,8 +1484,7 @@ rb_io_buffer_locked_ensure(VALUE self) VALUE rb_io_buffer_locked(VALUE self) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); if (buffer->flags & RB_IO_BUFFER_LOCKED) { rb_raise(rb_eIOBufferLockedError, "Buffer already locked!"); @@ -1543,8 +1523,7 @@ rb_io_buffer_locked(VALUE self) VALUE rb_io_buffer_free(VALUE self) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); if (buffer->flags & RB_IO_BUFFER_LOCKED) { rb_raise(rb_eIOBufferLockedError, "Buffer is locked!"); @@ -1557,8 +1536,7 @@ rb_io_buffer_free(VALUE self) VALUE rb_io_buffer_free_locked(VALUE self) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); io_buffer_unlock(buffer); io_buffer_free(buffer); @@ -1634,8 +1612,7 @@ rb_io_buffer_slice(struct rb_io_buffer *buffer, VALUE self, size_t offset, size_ io_buffer_validate_range(buffer, offset, length); VALUE instance = rb_io_buffer_type_allocate(rb_class_of(self)); - struct rb_io_buffer *slice = NULL; - TypedData_Get_Struct(instance, struct rb_io_buffer, &rb_io_buffer_type, slice); + struct rb_io_buffer *slice = get_io_buffer(instance); slice->flags |= (buffer->flags & RB_IO_BUFFER_READONLY); slice->base = (char*)buffer->base + offset; @@ -1734,8 +1711,7 @@ io_buffer_slice(int argc, VALUE *argv, VALUE self) VALUE rb_io_buffer_transfer(VALUE self) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); if (buffer->flags & RB_IO_BUFFER_LOCKED) { rb_raise(rb_eIOBufferLockedError, "Cannot transfer ownership of locked buffer!"); @@ -1781,8 +1757,7 @@ io_buffer_resize_copy(VALUE self, struct rb_io_buffer *buffer, size_t size) void rb_io_buffer_resize(VALUE self, size_t size) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); io_buffer_validate_for_reading(buffer); @@ -2661,8 +2636,7 @@ io_buffer_copy_from(struct rb_io_buffer *buffer, const void *source_base, size_t static VALUE rb_io_buffer_initialize_copy(VALUE self, VALUE source) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); const void *source_base; size_t source_size; @@ -2749,8 +2723,7 @@ io_buffer_copy(int argc, VALUE *argv, VALUE self) { rb_check_arity(argc, 1, 4); - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); VALUE source = argv[0]; const void *source_base; @@ -2830,8 +2803,7 @@ io_buffer_set_string(int argc, VALUE *argv, VALUE self) { rb_check_arity(argc, 1, 4); - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); VALUE string = rb_str_to_str(argv[0]); @@ -2846,8 +2818,7 @@ io_buffer_set_string(int argc, VALUE *argv, VALUE self) void rb_io_buffer_clear(VALUE self, uint8_t value, size_t offset, size_t length) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); void *base; size_t size; @@ -3035,8 +3006,7 @@ rb_io_buffer_read(VALUE self, VALUE io, size_t length, size_t offset) } } - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); io_buffer_validate_range(buffer, offset, length); @@ -3154,8 +3124,7 @@ rb_io_buffer_pread(VALUE self, VALUE io, rb_off_t from, size_t length, size_t of } } - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); io_buffer_validate_range(buffer, offset, length); @@ -3276,8 +3245,7 @@ rb_io_buffer_write(VALUE self, VALUE io, size_t length, size_t offset) } } - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); io_buffer_validate_range(buffer, offset, length); @@ -3388,8 +3356,7 @@ rb_io_buffer_pwrite(VALUE self, VALUE io, rb_off_t from, size_t length, size_t o } } - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); io_buffer_validate_range(buffer, offset, length); @@ -3489,11 +3456,9 @@ memory_and(unsigned char * restrict output, const unsigned char * restrict base, static VALUE io_buffer_and(VALUE self, VALUE mask) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); - struct rb_io_buffer *mask_buffer = NULL; - TypedData_Get_Struct(mask, struct rb_io_buffer, &rb_io_buffer_type, mask_buffer); + struct rb_io_buffer *mask_buffer = get_io_buffer(mask); const void *base; size_t size; @@ -3506,8 +3471,7 @@ io_buffer_and(VALUE self, VALUE mask) io_buffer_check_mask_size(mask_size); VALUE output = rb_io_buffer_new(NULL, size, io_flags_for_size(size)); - struct rb_io_buffer *output_buffer = NULL; - TypedData_Get_Struct(output, struct rb_io_buffer, &rb_io_buffer_type, output_buffer); + struct rb_io_buffer *output_buffer = get_io_buffer(output); memory_and(output_buffer->base, base, size, mask_base, mask_size); @@ -3537,11 +3501,9 @@ memory_or(unsigned char * restrict output, const unsigned char * restrict base, static VALUE io_buffer_or(VALUE self, VALUE mask) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); - struct rb_io_buffer *mask_buffer = NULL; - TypedData_Get_Struct(mask, struct rb_io_buffer, &rb_io_buffer_type, mask_buffer); + struct rb_io_buffer *mask_buffer = get_io_buffer(mask); const void *base; size_t size; @@ -3554,8 +3516,7 @@ io_buffer_or(VALUE self, VALUE mask) io_buffer_check_mask_size(mask_size); VALUE output = rb_io_buffer_new(NULL, size, io_flags_for_size(size)); - struct rb_io_buffer *output_buffer = NULL; - TypedData_Get_Struct(output, struct rb_io_buffer, &rb_io_buffer_type, output_buffer); + struct rb_io_buffer *output_buffer = get_io_buffer(output); memory_or(output_buffer->base, base, size, mask_base, mask_size); @@ -3585,11 +3546,9 @@ memory_xor(unsigned char * restrict output, const unsigned char * restrict base, static VALUE io_buffer_xor(VALUE self, VALUE mask) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); - struct rb_io_buffer *mask_buffer = NULL; - TypedData_Get_Struct(mask, struct rb_io_buffer, &rb_io_buffer_type, mask_buffer); + struct rb_io_buffer *mask_buffer = get_io_buffer(mask); const void *base; size_t size; @@ -3602,8 +3561,7 @@ io_buffer_xor(VALUE self, VALUE mask) io_buffer_check_mask_size(mask_size); VALUE output = rb_io_buffer_new(NULL, size, io_flags_for_size(size)); - struct rb_io_buffer *output_buffer = NULL; - TypedData_Get_Struct(output, struct rb_io_buffer, &rb_io_buffer_type, output_buffer); + struct rb_io_buffer *output_buffer = get_io_buffer(output); memory_xor(output_buffer->base, base, size, mask_base, mask_size); @@ -3633,16 +3591,14 @@ memory_not(unsigned char * restrict output, const unsigned char * restrict base, static VALUE io_buffer_not(VALUE self) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); const void *base; size_t size; io_buffer_get_bytes_for_reading(buffer, &base, &size); VALUE output = rb_io_buffer_new(NULL, size, io_flags_for_size(size)); - struct rb_io_buffer *output_buffer = NULL; - TypedData_Get_Struct(output, struct rb_io_buffer, &rb_io_buffer_type, output_buffer); + struct rb_io_buffer *output_buffer = get_io_buffer(output); memory_not(output_buffer->base, base, size); @@ -3694,11 +3650,9 @@ memory_and_inplace(unsigned char * restrict base, size_t size, unsigned char * r static VALUE io_buffer_and_inplace(VALUE self, VALUE mask) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); - struct rb_io_buffer *mask_buffer = NULL; - TypedData_Get_Struct(mask, struct rb_io_buffer, &rb_io_buffer_type, mask_buffer); + struct rb_io_buffer *mask_buffer = get_io_buffer(mask); io_buffer_check_mask_size(mask_buffer->size); io_buffer_check_overlaps(buffer, mask_buffer); @@ -3744,11 +3698,9 @@ memory_or_inplace(unsigned char * restrict base, size_t size, unsigned char * re static VALUE io_buffer_or_inplace(VALUE self, VALUE mask) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); - struct rb_io_buffer *mask_buffer = NULL; - TypedData_Get_Struct(mask, struct rb_io_buffer, &rb_io_buffer_type, mask_buffer); + struct rb_io_buffer *mask_buffer = get_io_buffer(mask); io_buffer_check_mask_size(mask_buffer->size); io_buffer_check_overlaps(buffer, mask_buffer); @@ -3794,11 +3746,9 @@ memory_xor_inplace(unsigned char * restrict base, size_t size, unsigned char * r static VALUE io_buffer_xor_inplace(VALUE self, VALUE mask) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); - struct rb_io_buffer *mask_buffer = NULL; - TypedData_Get_Struct(mask, struct rb_io_buffer, &rb_io_buffer_type, mask_buffer); + struct rb_io_buffer *mask_buffer = get_io_buffer(mask); io_buffer_check_mask_size(mask_buffer->size); io_buffer_check_overlaps(buffer, mask_buffer); @@ -3844,8 +3794,7 @@ memory_not_inplace(unsigned char * restrict base, size_t size) static VALUE io_buffer_not_inplace(VALUE self) { - struct rb_io_buffer *buffer = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, buffer); + struct rb_io_buffer *buffer = get_io_buffer(self); void *base; size_t size; From 8ebc075c4b48a27354598b6a5bd73e81218253d0 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 9 Jun 2026 17:01:00 +0900 Subject: [PATCH 5/5] IO::Buffer: Remove `ensure` from `set_value` and `set_values` --- io_buffer.c | 53 ++++++++++------------------------------------------- 1 file changed, 10 insertions(+), 43 deletions(-) diff --git a/io_buffer.c b/io_buffer.c index 9f4d4776216d98..9b1e13b3cf9a29 100644 --- a/io_buffer.c +++ b/io_buffer.c @@ -2413,15 +2413,6 @@ struct io_buffer_set_value_arguments { VALUE type, value; }; -static VALUE -io_buffer_set_value_try(VALUE arguments) -{ - struct io_buffer_set_value_arguments *args = (void *)arguments; - size_t offset = args->offset; - rb_io_buffer_set_value(args->buffer, args->type, &offset, args->value); - return SIZET2NUM(offset); -} - /* * call-seq: set_value(type, offset, value) -> offset * @@ -2455,31 +2446,9 @@ io_buffer_set_value_try(VALUE arguments) static VALUE io_buffer_set_value(VALUE self, VALUE type, VALUE _offset, VALUE value) { - struct io_buffer_set_value_arguments arguments = { - .buffer = get_io_buffer_for_writing(self), - .offset = io_buffer_extract_offset(_offset), - .type = type, - .value = value, - }; - - if (!io_buffer_try_lock(arguments.buffer)) { - return io_buffer_set_value_try((VALUE)&arguments); - } - return rb_ensure(io_buffer_set_value_try, (VALUE)&arguments, rb_io_buffer_locked_ensure, self); -} - -static VALUE -io_buffer_set_values_try(VALUE arguments) -{ - struct io_buffer_set_value_arguments *args = (void *)arguments; - size_t offset = args->offset; - - for (long i = 0; i < RARRAY_LEN(args->type); i++) { - VALUE type = rb_ary_entry(args->type, i); - VALUE value = rb_ary_entry(args->value, i); - rb_io_buffer_set_value(args->buffer, type, &offset, value); - } - + struct rb_io_buffer *buffer = get_io_buffer_for_writing(self); + size_t offset = io_buffer_extract_offset(_offset); + rb_io_buffer_set_value(buffer, type, &offset, value); return SIZET2NUM(offset); } @@ -2500,31 +2469,29 @@ io_buffer_set_values_try(VALUE arguments) static VALUE io_buffer_set_values(VALUE self, VALUE buffer_types, VALUE _offset, VALUE values) { - struct io_buffer_set_value_arguments arguments = { - .buffer = get_io_buffer_for_writing(self), - }; + struct rb_io_buffer *buffer = get_io_buffer_for_writing(self); if (!RB_TYPE_P(buffer_types, T_ARRAY)) { rb_raise(rb_eArgError, "Argument buffer_types should be an array!"); } - arguments.type = buffer_types; - arguments.offset = io_buffer_extract_offset(_offset); + size_t offset = io_buffer_extract_offset(_offset); if (!RB_TYPE_P(values, T_ARRAY)) { rb_raise(rb_eArgError, "Argument values should be an array!"); } - arguments.value = values; if (RARRAY_LEN(buffer_types) != RARRAY_LEN(values)) { rb_raise(rb_eArgError, "Argument buffer_types and values should have the same length!"); } - if (!io_buffer_try_lock(arguments.buffer)) { - return io_buffer_set_values_try((VALUE)&arguments); + for (long i = 0; i < RARRAY_LEN(buffer_types); i++) { + VALUE type = rb_ary_entry(buffer_types, i); + VALUE value = rb_ary_entry(values, i); + rb_io_buffer_set_value(buffer, type, &offset, value); } - return rb_ensure(io_buffer_set_values_try, (VALUE)&arguments, rb_io_buffer_locked_ensure, self); + return SIZET2NUM(offset); } static size_t IO_BUFFER_BLOCKING_SIZE = 1024*1024;