From 0c25658d362a5bbb3be1e2147413ecc7ab2c9bf9 Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Sat, 22 Aug 2026 21:10:42 +1200 Subject: [PATCH 1/2] Hide `rb_io_buffer_readonly_p`. (#18431) --- io_buffer.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/io_buffer.c b/io_buffer.c index d1b2f047110a0e..0da1bf5cd8017e 100644 --- a/io_buffer.c +++ b/io_buffer.c @@ -648,14 +648,15 @@ rb_io_buffer_for_reading(VALUE string_or_buffer, VALUE (*callback)(VALUE, VALUE) } } -/* Forward declaration: rb_io_buffer_readonly_p is defined later in this file. */ -int rb_io_buffer_readonly_p(VALUE self); +/* Forward declaration: io_buffer_readonly_p is defined later in this file. */ +static int io_buffer_readonly_p(struct rb_io_buffer *buffer); VALUE rb_io_buffer_for_writing(VALUE string_or_buffer, VALUE (*callback)(VALUE, VALUE), VALUE argument) { if (rb_obj_is_kind_of(string_or_buffer, rb_cIOBuffer)) { - if (rb_io_buffer_readonly_p(string_or_buffer)) { + struct rb_io_buffer *buffer = get_io_buffer(string_or_buffer); + if (io_buffer_readonly_p(buffer)) { rb_raise(rb_eArgError, "buffer is read-only"); } return callback(string_or_buffer, argument); @@ -1509,11 +1510,9 @@ rb_io_buffer_private_p(VALUE self) return RBOOL(buffer->flags & RB_IO_BUFFER_PRIVATE); } -int -rb_io_buffer_readonly_p(VALUE self) +static int +io_buffer_readonly_p(struct rb_io_buffer *buffer) { - struct rb_io_buffer *buffer = get_io_buffer(self); - return buffer->flags & RB_IO_BUFFER_READONLY; } @@ -1527,9 +1526,11 @@ rb_io_buffer_readonly_p(VALUE self) * backed by a frozen string or a read-only file. */ static VALUE -io_buffer_readonly_p(VALUE self) +rb_io_buffer_readonly_p(VALUE self) { - return RBOOL(rb_io_buffer_readonly_p(self)); + struct rb_io_buffer *buffer = get_io_buffer(self); + + return RBOOL(io_buffer_readonly_p(buffer)); } static void @@ -4214,7 +4215,7 @@ Init_IO_Buffer(void) rb_define_method(rb_cIOBuffer, "shared?", rb_io_buffer_shared_p, 0); rb_define_method(rb_cIOBuffer, "locked?", rb_io_buffer_locked_p, 0); rb_define_method(rb_cIOBuffer, "private?", rb_io_buffer_private_p, 0); - rb_define_method(rb_cIOBuffer, "readonly?", io_buffer_readonly_p, 0); + rb_define_method(rb_cIOBuffer, "readonly?", rb_io_buffer_readonly_p, 0); // Locking to prevent changes while using pointer: // rb_define_method(rb_cIOBuffer, "lock", rb_io_buffer_lock, 0); From 774cc95fd4da3ccb0e9f4d1e60975a6d80e0c7d3 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Fri, 21 Aug 2026 20:05:35 +0900 Subject: [PATCH 2/2] Fix weakmap memsize over-counting entries Keys and values are stored directly in the st_table entries. The counted buffers are a leftover from the old pointer-based implementation. --- weakmap.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/weakmap.c b/weakmap.c index d9282de8f65a64..e67eb0146d4ef1 100644 --- a/weakmap.c +++ b/weakmap.c @@ -50,8 +50,6 @@ wmap_memsize(const void *ptr) size_t size = 0; if (w->table) { size += st_memsize(w->table); - /* The key and value of the table each take sizeof(VALUE) in size. */ - size += st_table_size(w->table) * (2 * sizeof(VALUE)); } return size; @@ -561,8 +559,6 @@ wkmap_memsize(const void *ptr) size_t size = 0; if (w->table) { size += st_memsize(w->table); - /* Each key of the table takes sizeof(VALUE) in size. */ - size += st_table_size(w->table) * sizeof(VALUE); } return size;