Skip to content

Commit acbf55c

Browse files
Expose rb_obj_seen_id to objspace_dump
1 parent c4f0927 commit acbf55c

5 files changed

Lines changed: 109 additions & 9 deletions

File tree

ext/objspace/objspace_dump.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -636,6 +636,11 @@ dump_object(VALUE obj, struct dump_config *dc)
636636
dump_append_sizet(dc, memsize);
637637
}
638638

639+
if (rb_obj_id_seen_p(obj)) {
640+
dump_append(dc, ", \"object_id\":");
641+
dump_append_lu(dc, RB_NUM2ULONG(rb_obj_id(obj)));
642+
}
643+
639644
struct rb_gc_object_metadata_entry *gc_metadata = rb_gc_object_metadata(obj);
640645
for (int i = 0; gc_metadata[i].name != 0; i++) {
641646
if (i == 0) {

gc.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -665,6 +665,7 @@ typedef struct gc_function_map {
665665
// Object ID
666666
VALUE (*object_id)(void *objspace_ptr, VALUE obj);
667667
VALUE (*object_id_to_ref)(void *objspace_ptr, VALUE object_id);
668+
bool (*object_id_seen_p)(VALUE obj);
668669
// Forking
669670
void (*before_fork)(void *objspace_ptr);
670671
void (*after_fork)(void *objspace_ptr, rb_pid_t pid);
@@ -842,6 +843,7 @@ ruby_modular_gc_init(void)
842843
// Object ID
843844
load_modular_gc_func(object_id);
844845
load_modular_gc_func(object_id_to_ref);
846+
load_modular_gc_func(object_id_seen_p);
845847
// Forking
846848
load_modular_gc_func(before_fork);
847849
load_modular_gc_func(after_fork);
@@ -925,6 +927,7 @@ ruby_modular_gc_init(void)
925927
// Object ID
926928
# define rb_gc_impl_object_id rb_gc_functions.object_id
927929
# define rb_gc_impl_object_id_to_ref rb_gc_functions.object_id_to_ref
930+
# define rb_gc_impl_object_id_seen_p rb_gc_functions.object_id_seen_p
928931
// Forking
929932
# define rb_gc_impl_before_fork rb_gc_functions.before_fork
930933
# define rb_gc_impl_after_fork rb_gc_functions.after_fork
@@ -1887,6 +1890,12 @@ rb_obj_id(VALUE obj)
18871890
return rb_find_object_id(rb_gc_get_objspace(), obj, rb_gc_impl_object_id);
18881891
}
18891892

1893+
bool
1894+
rb_obj_id_seen_p(VALUE obj)
1895+
{
1896+
return rb_gc_impl_object_id_seen_p(obj);
1897+
}
1898+
18901899
static enum rb_id_table_iterator_result
18911900
cc_table_memsize_i(VALUE ccs_ptr, void *data_ptr)
18921901
{

gc/default/default.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -834,8 +834,8 @@ RVALUE_AGE_GET(VALUE obj)
834834
return RVALUE_METADATA(obj)->age;
835835
}
836836

837-
static bool
838-
RVALUE_SEEN_OBJ_ID(VALUE obj)
837+
bool
838+
rb_gc_impl_object_id_seen_p(VALUE obj)
839839
{
840840
return RVALUE_METADATA(obj)->seen_obj_id;
841841
}
@@ -1584,7 +1584,7 @@ rb_gc_impl_object_id(void *objspace_ptr, VALUE obj)
15841584
rb_objspace_t *objspace = objspace_ptr;
15851585

15861586
unsigned int lev = rb_gc_vm_lock();
1587-
if (RVALUE_SEEN_OBJ_ID(obj)) {
1587+
if (rb_gc_impl_object_id_seen_p(obj)) {
15881588
st_data_t val;
15891589
if (st_lookup(objspace->obj_to_id_tbl, (st_data_t)obj, &val)) {
15901590
id = (VALUE)val;
@@ -2656,7 +2656,7 @@ obj_free_object_id(rb_objspace_t *objspace, VALUE obj)
26562656
{
26572657
st_data_t o = (st_data_t)obj, id;
26582658

2659-
GC_ASSERT(BUILTIN_TYPE(obj) == T_NONE || RVALUE_SEEN_OBJ_ID(obj));
2659+
GC_ASSERT(BUILTIN_TYPE(obj) == T_NONE || rb_gc_impl_object_id_seen_p(obj));
26602660
RVALUE_METADATA(obj)->seen_obj_id = false;
26612661

26622662
if (st_delete(objspace->obj_to_id_tbl, &o, &id)) {
@@ -2890,7 +2890,7 @@ rb_gc_impl_copy_finalizer(void *objspace_ptr, VALUE dest, VALUE obj)
28902890
static VALUE
28912891
get_object_id_in_finalizer(rb_objspace_t *objspace, VALUE obj)
28922892
{
2893-
if (RVALUE_SEEN_OBJ_ID(obj)) {
2893+
if (rb_gc_impl_object_id_seen_p(obj)) {
28942894
return rb_gc_impl_object_id(objspace, obj);
28952895
}
28962896
else {
@@ -2946,7 +2946,7 @@ finalize_list(rb_objspace_t *objspace, VALUE zombie)
29462946
int lev = rb_gc_vm_lock();
29472947
{
29482948
GC_ASSERT(BUILTIN_TYPE(zombie) == T_ZOMBIE);
2949-
if (RVALUE_SEEN_OBJ_ID(zombie)) {
2949+
if (rb_gc_impl_object_id_seen_p(zombie)) {
29502950
obj_free_object_id(objspace, zombie);
29512951
}
29522952

@@ -3554,7 +3554,7 @@ gc_sweep_plane(rb_objspace_t *objspace, rb_heap_t *heap, uintptr_t p, bits_t bit
35543554

35553555
rb_gc_event_hook(vp, RUBY_INTERNAL_EVENT_FREEOBJ);
35563556

3557-
bool has_object_id = RVALUE_SEEN_OBJ_ID(vp);
3557+
bool has_object_id = rb_gc_impl_object_id_seen_p(vp);
35583558
rb_gc_obj_free_vm_weak_references(vp);
35593559
if (rb_gc_obj_free(objspace, vp)) {
35603560
if (has_object_id) {
@@ -6239,7 +6239,7 @@ rb_gc_impl_object_metadata(void *objspace_ptr, VALUE obj)
62396239
if (RVALUE_MARKING(objspace, obj)) SET_ENTRY(marking, Qtrue);
62406240
if (RVALUE_MARKED(objspace, obj)) SET_ENTRY(marked, Qtrue);
62416241
if (RVALUE_PINNED(objspace, obj)) SET_ENTRY(pinned, Qtrue);
6242-
if (RVALUE_SEEN_OBJ_ID(obj)) SET_ENTRY(object_id, rb_obj_id(obj));
6242+
if (rb_gc_impl_object_id_seen_p(obj)) SET_ENTRY(object_id, rb_obj_id(obj));
62436243

62446244
object_metadata_entries[n].name = 0;
62456245
object_metadata_entries[n].val = 0;
@@ -6957,7 +6957,7 @@ gc_move(rb_objspace_t *objspace, VALUE src, VALUE dest, size_t src_slot_size, si
69576957
CLEAR_IN_BITMAP(GET_HEAP_UNCOLLECTIBLE_BITS(src), src);
69586958
CLEAR_IN_BITMAP(GET_HEAP_PAGE(src)->remembered_bits, src);
69596959

6960-
if (RVALUE_SEEN_OBJ_ID(src)) {
6960+
if (rb_gc_impl_object_id_seen_p(src)) {
69616961
/* If the source object's object_id has been seen, we need to update
69626962
* the object to object id mapping. */
69636963
st_data_t srcid = (st_data_t)src, id;

gc/default/exts.mk

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
V = 0
2+
V0 = $(V:0=)
3+
Q1 = $(V:1=)
4+
Q = $(Q1:0=@)
5+
ECHO1 = $(V:1=@:)
6+
ECHO = $(ECHO1:0=@echo)
7+
override MFLAGS := $(filter-out -j%,$(MFLAGS))
8+
ext_build_dir = gc/default
9+
10+
ruby = $(topdir)/miniruby -I'$(topdir)' -I'$(top_srcdir)/lib' \
11+
-I'$(extout)/$(arch)' -I'$(extout)/common'
12+
RUBY = $(ruby)
13+
extensions = gc/default/.
14+
EXTOBJS = dmyext.o
15+
EXTLIBS =
16+
EXTSO =
17+
EXTLDFLAGS =
18+
EXTINITS =
19+
SUBMAKEOPTS = EXTOBJS="$(EXTOBJS) $(EXTENCS)" EXTLIBS="$(EXTLIBS)" \
20+
EXTLDFLAGS="$(EXTLDFLAGS)" EXTINITS="$(EXTINITS)" \
21+
SHOWFLAGS=
22+
NOTE_MESG = $(RUBY) $(top_srcdir)/tool/lib/colorize.rb skip
23+
NOTE_NAME = $(RUBY) $(top_srcdir)/tool/lib/colorize.rb fail
24+
RM = rm -f
25+
RMDIRS = rmdir -p
26+
RMDIR = rmdir
27+
RMALL = rm -fr
28+
MESSAGE_BEGIN = @for line in
29+
MESSAGE_END = ; do echo "$$line"; done
30+
31+
all: $(extensions:/.=/all)
32+
all: note
33+
install: $(extensions:/.=/install)
34+
install: note
35+
static: $(extensions:/.=/static)
36+
static: note
37+
install-so: $(extensions:/.=/install-so)
38+
install-so: note
39+
install-rb: $(extensions:/.=/install-rb)
40+
install-rb: note
41+
clean: $(extensions:/.=/clean)
42+
distclean: $(extensions:/.=/distclean)
43+
realclean: $(extensions:/.=/realclean)
44+
45+
clean:
46+
-$(Q)$(RM) ext/extinit.o
47+
distclean:
48+
-$(Q)$(RM) ext/extinit.c
49+
50+
ruby: $(extensions:/.=/all)
51+
all static: ruby
52+
ruby: $(EXTOBJS)
53+
ruby:
54+
$(Q)$(MAKE) $(MFLAGS) $(SUBMAKEOPTS) $@
55+
libencs:
56+
$(Q)$(MAKE) -f enc.mk V=$(V) $@
57+
58+
gc/default/all:
59+
$(Q)$(MAKE) -C $(@D) $(MFLAGS) V=$(V) $(@F)
60+
gc/default/install:
61+
$(Q)$(MAKE) -C $(@D) $(MFLAGS) V=$(V) $(@F)
62+
gc/default/static:
63+
$(Q)$(MAKE) -C $(@D) $(MFLAGS) V=$(V) $(@F)
64+
gc/default/install-so:
65+
$(Q)$(MAKE) -C $(@D) $(MFLAGS) V=$(V) $(@F)
66+
gc/default/install-rb:
67+
$(Q)$(MAKE) -C $(@D) $(MFLAGS) V=$(V) $(@F)
68+
gc/default/clean: clean-local
69+
$(Q)$(MAKE) -C $(@D) $(MFLAGS) V=$(V) $(@F)
70+
gc/default/distclean: clean-local
71+
$(Q)$(MAKE) -C $(@D) $(MFLAGS) V=$(V) $(@F)
72+
$(Q)$(RM) $(ext_build_dir)/exts.mk
73+
$(Q)$(RMDIRS) $(@D)
74+
gc/default/realclean: clean-local
75+
$(Q)$(MAKE) -C $(@D) $(MFLAGS) V=$(V) $(@F)
76+
$(Q)$(RM) $(ext_build_dir)/exts.mk
77+
$(Q)$(RMDIRS) $(@D)
78+
79+
clean-local:
80+
$(Q)$(RM) $(ext_build_dir)/*~ $(ext_build_dir)/*.bak $(ext_build_dir)/core
81+
82+
extso:
83+
@echo EXTSO=$(EXTSO)
84+
85+
note:

internal/gc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ VALUE rb_wb_protected_newobj_of(struct rb_execution_context_struct *, VALUE, VAL
252252
VALUE rb_wb_unprotected_newobj_of(VALUE, VALUE, size_t);
253253
size_t rb_obj_memsize_of(VALUE);
254254
struct rb_gc_object_metadata_entry *rb_gc_object_metadata(VALUE obj);
255+
bool rb_obj_id_seen_p(VALUE obj);
255256
void rb_gc_mark_values(long n, const VALUE *values);
256257
void rb_gc_mark_vm_stack_values(long n, const VALUE *values);
257258
void rb_gc_update_values(long n, VALUE *values);

0 commit comments

Comments
 (0)