# \[Feature: trunk\] ObjectSpace.count\_nodes

**URL:** <https://www.ruby-forum.com/t/feature-trunk-objectspace-count-nodes/169989>\
**Category:** Development\
**Created:** [June 11, 2009, 1:08am UTC](https://www.ruby-forum.com/t/feature-trunk-objectspace-count-nodes/169989 "2009-06-11T01:08:10Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![SASADA\_Koichi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f1d935/32.png) [@SASADA\_Koichi](https://www.ruby-forum.com/u/SASADA_Koichi)\
**Post date:** [June 11, 2009, 1:08am UTC](https://www.ruby-forum.com/t/feature-trunk-objectspace-count-nodes/169989/1 "2009-06-11T01:08:10Z")

</div>

e$B!!$5$5$@$G$9!%e(B

e$B!!e(BObjectSpace.count\_objects  
e$B$H$$$&!$%\*%V%8%'%/%H$N\<oN`$r?t$($k%a%=%C%I$,e(B  
e$B$"$j$^$9$,!$F1$8$h$&$Ke(B ObjectSpace.count\_nodes  
e$B$H$$$&$b$N$r2C$($k$N$O$Ie(B  
e$B$&$G$7$g$&$+!%e(B

e$B!!$$$d!$;H$&$N$OB?J,e(B Ruby  
e$B3+H/\<T$@$1$N$h$&$J5$$b$9$k$N$G!$@5D\>$I$&$+$J$!e(B  
e$B$H$b;W$&$s$G$9$,!%e(B

# slot e$B$rA4It=d$k!$e(B st\_each

e$B$\_$?$$$J%$%s%?!\<%U%'!\<%9$,$"$l$P!$e(B

# e$B3HD%%i%$%V%i%j$H$7$F\<BAu$9$k$3$H$bIT2DG=$8$c$J$/$J$k!$e(B

# e$B$1$I!$%3!\<%k%P%C%/%Y!\<%9$@$HCY$$$+$b$J$"!%e(B

e$BMxMQNc!'e(B  
e$B!!Nc$($Pe(B benchmark/bm\_pentomino.rb e$B$r\<B9T$9$k$H!$$J$s$+e(B node  
e$B$,Bt;3=PMhe(B  
e$B$F$$$k$N$,J,$+$k$Ne(B (\*1)  
e$B$G!$$J$\<$@$m$&$+$H2r@O$9$k$3$H$,=PMh$^$9e(B (\*2)e$B!%e(B

_1:  
 [http://www.atdot.net/fp\_store/f.89p1lk/file.g.png](http://www.atdot.net/fp_store/f.89p1lk/file.g.png)  
Xe$B\<4$,;~4V!$:8e(BYe$B\<4$,%_%V%8%'%/%H?t!$1&e(BYe$B\<4$,e(BGCe$B2s?te(B  
1e$BIC$4$H$N%5%s%W%j%s%0!%e(B  
node e$B$N?t$,e(B GC e$B2s?t$K1F6A$7$F$$$k$3$H$,$o$+$ke(B

_2:  
 [http://www.atdot.net/fp\_store/f.eio1lk/file.g.png](http://www.atdot.net/fp_store/f.eio1lk/file.g.png)  
Xe$B\<4$,;~4V!$e(BYe$B\<4$,\>CHqNL!&e(BGCe$B2s?te(B  
1e$BIC$4$H$N%5%s%W%j%s%0!%e(B  
e$B$[$!$e(BNODE\_LITe$B$N@8@.2s?t$Ke(BGCe$B2s?t$,0MB8$7$F$$$k$3$H$,$o$+$k!%e(B  
NODE\_LIT e$B$O!$\<B$Oe(B break  
e$B;~$K%F%s%]%i%j%_%V%8%'%/%H$H$7$F@8@.$5$l$ke(B  
e$B$s$@$1$I!$e(Bpentomino e$B$G$Oe(B break  
e$B$rBt;3$9$k$N$G!$$3$&$$$&$3$H$K$J$k!$e(B  
e$B$H$$$&$3$H$,$o$+$C$?!%e(B

# e$BM\>CL!'e(B

# e$B$8$c$!!$e(Bbreak e$B$N\<BAu$rJQ$($l$P@-G=$,8~\>e$9$k$+$H$$$&$H!$e(B

# GC

e$B$N\<B9T;~4V$Oe(B1e$BICCfe(B0.1e$BIC$/$i$$$J$N$G!$e(B1e$B3d$N@-G=8~\>e$,8+9~$a$k!$e(B

# e$B$+$b$7$l$J$$!%e(B

+static VALUE  
+count\_nodes(int argc, VALUE \*argv, VALUE os)  
+{

- rb\_objspace\_t \*objspace = &rb\_objspace;
- size\_t nodes[NODE\_LAST];
- size\_t i;
- VALUE hash;
- 
- if (rb\_scan\_args(argc, argv, “01”, &hash) == 1) {
- 

```
   if (TYPE(hash) != T_HASH)

```

- 

```
       rb_raise(rb_eTypeError, "non-hash given");

```

- }
- 
- for (i = 0; i \<= NODE\_LAST; i++) {
- nodes[i] = 0;
- }
- 
- for (i = 0; i \< heaps\_used; i++) {
- 

```
   RVALUE *p, *pend;

```

- 
- 

```
   p = heaps[i].slot; pend = p + heaps[i].limit;

```

- 

```
   for (;p < pend; p++) {

```

- 

```
       if (p->as.basic.flags && BUILTIN_TYPE(p) == T_NODE) {

```

- nodes[nd\_type((NODE \*)p)]++;
- 

```
       }

```

- }
- }
- 
- if (hash == Qnil) {
- 

```
   hash = rb_hash_new();

```

- }
- else if (!RHASH\_EMPTY\_P(hash)) {
- 

```
   st_foreach(RHASH_TBL(hash), set_zero, hash);

```

- }
- 
- for (i=0; i\<NODE\_LAST; i++) {
- if (nodes[i] != 0) {
- 

```
 VALUE node;

```

- 

```
 switch (i) {

```

+#define COUNT\_NODE(n) case n: node = ID2SYM(rb\_intern(#n)); break;

- COUNT\_NODE(NODE\_METHOD);
- COUNT\_NODE(NODE\_FBODY);
- COUNT\_NODE(NODE\_CFUNC);
- COUNT\_NODE(NODE\_SCOPE);
- COUNT\_NODE(NODE\_BLOCK);
- COUNT\_NODE(NODE\_IF);
- COUNT\_NODE(NODE\_CASE);
- COUNT\_NODE(NODE\_WHEN);
- COUNT\_NODE(NODE\_OPT\_N);
- COUNT\_NODE(NODE\_WHILE);
- COUNT\_NODE(NODE\_UNTIL);
- COUNT\_NODE(NODE\_ITER);
- COUNT\_NODE(NODE\_FOR);
- COUNT\_NODE(NODE\_BREAK);
- COUNT\_NODE(NODE\_NEXT);
- COUNT\_NODE(NODE\_REDO);
- COUNT\_NODE(NODE\_RETRY);
- COUNT\_NODE(NODE\_BEGIN);
- COUNT\_NODE(NODE\_RESCUE);
- COUNT\_NODE(NODE\_RESBODY);
- COUNT\_NODE(NODE\_ENSURE);
- COUNT\_NODE(NODE\_AND);
- COUNT\_NODE(NODE\_OR);
- COUNT\_NODE(NODE\_MASGN);
- COUNT\_NODE(NODE\_LASGN);
- COUNT\_NODE(NODE\_DASGN);
- COUNT\_NODE(NODE\_DASGN\_CURR);
- COUNT\_NODE(NODE\_GASGN);
- COUNT\_NODE(NODE\_IASGN);
- COUNT\_NODE(NODE\_IASGN2);
- COUNT\_NODE(NODE\_CDECL);
- COUNT\_NODE(NODE\_CVASGN);
- COUNT\_NODE(NODE\_CVDECL);
- COUNT\_NODE(NODE\_OP\_ASGN1);
- COUNT\_NODE(NODE\_OP\_ASGN2);
- COUNT\_NODE(NODE\_OP\_ASGN\_AND);
- COUNT\_NODE(NODE\_OP\_ASGN\_OR);
- COUNT\_NODE(NODE\_CALL);
- COUNT\_NODE(NODE\_FCALL);
- COUNT\_NODE(NODE\_VCALL);
- COUNT\_NODE(NODE\_SUPER);
- COUNT\_NODE(NODE\_ZSUPER);
- COUNT\_NODE(NODE\_ARRAY);
- COUNT\_NODE(NODE\_ZARRAY);
- COUNT\_NODE(NODE\_VALUES);
- COUNT\_NODE(NODE\_HASH);
- COUNT\_NODE(NODE\_RETURN);
- COUNT\_NODE(NODE\_YIELD);
- COUNT\_NODE(NODE\_LVAR);
- COUNT\_NODE(NODE\_DVAR);
- COUNT\_NODE(NODE\_GVAR);
- COUNT\_NODE(NODE\_IVAR);
- COUNT\_NODE(NODE\_CONST);
- COUNT\_NODE(NODE\_CVAR);
- COUNT\_NODE(NODE\_NTH\_REF);
- COUNT\_NODE(NODE\_BACK\_REF);
- COUNT\_NODE(NODE\_MATCH);
- COUNT\_NODE(NODE\_MATCH2);
- COUNT\_NODE(NODE\_MATCH3);
- COUNT\_NODE(NODE\_LIT);
- COUNT\_NODE(NODE\_STR);
- COUNT\_NODE(NODE\_DSTR);
- COUNT\_NODE(NODE\_XSTR);
- COUNT\_NODE(NODE\_DXSTR);
- COUNT\_NODE(NODE\_EVSTR);
- COUNT\_NODE(NODE\_DREGX);
- COUNT\_NODE(NODE\_DREGX\_ONCE);
- COUNT\_NODE(NODE\_ARGS);
- COUNT\_NODE(NODE\_ARGS\_AUX);
- COUNT\_NODE(NODE\_OPT\_ARG);
- COUNT\_NODE(NODE\_POSTARG);
- COUNT\_NODE(NODE\_ARGSCAT);
- COUNT\_NODE(NODE\_ARGSPUSH);
- COUNT\_NODE(NODE\_SPLAT);
- COUNT\_NODE(NODE\_TO\_ARY);
- COUNT\_NODE(NODE\_BLOCK\_ARG);
- COUNT\_NODE(NODE\_BLOCK\_PASS);
- COUNT\_NODE(NODE\_DEFN);
- COUNT\_NODE(NODE\_DEFS);
- COUNT\_NODE(NODE\_ALIAS);
- COUNT\_NODE(NODE\_VALIAS);
- COUNT\_NODE(NODE\_UNDEF);
- COUNT\_NODE(NODE\_CLASS);
- COUNT\_NODE(NODE\_MODULE);
- COUNT\_NODE(NODE\_SCLASS);
- COUNT\_NODE(NODE\_COLON2);
- COUNT\_NODE(NODE\_COLON3);
- COUNT\_NODE(NODE\_DOT2);
- COUNT\_NODE(NODE\_DOT3);
- COUNT\_NODE(NODE\_FLIP2);
- COUNT\_NODE(NODE\_FLIP3);
- COUNT\_NODE(NODE\_ATTRSET);
- COUNT\_NODE(NODE\_SELF);
- COUNT\_NODE(NODE\_NIL);
- COUNT\_NODE(NODE\_TRUE);
- COUNT\_NODE(NODE\_FALSE);
- COUNT\_NODE(NODE\_ERRINFO);
- COUNT\_NODE(NODE\_DEFINED);
- COUNT\_NODE(NODE\_POSTEXE);
- COUNT\_NODE(NODE\_ALLOCA);
- COUNT\_NODE(NODE\_BMETHOD);
- COUNT\_NODE(NODE\_MEMO);
- COUNT\_NODE(NODE\_IFUNC);
- COUNT\_NODE(NODE\_DSYM);
- COUNT\_NODE(NODE\_ATTRASGN);
- COUNT\_NODE(NODE\_PRELUDE);
- COUNT\_NODE(NODE\_LAMBDA);
- COUNT\_NODE(NODE\_OPTBLOCK);  
+#undef COUNT\_NODE
- 

```
   default: node = INT2FIX(nodes[i]);

```

- 

```
 }

```

- 

```
 rb_hash_aset(hash, node, SIZET2NUM(nodes[i]));

```

- }
- }
- return hash;  
+}

---

<div class="post-metadata">

**Author:** ![SASADA\_Koichi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f1d935/32.png) [@SASADA\_Koichi](https://www.ruby-forum.com/u/SASADA_Koichi)\
**Post date:** [June 11, 2009, 5:29am UTC](https://www.ruby-forum.com/t/feature-trunk-objectspace-count-nodes/169989/2 "2009-06-11T05:29:38Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:38584] [Feature: trunk]  
ObjectSpace.count\_nodes”  
on Thu, 11 Jun 2009 08:05:56 +0900, SASADA Koichi [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
writes:

|e$B!!e(BObjectSpace.count\_objects e$B$H$$$&!$%\*%V%8%'%/%H$N\<oN`$r?t$($k%a%=%C%I$,e(B  
|e$B$"$j$^$9$,!$F1$8$h$&$Ke(B ObjectSpace.count\_nodes e$B$H$$$&$b$N$r2C$($k$N$O$Ie(B  
|e$B$&$G$7$g$&$+!%e(B  
|  
|e$B!!$$$d!$;H$&$N$OB?J,e(B Ruby e$B3+H/\<T$@$1$N$h$&$J5$$b$9$k$N$G!$@5D\>$I$&$+$J$!e(B  
|e$B$H$b;W$&$s$G$9$,!%e(B

e$B!Ve(Bnodee$B$,B8:\_$9$k!W$H$$$&$N$OFCDj$N\<BAu$K0MB8$9$kOC$G$9$N$G!“e(B  
e$B%a%=%C%I$H$7$FDI2C$9$k$N$O$I$&$+$H;W$$$^$9!#4X?t$rMQ0U$7$Fe(B  
e$B$\*$$$F!“3HD%%i%$%V%i%j$G%a%=%C%I$H$7$FEPO?$9$k$J$i$”$j$J$s$8$ce(B  
e$B$J$$$+$J$”!#e(B
