summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorAaron Patterson <tenderlove@ruby-lang.org>2020-10-06 13:17:21 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2020-10-06 16:22:01 -0700
commitcdc4084b0a947b87a794394b9cc8cbdb10537146 (patch)
treeddc6d2f5edb91ea0094d045be2223609c1486cfa /ext
parentc839168b1141db53bedef771d1bc78908b6ac782 (diff)
Prevent objects from moving while iterating the heap
This iterator uses an st_table, but if objects move the references in the st table won't be updated. This patch just changes the st table to an identity hash.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/3634
Diffstat (limited to 'ext')
-rw-r--r--ext/objspace/objspace.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/ext/objspace/objspace.c b/ext/objspace/objspace.c
index e5b98a6aa6..0930e10e92 100644
--- a/ext/objspace/objspace.c
+++ b/ext/objspace/objspace.c
@@ -25,6 +25,10 @@
#include "ruby/st.h"
#include "symbol.h"
+#undef rb_funcall
+
+#include "ruby/ruby.h"
+
/*
* call-seq:
* ObjectSpace.memsize_of(obj) -> Integer
@@ -707,7 +711,7 @@ iow_internal_object_id(VALUE self)
}
struct rof_data {
- st_table *refs;
+ VALUE refs;
VALUE internals;
};
@@ -723,7 +727,7 @@ reachable_object_from_i(VALUE obj, void *data_ptr)
val = iow_newobj(obj);
rb_ary_push(data->internals, val);
}
- st_insert(data->refs, key, val);
+ rb_hash_aset(data->refs, key, val);
}
}
@@ -781,20 +785,18 @@ static VALUE
reachable_objects_from(VALUE self, VALUE obj)
{
if (rb_objspace_markable_object_p(obj)) {
- VALUE ret = rb_ary_new();
struct rof_data data;
if (rb_typeddata_is_kind_of(obj, &iow_data_type)) {
obj = (VALUE)DATA_PTR(obj);
}
- data.refs = st_init_numtable();
+ data.refs = rb_ident_hash_new();
data.internals = rb_ary_new();
rb_objspace_reachable_objects_from(obj, reachable_object_from_i, &data);
- st_foreach(data.refs, collect_values, (st_data_t)ret);
- return ret;
+ return rb_funcall(data.refs, rb_intern("values"), 0);
}
else {
return Qnil;