[email protected]$G$9!%e(B
e$B!!e(BC e$B%l%Y%k$Ge(B ObjectSpace.each_object
e$BAjEv$N=hM}$r$9$k$?$a$Ne(B C API e$B$r:n$ke(B
e$B$N$O$I$&$G$7$g$&$+!%F05!$O!$e(B[ruby-dev:38584]
e$B$GDs0F$7$?5!G=$r!$e(Bgc.c e$B$K<je(B
e$B$rF~$l$:$K:n$k$?$a$G$9!%e(B
e$B!!%$%s%?!<%U%’%90F$G$9!%e(B
void rb_objspace_each_objects(
int (*func)(VALUE *start, VALUE *end, void *data),
void *data)
e$B!!e(BObjectSpace.each_object
e$B$H0c$$!$e(B1e$B$D$:$D%3!<%k%P%C%/4X?t$KEO$9$N$G$O$Je(B
e$B$/!$$"$k$^$H$^$C$?C10L$4$H$K2?EY$+%3!<%k%P%C%/4X?t$KEO$5$l$^$9!%HO0O$Oe(B
start e$B$+$ie(B end e$B$^$G!%EO$5$l$k%*%V%8%’%/%H$O!$e(Bfree
e$B$5$l$?e(B cell e$B$r4^$s$G$$e(B
[email protected]$,$"$j$^$9!%$3$N>l9g!$e(Bflags
e$B$r%A%’%C%/$9$kI,MW$,$"$j$^$9!%e(B
e$B!v$^[email protected]=>e$NM}M3$G$9!%e(B
e$B!!e(B1e$B$De([email protected]=Dc2<$,8+$i$l$^$7$?!%e(B
e$B!!<BAu$r0l1~$D$1$F$*$-$^$9!%$D$$$G$K!$e(Bos_obj_of()
e$B$r$3$l$G=q$-49$($F$_$^e(B
e$B$7$?!%e(B
e$B!ve(BST_CONTINUE e$B$_$?$$$J$N$r;H$C$F$7$^$C$?$s$G$9$,!$e(B
e$B!!$3$l$O9T57$,0-$$5$$,$9$k!%$I$&$9$k$Y$-!)e(B
e$B!!$$$+$,$G$7$g$&$+!%e(B
Index: gc.c
— gc.c (e$B%j%S%8%g%se(B 23682)
+++ gc.c (e$B:n6H%3%T!<e(B)
@@ -2383,13 +2523,13 @@ Init_heap(void)
init_heap(&rb_objspace);
}
-static VALUE
-os_obj_of(rb_objspace_t *objspace, VALUE of)
+void
+rb_objspace_each_objects(int (*func)(VALUE *start, VALUE *end, void *),
void *data)
{
size_t i;
- size_t n = 0;
RVALUE *membase = 0; - RVALUE *p, *pend;
-
RVALUE *pstart, *pend;
-
rb_objspace_t *objspace = &rb_objspace;
volatile VALUE v;i = 0;
@@ -2402,30 +2542,70 @@ os_obj_of(rb_objspace_t *objspace, VALUE
break;
membase = heaps[i].membase;
- p = heaps[i].slot; pend = p + heaps[i].limit;
- for (;p < pend; p++) {
- pstart = heaps[i].slot;
- pend = pstart + heaps[i].limit;
- for (; pstart != pend; pstart++) {
-
if (pstart->as.basic.flags) {
- v = (VALUE )pstart; / acquire to save this object */
- break;
-
}
- }
- if (pstart != pend) {
-
if ((*func)((VALUE *)pstart, (VALUE *)pend, data) != ST_CONTINUE)
{
- return;
-
}
- }
- }
- return;
+}
+struct os_each_struct {
- size_t num;
- VALUE of;
+};
+static int
+os_obj_of_i(VALUE *vstart, VALUE *vend, void *data)
+{
- struct os_each_struct *oes = (struct os_each_struct *)data;
- RVALUE *p, *pend;
- VALUE v;
- for (p = (RVALUE *)vstart, pend = (RVALUE *)vend; p != pend; p++) {
if (p->as.basic.flags) {
switch (BUILTIN_TYPE§) {
case T_NONE:
case T_ICLASS:
case T_NODE:
case T_ZOMBIE:
-
continue;
- break;
case T_CLASS:
-
if (FL_TEST(p, FL_SINGLETON)) continue;
- if (FL_TEST(p, FL_SINGLETON))
-
break; default:
-
if (!p->as.basic.klass) continue;
- if (!p->as.basic.klass) break;
v = (VALUE)p;
-
if (!of || rb_obj_is_kind_of(v, of)) {
- if (!oes->of || rb_obj_is_kind_of(v, oes->of)) {
rb_yield(v);
-
n++;
-
}oes->num++; }
}
} - return ST_CONTINUE;
}
- return SIZET2NUM(n);
+static VALUE
+os_obj_of(VALUE of)
+{
- struct os_each_struct oes;
- oes.num = 0;
- oes.of = of;
- rb_objspace_each_objects(os_obj_of_i, &oes);
- return SIZET2NUM(oes.num);
}
/*
@@ -2474,7 +2654,7 @@ os_each_obj(int argc, VALUE *argv, VALUE
rb_scan_args(argc, argv, “01”, &of);
}
RETURN_ENUMERATOR(os, 1, &of);
- return os_obj_of(&rb_objspace, of);
- return os_obj_of(of);
}
/*