summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Patterson <[email protected]>2023-03-17 11:39:35 -0700
committerAaron Patterson <[email protected]>2023-03-22 08:46:12 -0700
commit1a9e2d20e2c66933f8eb891a1ee85fae6015fcf1 ()
tree281d6536edd16ee9ece6971462f27fcf70151550
parente340eb2106544dffe909104df1ff61236f70f280 (diff)
Fix shape allocation limits
We can only allocate enough shapes to fit in the shape buffer. MAX_SHAPE_ID was based on the theoretical maximum number of shapes we could have, not on the amount of memory we can actually consume. This commit changes the MAX_SHAPE_ID to be based on the amount of memory we're allowed to consume. Co-Authored-By: Jemma Issroff <[email protected]>
Notes: Merged: https://.com/ruby/ruby/pull/7556
-rw-r--r--shape.c1
-rw-r--r--shape.h4
-rw-r--r--vm.c4
3 files changed, 5 insertions, 4 deletions
@@ -145,6 +145,7 @@ get_next_shape_internal(rb_shape_t * shape, ID id, enum shape_type shape_type, b
new_shape->type = (uint8_t)shape_type;
new_shape->capacity = shape->capacity;
switch (shape_type) {
case SHAPE_IVAR:
@@ -28,12 +28,12 @@ typedef uint16_t shape_id_t;
# define SHAPE_FLAG_SHIFT ((SIZEOF_VALUE * 8) - SHAPE_ID_NUM_BITS)
-# define SHAPE_BITMAP_SIZE 16384
# define SHAPE_MAX_VARIATIONS 8
# define SHAPE_MAX_NUM_IVS 80
-# define MAX_SHAPE_ID (SHAPE_MASK - 1)
# define INVALID_SHAPE_ID SHAPE_MASK
# define ROOT_SHAPE_ID 0x0
@@ -4022,13 +4022,13 @@ Init_vm_objects(void)
#endif
#ifdef HAVE_MMAP
- vm->shape_list = (rb_shape_t *)mmap(NULL, rb_size_mul_or_raise(SHAPE_BITMAP_SIZE * 32, sizeof(rb_shape_t), rb_eRuntimeError),
PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (vm->shape_list == MAP_FAILED) {
vm->shape_list = 0;
}
#else
- vm->shape_list = xcalloc(SHAPE_BITMAP_SIZE * 32, sizeof(rb_shape_t));
#endif
if (!vm->shape_list) {