summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gc.c11
-rw-r--r--internal.h2
-rw-r--r--parse.y2
3 files changed, 10 insertions, 5 deletions
diff --git a/gc.c b/gc.c
index bcd48565c4..91ada6746c 100644
--- a/gc.c
+++ b/gc.c
@@ -4532,10 +4532,14 @@ gc_mark_imemo(rb_objspace_t *objspace, VALUE obj)
rb_iseq_mark((rb_iseq_t *)obj);
return;
case imemo_alloc:
- rb_gc_mark_locations(RANY(obj)->as.imemo.alloc.ptr,
- RANY(obj)->as.imemo.alloc.ptr + RANY(obj)->as.imemo.alloc.cnt);
- rb_gc_mark(RANY(obj)->as.imemo.alloc.next);
+ {
+ const rb_imemo_alloc_t *m = &RANY(obj)->as.imemo.alloc;
+ do {
+ rb_gc_mark_locations(m->ptr, m->ptr + m->cnt);
+ } while ((m = m->next) != NULL);
+ }
return;
+ case imemo_mask: break;
#if VM_CHECK_MODE > 0
default:
VM_UNREACHABLE(gc_mark_imemo);
@@ -9376,6 +9380,7 @@ rb_raw_obj_info(char *buff, const int buff_size, VALUE obj)
IMEMO_NAME(iseq);
IMEMO_NAME(alloc);
#undef IMEMO_NAME
+ case imemo_mask: break;
}
snprintf(buff, buff_size, "%s %s", buff, imemo_name);
diff --git a/internal.h b/internal.h
index b3d3463895..10c58d6533 100644
--- a/internal.h
+++ b/internal.h
@@ -934,7 +934,7 @@ typedef struct rb_imemo_alloc_struct {
VALUE flags;
VALUE reserved;
VALUE *ptr; /* malloc'ed buffer */
- VALUE next; /* next imemo */
+ struct rb_imemo_alloc_struct *next; /* next imemo */
size_t cnt; /* buffer size in VALUE */
} rb_imemo_alloc_t;
diff --git a/parse.y b/parse.y
index 838b6e00e9..488f328896 100644
--- a/parse.y
+++ b/parse.y
@@ -11517,7 +11517,7 @@ rb_parser_set_yydebug(VALUE self, VALUE flag)
#ifndef RIPPER
#ifdef YYMALLOC
#define HEAPCNT(n, size) ((n) * (size) / sizeof(YYSTYPE))
-#define NEWHEAP() rb_imemo_new(imemo_alloc, 0, (VALUE)parser->heap, 0, 0)
+#define NEWHEAP() (rb_imemo_alloc_t *)rb_imemo_new(imemo_alloc, 0, (VALUE)parser->heap, 0, 0)
#define ADD2HEAP(n, c, p) ((parser->heap = (n))->ptr = (p), \
(n)->cnt = (c), (p))