From 6fe46ff967215e47ab2234e9b48663d2e3608081 Mon Sep 17 00:00:00 2001 From: Matt Valentine-House Date: Mon, 12 Jun 2023 13:13:32 +0100 Subject: [PATCH] When alloc size is too large, only allocate struct --- struct.c | 2 +- test/ruby/test_struct.rb | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/struct.c b/struct.c index 3ee4408393..7214402f59 100644 --- a/struct.c +++ b/struct.c @@ -849,7 +849,7 @@ struct_alloc(VALUE klass) return (VALUE)st; } else { - NEWOBJ_OF(st, struct RStruct, klass, flags, embedded_size, 0); + NEWOBJ_OF(st, struct RStruct, klass, flags, sizeof(struct RStruct), 0); st->as.heap.ptr = struct_heap_alloc((VALUE)st, n); rb_mem_clear((VALUE *)st->as.heap.ptr, n); diff --git a/test/ruby/test_struct.rb b/test/ruby/test_struct.rb index 78a81c5200..ed750b91f7 100644 --- a/test/ruby/test_struct.rb +++ b/test/ruby/test_struct.rb @@ -41,6 +41,14 @@ module TestStruct end end + def test_larger_than_largest_pool + count = (GC::INTERNAL_CONSTANTS[:RVARGC_MAX_ALLOCATE_SIZE] / RbConfig::SIZEOF["void*"]) + 1 + list = Array(0..count) + klass = @Struct.new(*list.map { |i| :"a_#{i}"}) + struct = klass.new(*list) + assert_equal 0, struct.a_0 + end + def test_small_structs names = [:a, :b, :c, :d] 1.upto(4) {|n|