When alloc size is too large, only allocate struct

This commit is contained in:
Matt Valentine-House 2023-06-12 13:13:32 +01:00 committed by Jean Boussier
parent 31e24a42f3
commit 6fe46ff967
Notes: git 2023-06-12 14:20:25 +00:00
2 changed files with 9 additions and 1 deletions

View File

@ -849,7 +849,7 @@ struct_alloc(VALUE klass)
return (VALUE)st; return (VALUE)st;
} }
else { 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); st->as.heap.ptr = struct_heap_alloc((VALUE)st, n);
rb_mem_clear((VALUE *)st->as.heap.ptr, n); rb_mem_clear((VALUE *)st->as.heap.ptr, n);

View File

@ -41,6 +41,14 @@ module TestStruct
end end
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 def test_small_structs
names = [:a, :b, :c, :d] names = [:a, :b, :c, :d]
1.upto(4) {|n| 1.upto(4) {|n|