summaryrefslogtreecommitdiff
path: root/iseq.c
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2022-12-04 15:23:09 -0500
committerPeter Zhu <peter@peterzhu.ca>2022-12-04 15:23:09 -0500
commitd90835aeb54c635d99a3ba199605d062109a54ed (patch)
treec62bca309612d6244a2c791401e368dbb387c67a /iseq.c
parente58c4f97fa45206172a19803bfb2270b9a5bc010 (diff)
Fix crash when RGENGC_CHECK_MODE=2
Commit dba61f4 fixes a crash when GC'ing a iseq that failed to compile. However, if we turn on RGENGC_CHECK_MODE then rb_iseq_memsize crashes since it cannot handle an iseq without is_entries.
Diffstat (limited to 'iseq.c')
-rw-r--r--iseq.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/iseq.c b/iseq.c
index b16369e420..381bf6ed20 100644
--- a/iseq.c
+++ b/iseq.c
@@ -515,15 +515,17 @@ rb_iseq_memsize(const rb_iseq_t *iseq)
/* body->is_entries */
size += ISEQ_IS_SIZE(body) * sizeof(union iseq_inline_storage_entry);
- /* IC entries constant segments */
- for (unsigned int ic_idx = 0; ic_idx < body->ic_size; ic_idx++) {
- IC ic = &ISEQ_IS_IC_ENTRY(body, ic_idx);
- const ID *ids = ic->segments;
- if (!ids) continue;
- while (*ids++) {
- size += sizeof(ID);
+ if (ISEQ_BODY(iseq)->is_entries) {
+ /* IC entries constant segments */
+ for (unsigned int ic_idx = 0; ic_idx < body->ic_size; ic_idx++) {
+ IC ic = &ISEQ_IS_IC_ENTRY(body, ic_idx);
+ const ID *ids = ic->segments;
+ if (!ids) continue;
+ while (*ids++) {
+ size += sizeof(ID);
+ }
+ size += sizeof(ID); // null terminator
}
- size += sizeof(ID); // null terminator
}
/* body->call_data */