Skip to content

Commit fe7ef62

Browse files
committed
experiment: dump segments size
1 parent 43ee4a5 commit fe7ef62

3 files changed

Lines changed: 34 additions & 0 deletions

File tree

ext/objspace/objspace_dump.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,14 @@ dump_object(VALUE obj, struct dump_config *dc)
461461
}
462462
break;
463463

464+
case imemo_iseq: {
465+
size_t segment_size = rb_iseq_ic_segments_size((const rb_iseq_t *)obj);
466+
if (segment_size) {
467+
dump_append(dc, ", \"segments_memsize\":");
468+
dump_append_sizet(dc, segment_size);
469+
}
470+
break;
471+
}
464472
default:
465473
break;
466474
}

iseq.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,29 @@ rb_iseq_memsize(const rb_iseq_t *iseq)
504504
return size;
505505
}
506506

507+
size_t
508+
rb_iseq_ic_segments_size(const rb_iseq_t *iseq)
509+
{
510+
size_t size = 0;
511+
const struct rb_iseq_constant_body *body = ISEQ_BODY(iseq);
512+
513+
if (ISEQ_EXECUTABLE_P(iseq) && body) {
514+
if (ISEQ_BODY(iseq)->is_entries) {
515+
/* IC entries constant segments */
516+
for (unsigned int ic_idx = 0; ic_idx < body->ic_size; ic_idx++) {
517+
IC ic = &ISEQ_IS_IC_ENTRY(body, ic_idx);
518+
const ID *ids = ic->segments;
519+
if (!ids) continue;
520+
while (*ids++) {
521+
size += sizeof(ID);
522+
}
523+
size += sizeof(ID); // null terminator
524+
}
525+
}
526+
}
527+
return size;
528+
}
529+
507530
struct rb_iseq_constant_body *
508531
rb_iseq_constant_body_alloc(void)
509532
{

vm_core.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,7 @@ static inline const rb_iseq_t *rb_iseq_complete(const rb_iseq_t *iseq) {return 0
590590
#endif
591591
const rb_iseq_t *rb_iseq_complete(const rb_iseq_t *iseq);
592592

593+
593594
static inline const rb_iseq_t *
594595
rb_iseq_check(const rb_iseq_t *iseq)
595596
{
@@ -1213,6 +1214,8 @@ typedef enum {
12131214
/* iseq.c */
12141215
RUBY_SYMBOL_EXPORT_BEGIN
12151216

1217+
size_t rb_iseq_ic_segments_size(const rb_iseq_t *iseq);
1218+
12161219
/* node -> iseq */
12171220
rb_iseq_t *rb_iseq_new (const VALUE ast_value, VALUE name, VALUE path, VALUE realpath, const rb_iseq_t *parent, enum rb_iseq_type);
12181221
rb_iseq_t *rb_iseq_new_top (const VALUE ast_value, VALUE name, VALUE path, VALUE realpath, const rb_iseq_t *parent);

0 commit comments

Comments
 (0)