5
5
from ..util import strip_quotes , log , evaluate
6
6
from ..cache import LLDBCache
7
7
8
- KOTLIN_OBJ_HEADER_TYPE = lldb .SBTypeNameSpecifier ('ObjHeader * ' , lldb .eMatchTypeNormal )
9
- KOTLIN_ARRAY_HEADER_TYPE = lldb .SBTypeNameSpecifier ('ArrayHeader * ' , lldb .eMatchTypeNormal )
8
+ KOTLIN_OBJ_HEADER_TYPE = lldb .SBTypeNameSpecifier ('ObjHeader' , lldb .eMatchTypeNormal )
9
+ KOTLIN_ARRAY_HEADER_TYPE = lldb .SBTypeNameSpecifier ('ArrayHeader' , lldb .eMatchTypeNormal )
10
10
KOTLIN_CATEGORY = 'Kotlin'
11
11
12
12
_TYPE_CONVERSION = [
55
55
]
56
56
57
57
58
+ def single_pointer (valobj : lldb .SBValue ) -> lldb .SBValue :
59
+ non_synthetic_value = valobj .GetNonSyntheticValue ()
60
+
61
+ # TODO: Test how this behaves when stopped in C++
62
+ # In case we've stopped in Swift, this will be true.
63
+ if non_synthetic_value .type .IsReferenceType ():
64
+ return non_synthetic_value
65
+
66
+ while non_synthetic_value .type .GetPointeeType ().IsPointerType ():
67
+ non_synthetic_value = non_synthetic_value .Dereference ()
68
+
69
+ if not non_synthetic_value .type .IsPointerType ():
70
+ non_synthetic_value = non_synthetic_value .AddressOf ()
71
+
72
+ return non_synthetic_value
73
+
74
+
75
+ def obj_header_pointer (valobj : lldb .SBValue ) -> lldb .SBValue :
76
+ return single_pointer (valobj ).Cast (obj_header_type ())
77
+
78
+
58
79
def get_runtime_type (variable ):
59
80
return strip_quotes (evaluate ("(char *)Konan_DebugGetTypeName({:#x})" , variable .unsigned ).summary )
60
81
61
82
62
83
def type_info_type () -> lldb .SBType :
63
84
self = LLDBCache .instance ()
64
85
if self ._type_info_type is None :
65
- self ._type_info_type = evaluate ('(TypeInfo*)0x0' ).type
86
+ self ._type_info_type = evaluate ('(TypeInfo*)0x0' ).GetNonSyntheticValue (). type
66
87
return self ._type_info_type
67
88
68
89
69
90
def obj_header_type () -> lldb .SBType :
70
91
self = LLDBCache .instance ()
71
92
if self ._obj_header_type is None :
72
- self ._obj_header_type = evaluate ('(ObjHeader*)0x0' ).type
93
+ self ._obj_header_type = evaluate ('(ObjHeader*)0x0' ).GetNonSyntheticValue (). type
73
94
return self ._obj_header_type
74
95
75
96
76
97
def array_header_type () -> lldb .SBType :
77
98
self = LLDBCache .instance ()
78
99
if self ._array_header_type is None :
79
- self ._array_header_type = evaluate ('(ArrayHeader*)0x0' ).type
100
+ self ._array_header_type = evaluate ('(ArrayHeader*)0x0' ).GetNonSyntheticValue (). type
80
101
return self ._array_header_type
81
102
82
103
@@ -96,8 +117,7 @@ def runtime_type_alignment() -> lldb.value:
96
117
return self ._runtime_type_alignment
97
118
98
119
99
- def _symbol_loaded_address (name : str , debugger : lldb .SBDebugger ) -> int :
100
- target : lldb .SBTarget = debugger .GetSelectedTarget ()
120
+ def _symbol_loaded_address (name : str , target : lldb .SBTarget ) -> int :
101
121
candidates = target .FindSymbols (name )
102
122
# take first
103
123
for candidate in candidates :
@@ -108,25 +128,37 @@ def _symbol_loaded_address(name: str, debugger: lldb.SBDebugger) -> int:
108
128
return 0
109
129
110
130
111
- def get_string_symbol_address () -> int :
131
+ def _get_konan_class_symbol_value (cls_name : str ) -> lldb .value :
132
+ target = lldb .debugger .GetSelectedTarget ()
133
+ address = _symbol_loaded_address (f'kclass:{ cls_name } ' , target )
134
+ return lldb .value (
135
+ target .CreateValueFromAddress (
136
+ cls_name ,
137
+ lldb .SBAddress (address , target ),
138
+ type_info_type (),
139
+ )
140
+ )
141
+
142
+
143
+ def get_string_symbol () -> lldb .value :
112
144
self = LLDBCache .instance ()
113
- if self ._string_symbol_addr is None :
114
- self ._string_symbol_addr = _symbol_loaded_address ( 'kclass: kotlin.String', lldb . debugger )
115
- return self ._string_symbol_addr
145
+ if self ._string_symbol_value is None :
146
+ self ._string_symbol_value = _get_konan_class_symbol_value ( ' kotlin.String' )
147
+ return self ._string_symbol_value
116
148
117
149
118
- def get_list_symbol_address () -> int :
150
+ def get_list_symbol () -> lldb . value :
119
151
self = LLDBCache .instance ()
120
- if self ._list_symbol_addr is None :
121
- self ._list_symbol_addr = _symbol_loaded_address ( 'kclass: kotlin.collections.List', lldb . debugger )
122
- return self ._list_symbol_addr
152
+ if self ._list_symbol_value is None :
153
+ self ._list_symbol_value = _get_konan_class_symbol_value ( ' kotlin.collections.List' )
154
+ return self ._list_symbol_value
123
155
124
156
125
- def get_map_symbol_address () -> int :
157
+ def get_map_symbol () -> lldb . value :
126
158
self = LLDBCache .instance ()
127
- if self ._map_symbol_addr is None :
128
- self ._map_symbol_addr = _symbol_loaded_address ( 'kclass: kotlin.collections.Map', lldb . debugger )
129
- return self ._map_symbol_addr
159
+ if self ._map_symbol_value is None :
160
+ self ._map_symbol_value = _get_konan_class_symbol_value ( ' kotlin.collections.Map' )
161
+ return self ._map_symbol_value
130
162
131
163
132
164
class KnownValueType :
0 commit comments