Skip to content

Commit

Permalink
Export T_PAYLOAD slots as part of ObjectSpace.dump_all
Browse files Browse the repository at this point in the history
Co-authored-by: peterzhu2118 <peter@peterzhu.ca>
  • Loading branch information
eightbitraptor and peterzhu2118 committed Feb 5, 2021
1 parent f4d7888 commit 3554067
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 2 deletions.
10 changes: 10 additions & 0 deletions ext/objspace/objspace_dump.c
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,12 @@ dump_object(VALUE obj, struct dump_config *dc)
dump_append_ref(dc, obj);

dump_append(dc, ", \"type\":\"");
#if USE_RVARGC
if (rb_is_payload_object(obj)) {
dump_append(dc, "PAYLOAD\" }\n");
return;
}
#endif
dump_append(dc, obj_type(obj));
dump_append(dc, "\"");

Expand Down Expand Up @@ -636,7 +642,11 @@ objspace_dump_all(VALUE os, VALUE output, VALUE full, VALUE since)
}

/* dump all objects */
#if USE_RVARGC
rb_objspace_each_objects_with_payload(heap_i, &dc);
#else
rb_objspace_each_objects(heap_i, &dc);
#endif

return dump_result(&dc);
}
Expand Down
16 changes: 14 additions & 2 deletions gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -830,6 +830,7 @@ typedef struct rb_objspace {
#if USE_RVARGC
struct {
unsigned short requested_slots;
bool dump_payload;
} rvargc;
#endif

Expand Down Expand Up @@ -1620,7 +1621,7 @@ RVALUE_WHITE_P(VALUE obj)
int
rb_is_payload_object(VALUE obj)
{
return !!MARKED_IN_BITMAP(GET_HEAP_PAYLOAD_BITS(obj), obj);
return !!RVALUE_PAYLOAD_BITMAP(obj);
}
#endif

Expand Down Expand Up @@ -3467,8 +3468,9 @@ objspace_each_objects_without_setup(rb_objspace_t *objspace, each_obj_callback *

#if USE_RVARGC
RVALUE *p = pstart;

while (p < pend) {
if (!MARKED_IN_BITMAP(page->payload_bits, p)) {
if (!MARKED_IN_BITMAP(page->payload_bits, p) || objspace->rvargc.dump_payload) {
if ((*callback)(p, p + 1, sizeof(RVALUE), data)) {
break;
}
Expand Down Expand Up @@ -3543,6 +3545,16 @@ rb_objspace_each_objects(each_obj_callback *callback, void *data)
objspace_each_objects(&rb_objspace, callback, data);
}

#if USE_RVARGC
void
rb_objspace_each_objects_with_payload(each_obj_callback *callback, void *data)
{
rb_objspace.rvargc.dump_payload = TRUE;
objspace_each_objects(&rb_objspace, callback, data);
rb_objspace.rvargc.dump_payload = FALSE;
}
#endif

static void
objspace_each_objects(rb_objspace_t *objspace, each_obj_callback *callback, void *data)
{
Expand Down
8 changes: 8 additions & 0 deletions gc.h
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,14 @@ void rb_objspace_each_objects(
int (*callback)(void *start, void *end, size_t stride, void *data),
void *data);

#if USE_RVARGC
void rb_objspace_each_objects_with_payload(
int (*callback)(void *start, void *end, size_t stride, void *data),
void *data);

int rb_is_payload_object(VALUE obj);
#endif

void rb_objspace_each_objects_without_setup(
int (*callback)(void *, void *, size_t, void *),
void *data);
Expand Down

0 comments on commit 3554067

Please sign in to comment.