stx/gdb/objects/__init__.py
changeset 4 ca45a88235bd
parent 2 ef575a931434
--- a/stx/gdb/objects/__init__.py	Thu Apr 09 15:03:16 2015 +0100
+++ b/stx/gdb/objects/__init__.py	Thu Apr 09 15:04:14 2015 +0100
@@ -28,22 +28,26 @@
 
     def __repr__(self):
         return self.display_string()
-    
+
     def display_string(self):
         try:
             value = self.display_value()
             klassName = '???'
-            
+
             klass = self.klass
             if klass == None:
                 klassName = '?None?'
             else:
                 klassName = klass.name
             if (value == None):
-                return "0x%08x (%s)" % ( self.address , klassName )            
+                return "0x%08x (%s)" % ( self.address , klassName )
             else:
                 return "0x%08x (%s %s)" % ( self.address , klassName , value )
         except:
+            survStartPtr = long(gdb.parse_and_eval("__survStartPtr"))
+            survEndPtr = long(gdb.parse_and_eval("__survEndPtr"))
+            if (survStartPtr <= self.address and self.address <= survEndPtr):
+                return "0x%08x (** survivor **)" % self.address
             return "0x%08x (** err **)" % self.address
 
     def display_value(self):
@@ -70,17 +74,17 @@
         '''Return size of the objects in slots (excluding header)'''
         # Not really 64bit safe...
         return (self.size_b() - 12) / 4
-    
+
     def size_b(self):
         '''Return size of the object in bytes, including header'''
-        return self._obj['o_size']                
+        return self._obj['o_size']
 
     @property
     def flags(self):
         return self._obj['o_flags']
 
 
-# Some flags defined in stc.h. 
+# Some flags defined in stc.h.
 # !!! MAKE SURE they are in sync !!!
 
 BYTEARRAY       = 1
@@ -96,20 +100,20 @@
 SLONGLONGARRAY  = 11
 #
 # reserved:       13-15
-# 
+#
 
 ARRAYMASK       = 0x0F
 
 BEHAVIOR_INSTS  = 0x0010
-FLOAT_INSTS     = 0x0020  
-BLOCK_INSTS     = 0x0040  
-METHOD_INSTS    = 0x0080  
-CONTEXT_INSTS   = 0x0100  
-BCONTEXT_INSTS  = 0x0200  
-SYMBOL_INSTS    = 0x0400  
+FLOAT_INSTS     = 0x0020
+BLOCK_INSTS     = 0x0040
+METHOD_INSTS    = 0x0080
+CONTEXT_INSTS   = 0x0100
+BCONTEXT_INSTS  = 0x0200
+SYMBOL_INSTS    = 0x0400
 
-NONOBJECT_INSTS = 0x0800  
-EXTERNALBYTES_INSTS = 0x1000 
+NONOBJECT_INSTS = 0x0800
+EXTERNALBYTES_INSTS = 0x1000
 EXTFUNC_INSTS   = 0x010000
 
 
@@ -117,34 +121,34 @@
 def create(val):
     import stx.gdb.objects.stx_libbasic
     addr = long(val)
-    
+
     # Here we should care for free/non objects
     # by comparing address agains newspace
-    # boundaries. 
+    # boundaries.
     # Well, later :-)
 
     if (addr == 0):
         return stx.gdb.objects.stx_libbasic.nil
 
     if ((addr & 1) == 1):
-        return stx.gdb.objects.stx_libbasic.SmallInteger(val)    
+        return stx.gdb.objects.stx_libbasic.SmallInteger(val)
     flags = long(val['o_class']['i_instvars'][1])
     if ((flags & 1) == 1):
         flags = flags >> 1
     else:
         raise Exception("Memory corruption? Class flags are not SmallInteger.")
-    
+
     if ((flags & BEHAVIOR_INSTS) != 0):
-        # Care for anonymous classes    
-        size = (val['o_size'] - 12) / 4 # Not 64bit safe        
+        # Care for anonymous classes
+        size = (val['o_size'] - 12) / 4 # Not 64bit safe
         if (size == 5):
             return stx.gdb.objects.stx_libbasic.Behavior(val)
         if (size == 6):
             return stx.gdb.objects.stx_libbasic.ClassDescription(val)
         if (size >= 17):
-            return stx.gdb.objects.stx_libbasic.Class(val)            
+            return stx.gdb.objects.stx_libbasic.Class(val)
         if (size >= 7):
-            return stx.gdb.objects.stx_libbasic.Metaclass(val)            
+            return stx.gdb.objects.stx_libbasic.Metaclass(val)
 
         raise Exception("Funny behaviour-like size (%s)" % size)
 
@@ -157,4 +161,3 @@
 
 
 
- 
\ No newline at end of file