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) |