2010-09-24 12 views
8

En Ruby 1.9 (YARV) se puede obtener un recuento de todos los objetos asignados actualmente, así:¿Cuáles son los significados de las claves hash al llamar a ObjectSpace.count_objects?

ObjectSpace.count_objects 

que devuelve un hash como

{:TOTAL=>1226560, :FREE=>244204, :T_OBJECT=>26141, :T_CLASS=>9819, :T_MODULE=>1420, :T_FLOAT=>287, 
:T_STRING=>260476, :T_REGEXP=>4081, :T_ARRAY=>72269, :T_HASH=>14923, :T_STRUCT=>4601, :T_BIGNUM=>7, 
:T_FILE=>16, :T_DATA=>54553, :T_MATCH=>5, :T_COMPLEX=>1, :T_RATIONAL=>15, :T_NODE=>524818, 
:T_ICLASS=>8924} 

¿Cuál es el significado de estas claves hash? Algunos como T_STRING y T_FILE son obvios. Tengo especial curiosidad por: GRATIS,: T_ICLASS,: T_DATA y: T_NODE.

Respuesta

4

Sólo una conjetura: Asumo :T_ICLASS conteos incluyen clases y :T_NODE quizá podría presentarse a las nodos AST.

He aquí una lista completa (por desgracia sin comentarios):

#define T_NONE RUBY_T_NONE 
#define T_NIL RUBY_T_NIL 
#define T_OBJECT RUBY_T_OBJECT 
#define T_CLASS RUBY_T_CLASS 
#define T_ICLASS RUBY_T_ICLASS 
#define T_MODULE RUBY_T_MODULE 
#define T_FLOAT RUBY_T_FLOAT 
#define T_STRING RUBY_T_STRING 
#define T_REGEXP RUBY_T_REGEXP 
#define T_ARRAY RUBY_T_ARRAY 
#define T_HASH RUBY_T_HASH 
#define T_STRUCT RUBY_T_STRUCT 
#define T_BIGNUM RUBY_T_BIGNUM 
#define T_FILE RUBY_T_FILE 
#define T_FIXNUM RUBY_T_FIXNUM 
#define T_TRUE RUBY_T_TRUE 
#define T_FALSE RUBY_T_FALSE 
#define T_DATA RUBY_T_DATA 
#define T_MATCH RUBY_T_MATCH 
#define T_SYMBOL RUBY_T_SYMBOL 
#define T_RATIONAL RUBY_T_RATIONAL 
#define T_COMPLEX RUBY_T_COMPLEX 
#define T_UNDEF RUBY_T_UNDEF 
#define T_NODE RUBY_T_NODE 
#define T_ZOMBIE RUBY_T_ZOMBIE 
#define T_MASK RUBY_T_MASK 

La enumeración RUBY_T_xyz se define así:

enum ruby_value_type { 
    RUBY_T_NONE = 0x00, 

    RUBY_T_OBJECT = 0x01, 
    RUBY_T_CLASS = 0x02, 
    RUBY_T_MODULE = 0x03, 
    RUBY_T_FLOAT = 0x04, 
    RUBY_T_STRING = 0x05, 
    RUBY_T_REGEXP = 0x06, 
    RUBY_T_ARRAY = 0x07, 
    RUBY_T_HASH = 0x08, 
    RUBY_T_STRUCT = 0x09, 
    RUBY_T_BIGNUM = 0x0a, 
    RUBY_T_FILE = 0x0b, 
    RUBY_T_DATA = 0x0c, 
    RUBY_T_MATCH = 0x0d, 
    RUBY_T_COMPLEX = 0x0e, 
    RUBY_T_RATIONAL = 0x0f, 

    RUBY_T_NIL = 0x11, 
    RUBY_T_TRUE = 0x12, 
    RUBY_T_FALSE = 0x13, 
    RUBY_T_SYMBOL = 0x14, 
    RUBY_T_FIXNUM = 0x15, 

    RUBY_T_UNDEF = 0x1b, 
    RUBY_T_NODE = 0x1c, 
    RUBY_T_ICLASS = 0x1d, 
    RUBY_T_ZOMBIE = 0x1e, 

    RUBY_T_MASK = 0x1f 
}; 

Creo que la mayoría de ellos son bastante obvias. Los únicos que no puedo descifrar son T_DATA (vea el comentario de @ barandilla), T_ZOMBIE y T_MASK.

BTW: Tenga en cuenta que estos son no parte de Ruby 1.9. Ellos son parte de YARV. Podrían ser totalmente diferentes en otras implementaciones de Ruby 1.9 o incluso no existir en total. La documentación indica claramente:

El contenido del hash devuelto es la implementación definida. Puede ser cambiado en el futuro.

De hecho, ni siquiera es la garantía de que el método en sí existe:

no se espera que este método funcione, excepto C Ruby.

(por el cual el autor presumiblemente significa que el método sólo se garantiza que funcione en la RM y YARV.)

+1

y ': T_DATA' es un datos envuelto estructura – horseyguy

1

Puede obtener más información acerca de la categoría T_DATA llamando ObjectSpace.count_tdata_objects (descrito here).

Creo que estos son objetos nativos controlados por la máquina virtual. A veces, las extensiones nativas también pueden asignarlos.

0

Los tipos se describen en el archivo de doc/extension.doc en el código fuente Ruby:

T_NIL  :: nil 
T_OBJECT :: ordinary object 
T_CLASS  :: class 
T_MODULE :: module 
T_FLOAT  :: floating point number 
T_STRING :: string 
T_REGEXP :: regular expression 
T_ARRAY  :: array 
T_HASH  :: associative array 
T_STRUCT :: (Ruby) structure 
T_BIGNUM :: multi precision integer 
T_FIXNUM :: Fixnum(31bit or 63bit integer) 
T_COMPLEX :: complex number 
T_RATIONAL :: rational number 
T_FILE  :: IO 
T_TRUE  :: true 
T_FALSE  :: false 
T_DATA  :: data 
T_SYMBOL :: symbol 

Además, hay varios otros tipos de uso interno:

T_ICLASS :: included module 
T_MATCH  :: MatchData object 
T_UNDEF  :: undefined 
T_NODE  :: syntax tree node 
T_ZOMBIE :: object awaiting finalization 
Cuestiones relacionadas