stx/gdb/objects/__init__.py
changeset 4 ca45a88235bd
parent 2 ef575a931434
equal deleted inserted replaced
3:b3e318335eed 4:ca45a88235bd
    26         '''
    26         '''
    27         return self.display_string()
    27         return self.display_string()
    28 
    28 
    29     def __repr__(self):
    29     def __repr__(self):
    30         return self.display_string()
    30         return self.display_string()
    31     
    31 
    32     def display_string(self):
    32     def display_string(self):
    33         try:
    33         try:
    34             value = self.display_value()
    34             value = self.display_value()
    35             klassName = '???'
    35             klassName = '???'
    36             
    36 
    37             klass = self.klass
    37             klass = self.klass
    38             if klass == None:
    38             if klass == None:
    39                 klassName = '?None?'
    39                 klassName = '?None?'
    40             else:
    40             else:
    41                 klassName = klass.name
    41                 klassName = klass.name
    42             if (value == None):
    42             if (value == None):
    43                 return "0x%08x (%s)" % ( self.address , klassName )            
    43                 return "0x%08x (%s)" % ( self.address , klassName )
    44             else:
    44             else:
    45                 return "0x%08x (%s %s)" % ( self.address , klassName , value )
    45                 return "0x%08x (%s %s)" % ( self.address , klassName , value )
    46         except:
    46         except:
       
    47             survStartPtr = long(gdb.parse_and_eval("__survStartPtr"))
       
    48             survEndPtr = long(gdb.parse_and_eval("__survEndPtr"))
       
    49             if (survStartPtr <= self.address and self.address <= survEndPtr):
       
    50                 return "0x%08x (** survivor **)" % self.address
    47             return "0x%08x (** err **)" % self.address
    51             return "0x%08x (** err **)" % self.address
    48 
    52 
    49     def display_value(self):
    53     def display_value(self):
    50         '''
    54         '''
    51         Return a human-readable represenation of object's value, if sensible.
    55         Return a human-readable represenation of object's value, if sensible.
    68     @property
    72     @property
    69     def size(self):
    73     def size(self):
    70         '''Return size of the objects in slots (excluding header)'''
    74         '''Return size of the objects in slots (excluding header)'''
    71         # Not really 64bit safe...
    75         # Not really 64bit safe...
    72         return (self.size_b() - 12) / 4
    76         return (self.size_b() - 12) / 4
    73     
    77 
    74     def size_b(self):
    78     def size_b(self):
    75         '''Return size of the object in bytes, including header'''
    79         '''Return size of the object in bytes, including header'''
    76         return self._obj['o_size']                
    80         return self._obj['o_size']
    77 
    81 
    78     @property
    82     @property
    79     def flags(self):
    83     def flags(self):
    80         return self._obj['o_flags']
    84         return self._obj['o_flags']
    81 
    85 
    82 
    86 
    83 # Some flags defined in stc.h. 
    87 # Some flags defined in stc.h.
    84 # !!! MAKE SURE they are in sync !!!
    88 # !!! MAKE SURE they are in sync !!!
    85 
    89 
    86 BYTEARRAY       = 1
    90 BYTEARRAY       = 1
    87 WORDARRAY       = 2
    91 WORDARRAY       = 2
    88 LONGARRAY       = 3
    92 LONGARRAY       = 3
    94 SLONGARRAY      = 9
    98 SLONGARRAY      = 9
    95 LONGLONGARRAY   = 10
    99 LONGLONGARRAY   = 10
    96 SLONGLONGARRAY  = 11
   100 SLONGLONGARRAY  = 11
    97 #
   101 #
    98 # reserved:       13-15
   102 # reserved:       13-15
    99 # 
   103 #
   100 
   104 
   101 ARRAYMASK       = 0x0F
   105 ARRAYMASK       = 0x0F
   102 
   106 
   103 BEHAVIOR_INSTS  = 0x0010
   107 BEHAVIOR_INSTS  = 0x0010
   104 FLOAT_INSTS     = 0x0020  
   108 FLOAT_INSTS     = 0x0020
   105 BLOCK_INSTS     = 0x0040  
   109 BLOCK_INSTS     = 0x0040
   106 METHOD_INSTS    = 0x0080  
   110 METHOD_INSTS    = 0x0080
   107 CONTEXT_INSTS   = 0x0100  
   111 CONTEXT_INSTS   = 0x0100
   108 BCONTEXT_INSTS  = 0x0200  
   112 BCONTEXT_INSTS  = 0x0200
   109 SYMBOL_INSTS    = 0x0400  
   113 SYMBOL_INSTS    = 0x0400
   110 
   114 
   111 NONOBJECT_INSTS = 0x0800  
   115 NONOBJECT_INSTS = 0x0800
   112 EXTERNALBYTES_INSTS = 0x1000 
   116 EXTERNALBYTES_INSTS = 0x1000
   113 EXTFUNC_INSTS   = 0x010000
   117 EXTFUNC_INSTS   = 0x010000
   114 
   118 
   115 
   119 
   116 
   120 
   117 def create(val):
   121 def create(val):
   118     import stx.gdb.objects.stx_libbasic
   122     import stx.gdb.objects.stx_libbasic
   119     addr = long(val)
   123     addr = long(val)
   120     
   124 
   121     # Here we should care for free/non objects
   125     # Here we should care for free/non objects
   122     # by comparing address agains newspace
   126     # by comparing address agains newspace
   123     # boundaries. 
   127     # boundaries.
   124     # Well, later :-)
   128     # Well, later :-)
   125 
   129 
   126     if (addr == 0):
   130     if (addr == 0):
   127         return stx.gdb.objects.stx_libbasic.nil
   131         return stx.gdb.objects.stx_libbasic.nil
   128 
   132 
   129     if ((addr & 1) == 1):
   133     if ((addr & 1) == 1):
   130         return stx.gdb.objects.stx_libbasic.SmallInteger(val)    
   134         return stx.gdb.objects.stx_libbasic.SmallInteger(val)
   131     flags = long(val['o_class']['i_instvars'][1])
   135     flags = long(val['o_class']['i_instvars'][1])
   132     if ((flags & 1) == 1):
   136     if ((flags & 1) == 1):
   133         flags = flags >> 1
   137         flags = flags >> 1
   134     else:
   138     else:
   135         raise Exception("Memory corruption? Class flags are not SmallInteger.")
   139         raise Exception("Memory corruption? Class flags are not SmallInteger.")
   136     
   140 
   137     if ((flags & BEHAVIOR_INSTS) != 0):
   141     if ((flags & BEHAVIOR_INSTS) != 0):
   138         # Care for anonymous classes    
   142         # Care for anonymous classes
   139         size = (val['o_size'] - 12) / 4 # Not 64bit safe        
   143         size = (val['o_size'] - 12) / 4 # Not 64bit safe
   140         if (size == 5):
   144         if (size == 5):
   141             return stx.gdb.objects.stx_libbasic.Behavior(val)
   145             return stx.gdb.objects.stx_libbasic.Behavior(val)
   142         if (size == 6):
   146         if (size == 6):
   143             return stx.gdb.objects.stx_libbasic.ClassDescription(val)
   147             return stx.gdb.objects.stx_libbasic.ClassDescription(val)
   144         if (size >= 17):
   148         if (size >= 17):
   145             return stx.gdb.objects.stx_libbasic.Class(val)            
   149             return stx.gdb.objects.stx_libbasic.Class(val)
   146         if (size >= 7):
   150         if (size >= 7):
   147             return stx.gdb.objects.stx_libbasic.Metaclass(val)            
   151             return stx.gdb.objects.stx_libbasic.Metaclass(val)
   148 
   152 
   149         raise Exception("Funny behaviour-like size (%s)" % size)
   153         raise Exception("Funny behaviour-like size (%s)" % size)
   150 
   154 
   151     if ((flags & SYMBOL_INSTS) != 0):
   155     if ((flags & SYMBOL_INSTS) != 0):
   152         return stx.gdb.objects.stx_libbasic.Symbol(val)
   156         return stx.gdb.objects.stx_libbasic.Symbol(val)
   155 
   159 
   156 
   160 
   157 
   161 
   158 
   162 
   159 
   163 
   160