1
1
use crate :: debugger:: debugee:: dwarf:: r#type:: TypeIdentity ;
2
- use crate :: debugger:: variable:: SpecializedVariableIR ;
3
- use crate :: debugger:: variable:: VariableIR ;
2
+ use crate :: debugger:: variable:: { ArrayItem , VariableIR } ;
3
+ use crate :: debugger:: variable:: { Member , SpecializedVariableIR } ;
4
4
use nix:: errno:: Errno ;
5
5
use nix:: libc;
6
6
use nix:: sys:: time:: TimeSpec ;
@@ -13,29 +13,21 @@ use std::time::Duration;
13
13
14
14
pub enum ValueLayout < ' a > {
15
15
PreRendered ( Cow < ' a , str > ) ,
16
- Referential {
17
- addr : * const ( ) ,
18
- } ,
16
+ Referential ( * const ( ) ) ,
19
17
Wrapped ( & ' a VariableIR ) ,
20
- Structure {
21
- members : & ' a [ VariableIR ] ,
22
- } ,
23
- List {
24
- members : & ' a [ VariableIR ] ,
25
- indexed : bool ,
26
- } ,
18
+ Structure ( & ' a [ Member ] ) ,
19
+ IndexedList ( & ' a [ ArrayItem ] ) ,
20
+ NonIndexedList ( & ' a [ VariableIR ] ) ,
27
21
Map ( & ' a [ ( VariableIR , VariableIR ) ] ) ,
28
22
}
29
23
30
24
impl < ' a > Debug for ValueLayout < ' a > {
31
25
fn fmt ( & self , f : & mut Formatter < ' _ > ) -> std:: fmt:: Result {
32
26
match self {
33
27
ValueLayout :: PreRendered ( s) => f. debug_tuple ( "PreRendered" ) . field ( s) . finish ( ) ,
34
- ValueLayout :: Referential { addr, .. } => {
35
- f. debug_tuple ( "Referential" ) . field ( addr) . finish ( )
36
- }
28
+ ValueLayout :: Referential ( addr) => f. debug_tuple ( "Referential" ) . field ( addr) . finish ( ) ,
37
29
ValueLayout :: Wrapped ( v) => f. debug_tuple ( "Wrapped" ) . field ( v) . finish ( ) ,
38
- ValueLayout :: Structure { members } => {
30
+ ValueLayout :: Structure ( members) => {
39
31
f. debug_struct ( "Nested" ) . field ( "members" , members) . finish ( )
40
32
}
41
33
ValueLayout :: Map ( kvs) => {
@@ -45,24 +37,28 @@ impl<'a> Debug for ValueLayout<'a> {
45
37
}
46
38
list. finish ( )
47
39
}
48
- ValueLayout :: List { members, indexed } => f
49
- . debug_struct ( "List" )
50
- . field ( "members" , members)
51
- . field ( "indexed" , indexed)
52
- . finish ( ) ,
40
+ ValueLayout :: IndexedList ( items) => {
41
+ f. debug_struct ( "List" ) . field ( "items" , items) . finish ( )
42
+ }
43
+ ValueLayout :: NonIndexedList ( items) => {
44
+ f. debug_struct ( "List" ) . field ( "items" , items) . finish ( )
45
+ }
53
46
}
54
47
}
55
48
}
56
49
57
50
pub trait RenderRepr {
58
- fn name ( & self ) -> String ;
51
+ fn name ( & self ) -> Option < String > ;
59
52
fn r#type ( & self ) -> & TypeIdentity ;
60
53
fn value ( & self ) -> Option < ValueLayout > ;
61
54
}
62
55
63
56
impl RenderRepr for VariableIR {
64
- fn name ( & self ) -> String {
65
- self . identity ( ) . to_string ( )
57
+ fn name ( & self ) -> Option < String > {
58
+ self . identity ( )
59
+ . name
60
+ . is_some ( )
61
+ . then ( || self . identity ( ) . to_string ( ) )
66
62
}
67
63
68
64
fn r#type ( & self ) -> & TypeIdentity {
@@ -102,9 +98,8 @@ impl RenderRepr for VariableIR {
102
98
SpecializedVariableIR :: Instant ( _) => & original. type_ident ,
103
99
} ,
104
100
VariableIR :: Specialized { original, .. } => & original. type_ident ,
105
-
106
101
VariableIR :: Subroutine ( _) => {
107
- // currently this line is unreachable cause dereference fn pointer is forbidden
102
+ // currently this line is unreachable because dereference of fn pointer is forbidden
108
103
& UNKNOWN_TYPE
109
104
}
110
105
VariableIR :: CModifiedVariable ( v) => & v. type_ident ,
@@ -116,30 +111,25 @@ impl RenderRepr for VariableIR {
116
111
VariableIR :: Scalar ( scalar) => {
117
112
ValueLayout :: PreRendered ( Cow :: Owned ( scalar. value . as_ref ( ) ?. to_string ( ) ) )
118
113
}
119
- VariableIR :: Struct ( r#struct) => ValueLayout :: Structure {
120
- members : r#struct. members . as_ref ( ) ,
121
- } ,
122
- VariableIR :: Array ( array) => ValueLayout :: List {
123
- members : array. items . as_deref ( ) ?,
124
- indexed : true ,
125
- } ,
114
+ VariableIR :: Struct ( r#struct) => ValueLayout :: Structure ( r#struct. members . as_ref ( ) ) ,
115
+ VariableIR :: Array ( array) => ValueLayout :: IndexedList ( array. items . as_deref ( ) ?) ,
126
116
VariableIR :: CEnum ( r#enum) => {
127
117
ValueLayout :: PreRendered ( Cow :: Borrowed ( r#enum. value . as_ref ( ) ?) )
128
118
}
129
- VariableIR :: RustEnum ( r#enum) => ValueLayout :: Wrapped ( r#enum. value . as_ref ( ) ?) ,
119
+ VariableIR :: RustEnum ( r#enum) => {
120
+ let enum_val = & r#enum. value . as_ref ( ) ?. value ;
121
+ ValueLayout :: Wrapped ( enum_val)
122
+ }
130
123
VariableIR :: Pointer ( pointer) => {
131
124
let ptr = pointer. value ?;
132
- ValueLayout :: Referential { addr : ptr }
125
+ ValueLayout :: Referential ( ptr)
133
126
}
134
127
VariableIR :: Specialized {
135
128
value : Some ( spec_val) ,
136
129
..
137
130
} => match spec_val {
138
131
SpecializedVariableIR :: Vector ( vec) | SpecializedVariableIR :: VecDeque ( vec) => {
139
- ValueLayout :: List {
140
- members : vec. structure . members . as_ref ( ) ,
141
- indexed : true ,
142
- }
132
+ ValueLayout :: Structure ( vec. structure . members . as_ref ( ) )
143
133
}
144
134
SpecializedVariableIR :: String ( string) => {
145
135
ValueLayout :: PreRendered ( Cow :: Borrowed ( & string. value ) )
@@ -152,21 +142,15 @@ impl RenderRepr for VariableIR {
152
142
Some ( tls_inner_val) => tls_inner_val. value ( ) ?,
153
143
} ,
154
144
SpecializedVariableIR :: HashMap ( map) => ValueLayout :: Map ( & map. kv_items ) ,
155
- SpecializedVariableIR :: HashSet ( set) => ValueLayout :: List {
156
- members : & set. items ,
157
- indexed : false ,
158
- } ,
145
+ SpecializedVariableIR :: HashSet ( set) => ValueLayout :: NonIndexedList ( & set. items ) ,
159
146
SpecializedVariableIR :: BTreeMap ( map) => ValueLayout :: Map ( & map. kv_items ) ,
160
- SpecializedVariableIR :: BTreeSet ( set) => ValueLayout :: List {
161
- members : & set. items ,
162
- indexed : false ,
163
- } ,
147
+ SpecializedVariableIR :: BTreeSet ( set) => ValueLayout :: NonIndexedList ( & set. items ) ,
164
148
SpecializedVariableIR :: Cell ( cell) | SpecializedVariableIR :: RefCell ( cell) => {
165
149
cell. value ( ) ?
166
150
}
167
151
SpecializedVariableIR :: Rc ( ptr) | SpecializedVariableIR :: Arc ( ptr) => {
168
152
let ptr = ptr. value ?;
169
- ValueLayout :: Referential { addr : ptr }
153
+ ValueLayout :: Referential ( ptr)
170
154
}
171
155
SpecializedVariableIR :: Uuid ( bytes) => {
172
156
let uuid = uuid:: Uuid :: from_slice ( bytes) . expect ( "infallible" ) ;
@@ -192,11 +176,11 @@ impl RenderRepr for VariableIR {
192
176
ValueLayout :: PreRendered ( Cow :: Owned ( render) )
193
177
}
194
178
} ,
195
- VariableIR :: Specialized { original, .. } => ValueLayout :: Structure {
196
- members : original. members . as_ref ( ) ,
197
- } ,
179
+ VariableIR :: Specialized { original, .. } => {
180
+ ValueLayout :: Structure ( original. members . as_ref ( ) )
181
+ }
198
182
VariableIR :: Subroutine ( _) => {
199
- // currently this line is unreachable a cause dereference fn pointer is forbidden
183
+ // currently this line is unreachable because dereference of fn pointer is forbidden
200
184
return None ;
201
185
}
202
186
VariableIR :: CModifiedVariable ( v) => ValueLayout :: Wrapped ( v. value . as_ref ( ) ?) ,
0 commit comments