* gc.c (os_obj_of): heaps may be modified in yield.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16845 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
akr 2008-06-05 13:52:02 +00:00
Родитель eef10d71dd
Коммит 18d4c1f044
2 изменённых файлов: 19 добавлений и 4 удалений

Просмотреть файл

@ -1,3 +1,7 @@
Thu Jun 5 22:50:50 2008 Tanaka Akira <akr@fsij.org>
* gc.c (os_obj_of): heaps may be modified in yield.
Thu Jun 5 21:46:50 2008 Yusuke Endoh <mame@tsg.ne.jp>
* st.c (st_reverse_foreach): comment out unused function.

19
gc.c
Просмотреть файл

@ -1856,9 +1856,19 @@ os_obj_of(rb_objspace_t *objspace, VALUE of)
{
size_t i;
size_t n = 0;
RVALUE *membase = 0;
RVALUE *p, *pend;
volatile VALUE v;
for (i = 0; i < heaps_used; i++) {
RVALUE *p, *pend;
i = 0;
while (i < heaps_used) {
while (0 < i && (uintptr_t)membase < (uintptr_t)heaps[i-1].membase)
i--;
while (i < heaps_used && (uintptr_t)heaps[i].membase <= (uintptr_t)membase )
i++;
if (heaps_used <= i)
break;
membase = heaps[i].membase;
p = heaps[i].slot; pend = p + heaps[i].limit;
for (;p < pend; p++) {
@ -1872,8 +1882,9 @@ os_obj_of(rb_objspace_t *objspace, VALUE of)
if (FL_TEST(p, FL_SINGLETON)) continue;
default:
if (!p->as.basic.klass) continue;
if (!of || rb_obj_is_kind_of((VALUE)p, of)) {
rb_yield((VALUE)p);
v = (VALUE)p;
if (!of || rb_obj_is_kind_of(v, of)) {
rb_yield(v);
n++;
}
}