2010-09-24 3 views
8

Dans Ruby 1.9 (YARV) vous pouvez obtenir un compte de tous les objets actuellement attribués comme ceci:Quelles sont les significations des clés de hachage lors de l'appel de ObjectSpace.count_objects?

ObjectSpace.count_objects 

qui retourne un hachage comme

{: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} 

Quelle est la signification de ces clés de hachage? Certains comme T_STRING et T_FILE sont évidents. Je suis particulièrement curieux à propos de: FREE,: T_ICLASS,: T_DATA, et: T_NODE.

Répondre

4

Juste une supposition: Je suppose que :T_ICLASS compte comprennent des cours et :T_NODE pourrait peut-être représenter nœuds AST.

Voici une liste complète (malheureusement sans commentaires):

#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 

Le RUBY_T_xyz ENUM est défini comme ceci:

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 
}; 

Je pense que la plupart des personnes sont assez évidentes. Les seuls que je ne peux pas comprendre sont T_DATA (voir le commentaire de @ balister), T_ZOMBIE et T_MASK.

BTW: Notez que ce sont pas partie de Ruby 1.9. Ils font partie de YARV. Ils peuvent être totalement différents sur d'autres implémentations de Ruby 1.9 ou même n'existent pas du tout. La documentation indique clairement:

Le contenu du hachage retourné est défini par l'implémentation. Il peut être changé à l'avenir.

En fait, il est même pas garanti que la méthode elle-même existe:

Cette méthode ne devrait pas travailler, sauf C Ruby.

(par lequel l'auteur signifie sans doute que la méthode ne peut être garanti pour travailler sur l'IRM et YARV.)

+1

et ': T_DATA' est enveloppé des données struct – horseyguy

1

Vous pouvez obtenir plus d'informations sur la catégorie T_DATA en appelant ObjectSpace.count_tdata_objects (décrit here). Je crois que ce sont des objets natifs contrôlés par la machine virtuelle. Parfois, les extensions natives peuvent également les allouer.

0

Les types sont décrits dans le fichier doc/extension.doc dans le code source 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 

En outre, il existe plusieurs autres types utilisés en interne:

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